[书]操作系统真象还原 -- 第10章 控制台(信号量, 锁)、键盘(环形缓冲区))

GITHUB: https://github.com/trb331617/os_elephant/tree/master/chapter_10

运行截图:

[书]操作系统真象还原 -- 第10章 控制台(信号量, 锁)、键盘(环形缓冲区))_第1张图片

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读取扫描码,识别处理后,写入键盘的环形缓冲区

代码结构:

[书]操作系统真象还原 -- 第10章 控制台(信号量, 锁)、键盘(环形缓冲区))_第2张图片

你可能感兴趣的:(c,汇编)