- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
程序9-2 linux/kernel/blk_drv/hd.c
1 /*
2 * linux/kernel/hd.c
3 *
4 * (C) 1991 Linus Torvalds
5 */
6
7 /*
8 * This is the low-level hd interrupt support. It traverses the
9 * request-list, using interrupts to jump between functions. As
10 * all the functions are called within interrupts, we may not
11 * sleep. Special care is recommended.
12 *
13 * modified by Drew Eckhardt to check nr of hds from the CMOS.
14 */
/*
* 本程序是底层硬盘中断辅助程序。主要用于扫描请求项队列,使用中断
* 在函数之间跳转。由于所有的函数都是在中断里调用的,所以这些函数
* 不可以睡眠。请特别注意。
*
* 由Drew Eckhardt 修改,利用CMOS 信息检测硬盘数。
*/
15
16 #include linux/config.h // 内核配置头文件。定义键盘语言和硬盘类型(HD_TYPE)选项。
17 #include linux/sched.h // 调度程序头文件,定义任务结构task_struct、任务0 数据等。
18 #include linux/fs.h // 文件系统头文件。定义文件表结构(file、m_inode)等。
19 #include linux/kernel.h // 内核头文件。含有一些内核常用函数的原形定义。
20 #include linux/hdreg.h // 硬盘参数头文件。定义硬盘寄存器端口、状态码、分区表等信息。
21 #include asm/system.h // 系统头文件。定义设置或修改描述符/中断门等的汇编宏。
22 #include asm/io.h // io 头文件。定义硬件端口输入/输出宏汇编语句。
23 #include asm/segment.h // 段操作头文件。定义了有关段寄存器操作的嵌入式汇编函数。
24
// 定义硬盘主设备号符号常数。在驱动程序中,主设备号必须在包含blk.h 文件之前被定义。
// 因为blk.h 文件中要用到这个符号常数值来确定一些列其他相关符号常数和宏。
25 #define MAJOR_NR 3 // 硬盘主设备号是3。
26 #include blk.h // 块设备头文件。定义请求数据结构、块设备数据结构和宏等信息。
27
// 读CMOS 参数宏函数。
// 这段宏读取CMOS 中硬盘信息。outb_p、inb_p 是include/asm/io.h 中定义的端口输入输出宏。
// 与init/main.c 中读取CMOS 时钟信息的宏完全一样。
28 #define CMOS_READ (addr) ({ \
29 outb_p (0x80|addr,0x70); \ // 0x70 是写端口号,0x80|addr 是要读的CMOS 内存地址。
30 inb_p(0x71); \ // 0x71 是读端口号。
31 })
32
33 /* Max read/write errors/sector */
/* 每扇区读/写操作允许的最多出错次数 */
34 #define MAX_ERRORS 7 // 读/写一个扇区时允许的最多出错次数。
35 #define MAX_HD 2 // 系统支持的最多硬盘数。
36
// 重新校正处理函数。
// 复位操作时在硬盘中断处理程序中调用的重新校正函数(311行)。
37 static void recal_intr (void);
// 读写硬盘失败处理调用函数。
// 结束本次请求项处理或者设置复位标志要求执行复位硬盘控制器操作后再重试(242 行)。
38 stat
文档评论(0)