(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)
谢谢