(60)接着注释函数 remove_from_queues (), insert_into_queues() ,管理内存缓冲块,实现了 LRU 算法,双向环链表的头部是空闲块,尾部是分配出去的忙碌块:

(61)接着涉及读取硬盘,先来看看系统是如何初始化块设备的,3-25 块设备初始化blk_dev_init,hd_init:

(62)接着介绍申请缓冲块的大函数 get_blk()以及 wait_on_buffer() :

(63)进程的为等待资源的 睡眠与唤醒,是比较神奇的事情,进程在读硬盘申请内存缓冲块时出现了 sleep_on ()函数的调用,配对的又有进程的唤醒函数 wake_up() 。给临界区资源加锁解锁时候,就用到了这两个函数:

(64)至此,系统已多次申请了公共资源,或者叫临界资源,当申请不到时,或资源不可用时进行等待,那么系统中有哪些临界资源呢:

(65) 接着介绍函数 ll_rw_block(),add_request() 为最终的读写块设备做准备。对请求的排序要求是读比写优先,并减少硬盘寻道时间:

(66)对块设备的读写请求,并非是直接的,而是经 全局 request[] 数组的限制数量后,再交给块设备去执行的。系统的设计还可以让块设备保存多个针对自己的读写请求,并依次执行。这是其中的一个函数 make_request():

(67)接着介绍真正读取硬盘数据的更底层的函数:


(68) do_hd_request 会调用更基层的函数 hd_out(), controller_ready(),然后会进入真正的读盘操作:

(69)在阅读硬盘中断函数前,先理清几个全局变量的定义 do_hd , do_floppy 。以及进程的五种状态的具体含义:

(70)接着学习一条新汇编的 intel 指令 , insw , input string word:

(71) 接着介绍硬盘中断函数 :

(72)硬盘中断函数里又调用了这几个关于硬盘读写的函数:

(73)
谢谢
3254

被折叠的 条评论
为什么被折叠?



