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

好用的软件下载网站各大网站收录查询

好用的软件下载网站,各大网站收录查询,杭州网站建设faxide,教你如何用天翼云盘做网站🚀 前言 本文是初始化最后一部分了,对硬盘的初始化,对应于书中的第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/wzjs/277611.html

相关文章:

  • 百度云盘做网站空间seo推广思路
  • 吉林省四平市网站建设谷歌seo网站推广怎么做优化
  • 什么网站帮人做网页东莞做网站哪个公司好
  • 网页设计宣传推广方案网站关键词排名优化
  • 万柏林网站建设优化方案模板
  • 新闻网站页面的设计与制作公司网址
  • 用html5做的网站源码上首页seo
  • 腾讯的网站是谁做的互联网去哪里学
  • 网站 文件注入代做百度收录排名
  • 标准型网站建设开发市场seo是什么意思
  • 外贸网站定制开发网络营销主要学什么
  • h5制作网站 有哪些济南专业做网站
  • 网站开发er图海南快速seo排名优化
  • 西安建设学院网站首页超级seo外链工具
  • wordpress 大前端2.0seo专业培训中心
  • 做那个网站比较好淘宝指数官网
  • 做网站时空间的选择太原做网站哪家好
  • app 展示网站网页设计与制作知识点
  • 计算机网站设计论文求购买链接
  • 重庆网站制作一般需要多少钱广告联盟论坛
  • 做app还是做网站合适今日新闻消息
  • wordpress 相关产品郑州网络seo公司
  • 网站开发的五个阶段营销宣传策划方案
  • 昆山那个网站推广好短视频seo厂家
  • 河间做网站 申梦网络十大最靠谱教育培训机构
  • 白家乐网站怎么建站网站建设网站推广
  • 石桥铺做网站长沙seo排名优化公司
  • 阿里云的网站建设好不好百度投诉中心24人工客服
  • 做网站没有公网100个裂变营销案例
  • 网站结构图怎么做怎么免费搭建自己的网站