Linux内核解析:硬盘参数与设备管理

需积分: 1 0 下载量 63 浏览量 更新于2024-08-22 收藏 468KB PPT 举报
"硬盘参数表在Linux内核中扮演着至关重要的角色,这些参数由BIOS调用读取并在特定物理地址存储。Linux通过主设备号和次设备号来识别和区分不同的硬件设备,其中主设备号标识设备类型,次设备号标识同类设备中的具体实例。在设备管理中,块设备操作包括读写流程,涉及缓冲区管理和设备中断处理。在读处理过程中,如果数据已缓冲则直接返回,否则向设备发送读请求,等待中断处理将数据从控制器缓冲区读入内存。写处理过程类似,但涉及数据的回写和设备的写命令。设备请求结构体包含了逻辑设备号、命令、扇区位置、数量、数据缓冲区指针以及等待进程的相关信息。" 在Linux内核中,硬盘参数的获取是在系统启动阶段由`setup.s`这个汇编语言初始化脚本完成的。BIOS调用会读取硬盘信息并存储在物理内存的特定位置,例如第1块硬盘的参数存放在0x90080,第2块硬盘在0x90090。这些参数对于后续的设备驱动操作至关重要,因为它们定义了如何与硬件进行通信。 设备管理是Linux内核的一个核心部分,它负责处理设备的I/O请求。在读取块设备数据时,如硬盘,进程首先会向缓冲区模块请求数据。如果数据已经存在于缓冲区中,那么直接返回;否则,缓冲区模块会向设备管理模块发起读请求。如果设备当前未被占用,那么内核会向硬盘发送读命令,否则请求会被放入设备的请求队列等待处理。当数据读取完成后,设备控制器会产生中断,中断处理程序将数据从控制器的缓冲区移动到内存的缓冲区,并唤醒等待的进程。 写处理过程与读取类似,但是涉及到了数据的回写。如果缓冲区中的数据需要写回到硬盘,缓冲区模块会向设备管理模块发出写请求。写请求也会经历类似的过程:设备不忙时直接发送命令和数据,设备忙时则放入请求队列。写入完成后,设备控制器产生中断,中断处理程序唤醒等待的进程。 在Linux中,设备是通过主设备号和次设备号来唯一标识的。主设备号用来区分不同类型设备,例如硬盘、磁带等;次设备号则用于区分同一类型的多个设备实例,比如IDE接口上的两个硬盘。逻辑设备号是由主设备号左移8位后与次设备号相加得到,方便编程时的引用。 块设备请求结构体`struct request`是内核处理I/O请求的关键数据结构,它包含了如下的关键字段: 1. `dev`: 逻辑设备号,标识请求针对哪个设备。 2. `cmd`: 请求的命令,比如读、写操作。 3. `errors`: 记录错误次数,超过一定阈值可能需要重置设备。 4. `sector`: 要读写的数据起始扇区位置。 5. `nr_sectors`: 需要读写的数据扇区数量。 6. `buffer`: 数据缓冲区的指针,用于存放读取或写入的数据。 7. `waiting`: 等待请求完成的进程链表。 8. `bh`: 缓冲区头指针,指向实际的数据缓冲区。 9. `next`: 同一设备的下一个请求指针,用于构建请求队列。 Linux内核通过精心设计的数据结构和流程管理,高效地处理了块设备的I/O请求,确保了系统对硬件资源的有效利用和调度。了解这些细节对于理解Linux内核的工作原理和优化设备性能具有重要意义。