[書]操作系統真象還原 -- 第10章 mbr、loader、內核(中斷、內核內存管理、內核線程及線程調度、控制檯(信號量, 鎖)、鍵盤(環形緩衝區))

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讀取掃描碼,識別處理後,寫入鍵盤的環形緩衝區

代碼結構:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章