基于linux底层硬盘中断辅助代码的分析与设计.doc

约16页DOC格式手机打开展开

基于linux底层硬盘中断辅助代码的分析与设计,基于linux底层硬盘中断辅助代码的分析与设计页数:16字数:9468基于linux底层硬盘中断辅助代码的分析与设计【摘要】: 本文对linux早期操作系统内核(0.11)的部分代码——底层硬盘中断辅助程序进行了详细全面的分析,对的linux设备管理部分内核源代码和工作原理进行了解剖,并在分析后,作者进行了相类似程序设...
编号:10-68134大小:220.00K
分类: 论文>其他论文

内容介绍

此文档由会员 usactu 发布

基于Linux底层硬盘中断辅助代码的分析与设计


页数:16 字数:9468

基于Linux底层硬盘中断辅助代码的分析与设计
【摘要】: 本文对Linux早期操作系统内核(0.11)的部分代码——底层硬盘中断辅助程序进行了详细全面的分析,对的Linux设备管理部分内核源代码和工作原理进行了解剖,并在分析后,作者进行了相类似程序设计——虚拟盘设计,从而进一步对操作系统的基本功能和实际实现方式获得全方位的理解。
【关键字】: 底层硬盘 虚拟盘 驱动器 中断 分区表 磁盘超级块

1 前言
本文对Linux早期操作系统内核(0.11)的部分代码文件进行了详细全面的分析,并在分析后,作者进行了相应程序设计,是一篇有关Linux(0.11)操作系统部分内核基本工作原理的文章,主要目标是使用尽量少的篇幅,对部分的Linux内核源代码进行解剖,对操作系统的基本功能和实际实现方式获得全方位的理解。能够在仅可能短的时间内做到对linux内核代码和基本工作原理有一个深刻的理解,使内核的整体运作结构能清晰地在脑海中形成。
在对早期部分内核源代码的分析过程中,作者已经发现,早期内核源代码几乎就是目前所使用的较新内核的一个精简版本。通过阅读Linux早期内核版本的源代码,是学习Linux系统的一种行之有效的途径,并且对研究和应用Linux嵌入式系统也有很大的帮助。所以,作者通过对大量内核版本进行比较和选择后,最终选择了与目前Linux内核基本功能较为相近,又非常短小的0.11版内核作为分析与设计的最佳版本,并且选择了底层硬盘中断辅助程序作为作者分析的对象,又根据相类似的原理,作者又进行了虚拟盘的设计。

2 底层硬盘中断辅助源代码及部分语句分析
#include
#include
#include
#include
#include
#include
#include
#include
#include "blk.h"
#define MAJOR_NR 3
#define CMOS_READ(addr)
({outb_p(0x80|addr,0x70);
inb_p(0x71);})
#define MAX_ERRORS 7
#define MAX_HD 2
static void recal_intr(void); // 硬盘中断程序在复位操作时会调用的重新校正函数。
static int recalibrate=1; // 重新校正标志。
static int reset=1; // 复位标志。
/*下面结构定义了硬盘参数及类型*/
struct hd_i_struct
{int head,sect,cyl,wpcom,lzone,ctl;};
#ifdef HD_TYPE // 如果已经在include/linux/config.h 中定义了HD_TYPE…
struct hd_i_struct hd_info[]={ HD_TYPE }; // 取定义好的参数作为hd_info[]的数据。
#define NR_HD ((sizeof(hd_info))/(sizeof(struct hd_i_struct))) // 计算硬盘数。
#else // 否则,都设为0值。
struct hd_i_struct hd_info[]={{0,0,0,0,0,0},{0,0,0,0,0,0}};
static int NR_HD=0;
#endif
static struct hd_struct
{long start_sect;
long nr_sects;}hd[5*MAX_HD]={{0,0},};
#define port_read(port,buf,nr)
__asm__("cld;rep;insw"::"d"(port),"D"(buf),"c"(nr):"cx","di")
#define port_write(port,buf,nr)
__asm__("cld;rep;outsw"::"d"(port),"S"(buf),"c"(nr):"cx","si")
extern void hd_interrupt(void);
extern void rd_load(void);
-------------------------------------------------------------------------------
/*下面该函数只在初始化时被调用一次。用静态变量callable作为可调用标志。*/
// 该函数的参数由初始化程序init/main.c的init子程序设置为指向0x90080处,此处存放着setup.s程序从BIOS取得的2个硬盘的基本参数表(32字节)。
// 本函数主要功能是读取CMOS和硬盘参数表信息,用于设置硬盘分区结构hd,并加载RAM虚拟盘和根文件系统。
int sys_setup(void * BIOS)
{static int callable=1;
int i,drive;
unsigned char cmos_disks;
struct partition *p;
struct buffer_h