--------------------------------------------------------

完善硬盘驱动程序

--------------------------------------------------------

上节我们的驱动程序只有一个简单的 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(二十六):完善硬盘的驱动程序相关推荐

  1. 2021年大数据Hadoop(二十六):YARN三大组件介绍

    全网最详细的Hadoop文章系列,强烈建议收藏加关注! 后面更新文章都会列出历史文章目录,帮助大家回顾知识重点. 目录 本系列历史文章 前言 Yarn三大组件介绍 ResourceManager No ...

  2. 无人驾驶汽车系统入门(二十六)——基于深度学习的实时激光雷达点云目标检测及ROS实现

    无人驾驶汽车系统入门(二十六)--基于深度学习的实时激光雷达点云目标检测及ROS实现 在前两篇文章中,我们使用PCL实现了在点云中对地面的过滤和点云的分割聚类,通常来说,在这两步以后我们将对分割出来的 ...

  3. (转)tensorflow入门教程(二十六)人脸识别(上)

    https://blog.csdn.net/rookie_wei/article/details/81676177 1.概述 查看全文 http://www.taodudu.cc/news/show- ...

  4. NGS接龙丨中科院北京基因组所胡松年:测序相伴二十六年,解读“添麻烦”的NGS...

    生物信息学习的正确姿势 NGS系列文章包括NGS基础.高颜值在线绘图和分析.转录组分析 (Nature重磅综述|关于RNA-seq你想知道的全在这).ChIP-seq分析 (ChIP-seq基本分析流 ...

  5. SpringBoot入门建站全系列(二十六)Mongodb非关系型数据库的使用

    SpringBoot入门建站全系列(二十六)Mongodb非关系型数据库的使用 一.概述 MongoDB 是一个基于分布式文件存储的数据库.由 C++ 语言编写.旨在为 WEB 应用提供可扩展的高性能 ...

  6. 黑猫互联云计算机,黑猫评测 篇二十六:解决联想轻薄本痛点,3TB性价比NAS方案,联想个人云存储A1评测...

    黑猫评测 篇二十六:解决联想轻薄本痛点,3TB性价比NAS方案,联想个人云存储A1评测 2020-09-16 13:34:46 5点赞 10收藏 4评论 联想小新Pro 13的痛点,终于找到了完美的解 ...

  7. 电脑高手应用技巧荟萃(电脑知识二十六)

    电脑高手应用技巧荟萃(电脑知识二十六) 2010年12月07日 ★"锁定计算机"快捷方式 我想在桌面上创建一个"锁定计算机"的快捷方式,请问应该如何实现呢? 首 ...

  8. 模板方法模式 Template method 行为型 设计模式(二十六)

    模板方法模式 Template method 上图为网上百度的一份简历模板截图 相信大家都有求职的经历,那么必然需要简历,写简历的时候,很可能你会网上检索一份简历模板,使用此模板的格式,然后替换为你的 ...

  9. 窗口消息——Windows核心编程学习手札之二十六

    窗口消息 --Windows核心编程学习手札之二十六 Windows允许一个进程至多建立10000个不同类型的用户对象(user object):图符.光标.窗口类.菜单.加速键表等,当一个线程调用一 ...

  10. OpenCV学习笔记(二十六)——小试SVM算法ml OpenCV学习笔记(二十七)——基于级联分类器的目标检测objdect OpenCV学习笔记(二十八)——光流法对运动目标跟踪Video Ope

    OpenCV学习笔记(二十六)--小试SVM算法ml 总感觉自己停留在码农的初级阶段,要想更上一层,就得静下心来,好好研究一下算法的东西.OpenCV作为一个计算机视觉的开源库,肯定不会只停留在数字图 ...

最新文章

  1. postfix和dovecot服务异常,重启服务后又会自动停掉的解决办法
  2. spring IOC 之篇三:默认标签的解析
  3. 下拉刷新:继承listView控件
  4. django-一对一关系
  5. Android渠道打包技术小结
  6. 数字图像处理(一)——彩色图像基础
  7. Arduino编译bootloader
  8. POJ2155 Matrix
  9. mysql文章列表_MySQL-分享文章列表 - Su的博客
  10. 批量生成横断面_批量生动生成填充图案的边界线
  11. word打开html是空白,网页复制到Word之后或者出现空白或者格式变乱该怎么办
  12. Namenode处于安全模式时,对hadoop进行查看操作,edits_inprogress_txid中没有事物事件的增加,txid没有增加?
  13. html中图片旋转木马,css3的图片3D旋转图片旋转木马
  14. 泰克示波器3系MDO再次升级,使EMI测试不再求人
  15. 电话线配线架是110配线架吗?电话线配线架的接法详细介绍
  16. 解决可以上QQ,但是无法上网的问题
  17. [label][WorldPress] 一个很方便查找定位WorldPress源代码位置的网址
  18. Swift UILabel 数字动画效果
  19. 机器人测钢卷直径_机器人热轧钢卷喷号漆
  20. DMHS DM8到Oracle12c PDB双向同步(大小不敏感+落地文件转发)

热门文章

  1. 计算广告(一):在线广告概述
  2. EXCEL干货(1-1): 基本表格操作
  3. unity泛型单例模式Singleton
  4. Android Studio中Cannot resolve symbol XXX的解决方法
  5. c++读取cfg文件
  6. Rockchip Linux CMA开发文档
  7. 2015 移动技术白皮书
  8. image图片大小调整和方向调整(UIImageOrientation)
  9. Google Chrome浏览器字体模糊不清
  10. 10.高光反射Blinn