当前位置: 首页 > news >正文

泰安可信赖的企业建站公司长春网站建设选择星宿科技

泰安可信赖的企业建站公司,长春网站建设选择星宿科技,阜阳网站设计,公司营业执照可以做几个网站🚀 前言 本文是初始化最后一部分了,对硬盘的初始化,对应于书中的第20回。希望各位给个三连,拜托啦,这对我真的很重要!!! 目录 🚀 前言🏆块设备管理&#x1f3…

🚀 前言

    本文是初始化最后一部分了,对硬盘的初始化,对应于书中的第20回。希望各位给个三连,拜托啦,这对我真的很重要!!!

目录

  • 🚀 前言
  • 🏆块设备管理
  • 🏆块设备初始化
  • 🏆块设备读取
  • 🎯总结
  • 📖参考资料

🏆块设备管理

    关于块设备,可以参考之前的博客:linux0.11内核源码修仙传第七章——块设备请求项初始化。在内核中管理块设备采用了一个结构体blk_dev进行管理,每一个索引表示一个块设备,每一个块设备的详细含义如下注释所示:

struct blk_dev_struct blk_dev[NR_BLK_DEV] = {{ NULL, NULL },		/* 表示没有块设备,访问会返回错误或者提示无有效设备 */{ NULL, NULL },		/* 内存设备 */{ NULL, NULL },		/* 软盘设备 */{ NULL, NULL },		/* 硬盘设备 */{ NULL, NULL },		/* 特定的终端设备 */{ NULL, NULL },		/* 终端设备 */{ NULL, NULL }		/* 打印机设备 */
};

    从上面的定义可以看到,索引为3的位置(第四个)表示硬盘。这个数组里面每个成员的定义如下:

struct request {int dev;		/* -1 if no request */int cmd;		/* READ or WRITE */int errors;unsigned long sector;unsigned long nr_sectors;char * buffer;struct task_struct * waiting;struct buffer_head * bh;struct request * next;
};struct blk_dev_struct {void (*request_fn)(void);		// 处理函数struct request * current_request;	// 块设备的请求
};

    结合上面的blk_dev数组,可以发现一个有意思的事情:每个块设备执行读写请求都有自己的函数,在上层看来都是一个统一函数request_fn,具体实现各有不同,对于硬盘来说,这个实现就是do_hd_request函数。换句话说,只要初始化了所有块设备的request_fn函数指针是哪个处理函数,后面就可以直接调用对应块设备的request_fn,而无需关心具体我该调用哪个函数名字。这个就是多态思想在C语言的体现。也就是C++中的父类指针request_fn指向子类对象do_hd_request,或者Java中的父类引用指向子类对象。

🏆块设备初始化

    下面说完前置的一些信息,来看具体的初始化函数:

void hd_init(void)
{blk_dev[3].request_fn = do_hd_request;set_intr_gate(0x2E,&hd_interrupt);outb_p(inb_p(0x21)&0xfb,0x21);outb(inb_p(0xA1)&0xbf,0xA1);
}

    首先像上一节所讲的,设置了硬盘设备的request_fn 所对应的函数。之后设置了一个中断,中断号为0x2E,中断处理函数是hd_interrupt。也就是说,当硬盘发生读写时,硬盘会发出中断信号给CPU,之后CPU陷入中断处理程序。

    这里有个区分,上面设置了一个do_hd_request,下面中断设置了一个hd_interrupt。这两个函数是不一样的,上面是发送请求的函数,下面的函数是读取中断。打个比方:一个是请假的打报告阶段,一个是实际请假后休假的阶段。

    回到初始化函数里面,最后就是往IO端口上读写,作用是允许硬盘控制器发送中断请求信号

🏆块设备读取

    这里给个引子,如何读取硬盘上的数据。首先看硬盘的端口表:
在这里插入图片描述
    读硬盘就是,往除了第一个以外的后面几个端口写数据,告诉要读硬盘的哪个扇区,读多少。然后再从 0x1F0 端口一个字节一个字节的读数据。这就完成了一次硬盘读操作。更具体如下:

0x1F2 写入要读取的扇区数
0x1F3 ~ 0x1F6 这四个端口写入计算好的起始 LBA 地址
0x1F7 处写入读命令的指令号
不断检测 0x1F7 (此时已成为状态寄存器的含义)的忙位
如果第四步骤为不忙,则开始不断从 0x1F0 处读取数据到内存指定位置,直到读完

    代码的话如下所示:

static void hd_out(unsigned int drive,unsigned int nsect,unsigned int sect,unsigned int head,unsigned int cyl,unsigned int cmd,void (*intr_addr)(void))
{···port=0x1f0;outb_p(hd_info[drive].wpcom>>2,++port);	// 0x1f1,错误寄存器outb_p(nsect,++port);					// 0x1f2,扇区计数器outb_p(sect,++port);					// 0x1f3,扇区号寄存器outb_p(cyl,++port);						// 0x1f4,磁道数低8位outb_p(cyl>>8,++port);					// 0x1f5,磁道数高8位outb_p(0xA0|(drive<<4)|head,++port);	// 0x1f6,驱动器outb(cmd,++port);						// 0x1f7,命令
}

🎯总结

    到这里,初始化就都结束了,目前为止的中断如下所示:

中断号中断处理函数
0 ~ 0x10trap_init 里设置的一堆
0x20timer_interrupt
0x21keyboard_interrupt
0x80system_call
0x2Ehd_interrupt

    整个操作系统就是一个靠中断驱动的死循环而已,如果不发生任何中断,操作系统会一直在一个死循环里等待。换句话说,让操作系统工作的唯一方式,就是触发中断。


📖参考资料

[1] linux源码趣读
[2] 一个64位操作系统的设计与实现

http://www.dtcms.com/a/464685.html

相关文章:

  • 什么网站可以做模型挣钱移动服务器建设的电影网站
  • 平阳网站优化广州白云学校网站建设
  • 贵阳金阳网站建设公司百度一下免费下载
  • 柳市做网站建设图片分享功能网站开发
  • 在什么网站上做精帖网站建设 预算
  • 怎样查询网站的点击量网站加入我们页面
  • 个人网站 做啥好云主机网站的空间在哪
  • 帮别人做ppt挣钱的网站网站建设对接模版
  • 深圳设计公司招聘网站wordpress头像加载
  • 辽宁省城乡建设厅官方网站优质的企业网站
  • 学网站建设能赚钱吗兼职做设计什么网站好
  • 自己如何做家政网站在线开发培训网站建设
  • 佛山做网站的公司网站建设公司美工如何找
  • 工作室 网站手机一键生成户型图
  • 网站域名 英文孝感网站开发选优搏
  • 网站意识形态建设如何制作微信小程序店铺
  • 百度网站提交入口手机源码网
  • 网站建设维护更新iis 显示网站建设中
  • 西安网站建设联系方式少儿python基础教程
  • 搭建网站服务器平台的三种方式大一html网页制作作业
  • 做跳转链接到自己的网站诊断网站seo现状的方法
  • 公司网站做么做百度排名做垂直导购网站还行吗
  • 网站渗透鞍山seo优化
  • 虚拟网站源码无锡哪里有做网站的公司
  • 晋城市公共事业建设局网站关键词首页排名优化
  • 网站建设与管理简介最好用的网站开发软件
  • 福州免费网站建站模板想学做宝宝食谱上什么网站
  • 专业营销型网站crm 都免费了
  • 扁平化设计网站欣赏seo推广优化费用
  • 温州二井建设有限公司网站昆明汽车建站网站模板