冬天OS(二十六):完善硬盘的驱动程序
--------------------------------------------------------
完善硬盘驱动程序
--------------------------------------------------------
上节我们的驱动程序只有一个简单的 identify 功能(基于的是 CHS 寻址),这节我们完善驱动程序,并且基于 LBA 寻址!
·枚举
#define CNT u.m3.m3i2
#define REQUEST u.m3.m3i2
#define PROC_NR u.m3.m3i3
#define DEVICE u.m3.m3i4
#define POSITION u.m3.m3l1
#define BUF u.m3.m3p2
—— POSITION 和 REQUEST 不同时使用!
· hd_ioctl 函数
PRIVATE void hd_ioctl(MESSAGE *p)
{int device = p->DEVICE;int drive = DRV_OF_DEV(device);struct hd_info *hdi = &hd_info[drive];if (p->REQUEST == DIOCTL_GET_GEO){void *dst = va2la(p->PROC_NR, p->BUF);void *src = va2la(TASK_HD,device < MAX_PRIM ? &hdi->primary[device] : &hdi->logical[(device - MINOR_hd1a) % NR_SUB_PER_DRIVE]);phys_copy(dst, src, sizeof(struct part_info));}elseassert(0);
}
——当请求者发送 p->type 等于 DEV_IOCTL 的时候,还要在 DEV_IOCTL 服务里进一步指明具体的服务(由 p->REQUEST 指明)!
·hd_rdwt
PRIVATE void hd_rdwt(MESSAGE *p)
{int drive = DRV_OF_DEV(p->DEVICE);u64 pos = p->POSITION;assert((pos >> SECTOR_SIZE_SHIFT) < (1 << 31));/*** We only allow to R/W from a SECTOR boundary:*/assert((pos & 0x1FF) == 0);// p->POSITION 求得扇区号u32 sect_nr = (u32)(pos >> SECTOR_SIZE_SHIFT); /* pos / SECTOR_SIZE */// 第几个逻辑扇区,这里是第 16 个int logidx = (p->DEVICE - MINOR_hd1a) % NR_SUB_PER_DRIVE;// 根据请求的扇区位于哪一个分区,加等于这个分区的起始 LBAsect_nr += p->DEVICE < MAX_PRIM ? hd_info[drive].primary[p->DEVICE].base : hd_info[drive].logical[logidx].base;struct hd_cmd cmd;cmd.features = 0;// 读取几个扇区cmd.count = (p->CNT + SECTOR_SIZE - 1) / SECTOR_SIZE;cmd.lba_low = sect_nr & 0xFF;cmd.lba_mid = (sect_nr >> 8) & 0xFF;cmd.lba_high = (sect_nr >> 16) & 0xFF;cmd.device = MAKE_DEVICE_REG(1, drive, (sect_nr >> 24) & 0xF);// 读/写 的行为在这里决定cmd.command = (p->type == DEV_READ) ? ATA_READ : ATA_WRITE;hd_cmd_out(&cmd);int bytes_left = p->CNT;// 请求者的缓冲区void *la = (void *)va2la(p->PROC_NR, p->BUF);while (bytes_left){int bytes = min(SECTOR_SIZE, bytes_left);if (p->type == DEV_READ){interrupt_wait();port_read(REG_DATA, hdbuf, SECTOR_SIZE);// 这里 p->BUF 的地址是相对于请求者的段基址的,所以需要求出物理地址// 但 hdbuf 并不需要!还有,这里可以直接读到 la 中,不需要额外拷贝!phys_copy(la, (void *)va2la(TASK_HD, hdbuf), bytes);}else{if (!waitfor(STATUS_DRQ, STATUS_DRQ, HD_TIMEOUT))panic("hd writing error.");port_write(REG_DATA, la, bytes);interrupt_wait();}bytes_left -= SECTOR_SIZE;la += SECTOR_SIZE;}
}
1,读和写都是 512 字节对齐的
2,因为满足 512 字节对齐的原因,所以在索取的时候和索取到了使用之前都要做处理!
·hd_close 函数
PRIVATE void hd_close(int device)
{int drive = DRV_OF_DEV(device);assert(drive == 0); /* only one drive */hd_info[drive].open_cnt--;
}
·task_fs 函数
PUBLIC void task_fs()
{printl("Task FS begins.\n");/* open the device: hard disk */MESSAGE driver_msg;driver_msg.type = DEV_OPEN;driver_msg.DEVICE = MINOR(ROOT_DEV);assert(dd_map[MAJOR(ROOT_DEV)].driver_nr != INVALID_DRIVER);send_recv(BOTH, dd_map[MAJOR(ROOT_DEV)].driver_nr, &driver_msg);struct part_info _tempBuf;driver_msg.type = DEV_IOCTL;driver_msg.DEVICE = MINOR(ROOT_DEV);driver_msg.REQUEST = DIOCTL_GET_GEO;driver_msg.BUF = (void *)&_tempBuf;send_recv(BOTH, dd_map[MAJOR(ROOT_DEV)].driver_nr, &driver_msg);printf("Tinix's partition's Base address is [ 0X%d ]\n",_tempBuf.base);printf("Tinix's partition's Size is [ 0x%d ]\n",_tempBuf.size);spin("FS");
}
运行:
——有了 read/write 之后我们的驱动程序就算可以用了,详细驱动程序的建立过程,可以体会到微内核的魅力!
冬天OS(二十六):完善硬盘的驱动程序相关推荐
- 2021年大数据Hadoop(二十六):YARN三大组件介绍
全网最详细的Hadoop文章系列,强烈建议收藏加关注! 后面更新文章都会列出历史文章目录,帮助大家回顾知识重点. 目录 本系列历史文章 前言 Yarn三大组件介绍 ResourceManager No ...
- 无人驾驶汽车系统入门(二十六)——基于深度学习的实时激光雷达点云目标检测及ROS实现
无人驾驶汽车系统入门(二十六)--基于深度学习的实时激光雷达点云目标检测及ROS实现 在前两篇文章中,我们使用PCL实现了在点云中对地面的过滤和点云的分割聚类,通常来说,在这两步以后我们将对分割出来的 ...
- (转)tensorflow入门教程(二十六)人脸识别(上)
https://blog.csdn.net/rookie_wei/article/details/81676177 1.概述 查看全文 http://www.taodudu.cc/news/show- ...
- NGS接龙丨中科院北京基因组所胡松年:测序相伴二十六年,解读“添麻烦”的NGS...
生物信息学习的正确姿势 NGS系列文章包括NGS基础.高颜值在线绘图和分析.转录组分析 (Nature重磅综述|关于RNA-seq你想知道的全在这).ChIP-seq分析 (ChIP-seq基本分析流 ...
- SpringBoot入门建站全系列(二十六)Mongodb非关系型数据库的使用
SpringBoot入门建站全系列(二十六)Mongodb非关系型数据库的使用 一.概述 MongoDB 是一个基于分布式文件存储的数据库.由 C++ 语言编写.旨在为 WEB 应用提供可扩展的高性能 ...
- 黑猫互联云计算机,黑猫评测 篇二十六:解决联想轻薄本痛点,3TB性价比NAS方案,联想个人云存储A1评测...
黑猫评测 篇二十六:解决联想轻薄本痛点,3TB性价比NAS方案,联想个人云存储A1评测 2020-09-16 13:34:46 5点赞 10收藏 4评论 联想小新Pro 13的痛点,终于找到了完美的解 ...
- 电脑高手应用技巧荟萃(电脑知识二十六)
电脑高手应用技巧荟萃(电脑知识二十六) 2010年12月07日 ★"锁定计算机"快捷方式 我想在桌面上创建一个"锁定计算机"的快捷方式,请问应该如何实现呢? 首 ...
- 模板方法模式 Template method 行为型 设计模式(二十六)
模板方法模式 Template method 上图为网上百度的一份简历模板截图 相信大家都有求职的经历,那么必然需要简历,写简历的时候,很可能你会网上检索一份简历模板,使用此模板的格式,然后替换为你的 ...
- 窗口消息——Windows核心编程学习手札之二十六
窗口消息 --Windows核心编程学习手札之二十六 Windows允许一个进程至多建立10000个不同类型的用户对象(user object):图符.光标.窗口类.菜单.加速键表等,当一个线程调用一 ...
- OpenCV学习笔记(二十六)——小试SVM算法ml OpenCV学习笔记(二十七)——基于级联分类器的目标检测objdect OpenCV学习笔记(二十八)——光流法对运动目标跟踪Video Ope
OpenCV学习笔记(二十六)--小试SVM算法ml 总感觉自己停留在码农的初级阶段,要想更上一层,就得静下心来,好好研究一下算法的东西.OpenCV作为一个计算机视觉的开源库,肯定不会只停留在数字图 ...
最新文章
- postfix和dovecot服务异常,重启服务后又会自动停掉的解决办法
- spring IOC 之篇三:默认标签的解析
- 下拉刷新:继承listView控件
- django-一对一关系
- Android渠道打包技术小结
- 数字图像处理(一)——彩色图像基础
- Arduino编译bootloader
- POJ2155 Matrix
- mysql文章列表_MySQL-分享文章列表 - Su的博客
- 批量生成横断面_批量生动生成填充图案的边界线
- word打开html是空白,网页复制到Word之后或者出现空白或者格式变乱该怎么办
- Namenode处于安全模式时,对hadoop进行查看操作,edits_inprogress_txid中没有事物事件的增加,txid没有增加?
- html中图片旋转木马,css3的图片3D旋转图片旋转木马
- 泰克示波器3系MDO再次升级,使EMI测试不再求人
- 电话线配线架是110配线架吗?电话线配线架的接法详细介绍
- 解决可以上QQ,但是无法上网的问题
- [label][WorldPress] 一个很方便查找定位WorldPress源代码位置的网址
- Swift UILabel 数字动画效果
- 机器人测钢卷直径_机器人热轧钢卷喷号漆
- DMHS DM8到Oracle12c PDB双向同步(大小不敏感+落地文件转发)