模拟Linus Torvalds:从头开始创建自己的操作系统(VIII)

我们返回有关如何创建自己的操作系统的系列教程。 我想您会非常喜欢本章,因为我们最终可以与我们的操作系统进行交互。 今天,我们将阅读键盘输入。 为此,该方案类似于计时器的方案。 无论如何,我们都必须使用IRQ,因此我们将与计时器一样开始。

ND_IRQ_InstallHandler(1,和ND_Keyboard_Handler);

但是,我们的键盘处理程序要复杂一些,因为我们正在读取按键并将其存放在缓冲区中。

extern“ C” void ND_Keyboard_Handler(struct regs * r){unsigned char scancode = ND :: Keyboard :: GetChar(); if(scancode!= 255){ND ::屏幕:: PutChar(scancode); stringBuffer [stringPos] =扫描码; stringPos ++; }}

http://gist.github.com/634afddcb3e977ea202d

我们可以检查一下如何调用名为ND :: Keyboard :: GetChar的函数。 在那里我们获得了字符,然后如果它不是一个空字符(在这里我使用了255,我们将不得不使用一个更好的系统),我们将该字符放在屏幕上,并将其存储在简单的char缓冲区中(这也是易于改进,当前系统可能会溢出)。

nsigned char ND ::键盘:: GetChar(){unsigned char scancode; scancode =(unsigned char)ND ::端口:: InputB(0x60); 如果(scancode和ND_KEYBOARD_KEY_RELEASE){返回255; } else {返回en_US [scancode]; }} char * ND ::键盘:: GetString(){while(stringBuffer [stringPos-1]!='\ n'){} stringPos = 0; 返回stringBuffer; }

http://gist.github.com/2d4f13e0b1a281c66884

在这里,我们可以看到如何获得已按下的键。 在0x60处,总是会按下最后一个键。 实际上,可以直接读取它,而不必使用IRQ,但是,我们将不知道如何识别何时发生更改。 在那里,我们使用AND操作检查我们获得的代码是否对应于已释放的密钥。

在这种情况下,我们返回255(因为稍后将忽略它),否则按下了该键。 在这种情况下,我们返回称为en_US的数组的位置。 该数组包含哪些信息? 这个数组就是我们所谓的键盘映射或字符映射。 如您所知,不同的语言具有不同的键盘,并且不支持它们,因为它们会覆盖按键。 因此,en_US将为我们提供与每个代码相对应的键,并且可以在美国键盘上使用。

unsigned char en_US [128] = {0,27,'1','2','3','4','5','6','7','8','9','0 ','-','=','\ b','\ t','q','w','e','r','t','y','u','i ','o','p','[',']','\ n',0,/ * Ctrl * /'a','s','d','f','g', 'h','j','k','l',';','\'',''',0,/ *左移* /'\\','z','x', 'c','v','b','n','m',',','。','/',0,/ *右移* /'*',0,/ * Alt * /'',0,/ *大写锁定* / 0,0,0,0,0,0,0,0,0,0,/ * F1-F10键* / 0,/ *数字锁定* / 0, / *滚动锁定* / 0,/ *主页键* / 0,/ *向上箭头* / 0,/ *页面向上* /'-',0,/ *左箭头* / 0,0,/ *右箭头* /'+',0,/ *结束键* / 0,/ *向下箭头* / 0,/ *向下翻页* / 0,/ *插入键* / 0,/ *删除键* / 0,0,0, 0,0,11,/ * F12-F0键* / XNUMX};

http://gist.github.com/bf52085aec05f3070b65

还有一个定义的函数,带有一个短语。 目的只是为了更轻松地从需要它的应用程序(目前只有一个)访问字符串。 我说的是NextShellLite,它是NextDivel可能的未来Shell的简化版本。 NextShellLite的目的仅仅是提供一种精简的外壳,以逐步测试新功能。 我不会将shell代码放在这里,而是将其包含在NextDivel代码中。

目前,它不能作为单独的程序运行,而是作为内核调用的函数运行,主要是因为我们尚未添加运行可执行程序的选项。 当然,还有一些有关外壳如何与新的键盘输入功能一起工作的图片。

下一个ShellLite


在 Google 中将其添加为首选来源