我們將返回有關如何創建自己的操作系統的系列教程。 我想您會非常喜歡本章,因為我們最終可以與我們的操作系統進行交互。 今天,我們將閱讀鍵盤輸入。 為此,該方案類似於計時器的方案。 無論如何,我們都必須使用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); if(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代碼中。
目前,它不能作為單獨的程序運行,而是作為內核調用的函數運行,主要是因為我們尚未添加運行可執行程序的選項。 當然,還有一些有關外殼如何與新的鍵盤輸入功能一起工作的圖片。
優秀的導師! 謝謝🙂
事實是,我從未遵循過該教程,因為在第一部分中,它在嘗試編譯時給了我一個錯誤,但我不記得它是什麼錯誤
對不起,我無知...這些代碼是從哪裡寫的? 從終端??
這些代碼是源代碼的一部分。 我沒有把它完整,因為否則該帖子全是代碼,沒有任何解釋。 我建議您從頭開始閱讀這些教程。 您也可以在此處查看完整的源代碼(http://github.com/AdrianArroyoCalle/next-divel)
如何改善以免發生溢出?
凱蒂,您檢查存儲庫代碼了嗎? 在那裡建立了最大大小以及控制它的功能,在那裡您可以更改大小或實現合理的方式來使緩衝區飽和時釋放緩衝區
我留下鏈接供您檢查 https://github.com/AdrianArroyoCalle/next-divel/blob/master/src/start/ND_Keyboard.cpp
您好,非常有趣,您要繼續進行“模擬Linus Torvals”的“系列”嗎?
您能推薦任何書籍,信息這樣的內核嗎?
您好!
你好感謝您的教程。 拜託,您能推荐一本不是Tanenbaum撰寫的“操作系統”的書嗎? 提前非常感謝您。
問候。