GITHUB: https://github.com/trb331617/os_elephant/tree/master/chapter_10
運行截圖:
1、控制檯console
// FILE: thread/sync.c
/* 信號量結構 */
struct semaphore{
unsigned char value;
struct list waiters; // 此信號量上等待(阻塞)的所有線程
};
/* 鎖結構 */
// 鎖是基於信號量實現的,因此鎖結構中必須包含一個信號量成員
struct lock{
struct task_struct *holder; // 鎖的持有者
struct semaphore semaphore; // 用二元信號量實現鎖
// 每個鎖對應的信號量都會有一個阻塞隊列
unsigned int holder_repeat_number; // 鎖的持有者重複申請鎖的次數
};
鎖lock:基於二元信號量semaphore實現的鎖,每個鎖對應的信號量都會有一個阻塞隊列
結合鎖機制,對print族函數加了層封裝
2、鍵盤keyboard
// FILE: device/ioqueue.h
/* 環形隊列 */
struct ioqueue{
// 生產者消費者問題
// 每次對緩衝區操作都要先申請這個鎖,從而保證緩衝區操作互斥
struct lock lock;
// 生產者,緩衝區不滿時就生產數據,否則就睡眠
// 消費者,緩衝區不空時就消費數據,否則就睡眠
struct task_struct *producer, *consumer; // 睡眠的生產者/消費者
char buf[buffersize]; // 緩衝區大小
signed int head, tail; // 隊首寫入, 隊尾讀出
};
環形緩衝區隊列:結合鎖機制、生產者消費者模型
鍵盤上8048芯片 -> 主板上8042芯片 -> 中斷代理8259A
鍵盤的中斷處理程序:從輸出緩衝區寄存器端口0x60讀取掃描碼,識別處理後,寫入鍵盤的環形緩衝區
代碼結構: