CPU如何讀取鍵盤傳過來的資料 OS

2021-10-06 05:54:20 字數 2346 閱讀 4630

鍵盤是如何與作業系統互動的?

在顯示器那一節,我們說過,cpu使用外設就是向外設寫入一條指令,然後中斷處理,中斷處理就在鍵盤這一篇裡,我們每按下一次鍵盤,就相當與向cpu發起一次中斷

我們從鍵盤中斷開始,看一下鍵盤中斷的初始化

void con_init(void)

//在kernel/chr_drv/keyboard.s中

.global _keyboard_interrupt

_keyboard_interrupt:

inb $0x60, %al

//從埠0x60讀掃瞄碼,inb表示讀入乙個位元組,掃瞄碼(每乙個按鍵對應乙個碼)

call key_table(,%eax,4) //呼叫keyboard+eax*4,根據不同的按鍵呼叫不同的函式

...push $0

call _do_tty_interrupt

處理掃瞄碼key_table+eax*4key_table是乙個函式陣列

在kernel/chr_drv/keyboard.s中

key_table:

.long none,do_self,so_self,do_self //掃瞄碼00-03

.long do_self,...,func,scroll,cursor 等

mode: .byte 0

do_self:

lea alt_map, %ebx

testb $0x20, mode //alt鍵是否同時按下 jne 1f

lea shift_map, %ebx testb $0x03, mode jne 1f

lea key_map, %ebx

1:

從key_map中取出ascll碼

#if defined(kbd_us)

key_mpa: .byte 0, 27 .ascll "1234567890-=" ...

shift_map: .byte 0, 27 .ascll "!@#$%^&*()_+" ...

#elif defined(kbd_gr) ...

回到do_self函式,從1f開始,ebx存放的是map的起始位址

1:  movb (%ebx,%eax), %al  //掃瞄碼索引,ascll碼->al

orb %al, %al je none //找不到對應的ascll碼

testb $0x4c, mode //看caps是否亮

je 2f capb $'a,%al jb 2f

cmpb $'}, %al ja 2f subb $32, %al //變大寫

2: testb %??, mode //處理其他模式,如ctr1同時按下

3: andl $0xff, %eax call_put_queue

none:ret

do_self函式得到ascll碼後就要把它放入緩衝佇列中,等待cpu讀取

put_queue:

movl _table_list, %edx //得到佇列

movl head(%edx), %ecx //取出佇列頭部位置

1: movb %al,buf(%edx,%ecx) //將鍵盤輸入的ascll碼放入佇列的頭部

struct tty_queue *table_list=;

上面已經成功將ascll碼放入佇列中,接下只要等待cpu讀取並處理就可以了,但是還還要實現回顯回顯:將鍵盤輸入的顯示到螢幕上,其實就是上節的內容,只要將輸入的字元放入write_q佇列中,就可以了

void do_tty_interrupt(int tty)

void copy_to_cooked(struct tty_struct *tty)

putch(c,tty->secondary);

...wake_up(&tty->secondary.proc_list);

}

我們重新回顧一下作業系統是如何讓cpu使用外設的

可以看到,這實際上就是乙個檔案系統,用檔案系統形成統一介面,讓外設工作起來。

可以看一下配套的實驗按下f12使輸出全部變成*號

vue 改造後端傳過來的資料

最近做專案的時候遇到乙個問題,就是ant design vue元件引用穿梭框的時候,穿梭框元件需要有key,而後端傳過來的資料沒有key這個字段 我之前看ant design vue官網中有這樣的解決方案 按照 vue 最新的規範,所有的元件陣列最好繫結 key。在 transfer 中,datas...

前端的ueditor如何獲取從後台傳過來的資料

前端的ueditor獲取從後台傳過來的值使用setcontent 方法,但若是在例項化了ueditor之後直接使用setcontent 方法會出現報錯 等ueditor建立完再呼叫它的方法,可以在使用的地方加乙個 如下 var ue ue.geteditor container ue.addlist...

ajax接收action傳過來的json資料

先把需要的包加進來,在上篇裡 下面是實現 先記錄下 這裡不知道為什麼傳過來的json資料要經過兩次 eval 解析才可以讀出來,弄了一下午,網上都 是jquery的實現,感覺用這個的很少,幾乎沒有,這裡我傳了個json字串給ajax,然後解析出來,可以得到user物件,即 jsonobj.user ...