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

16 篇文章 2 订阅

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

代码结构:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值