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