D_D系统构建-MBR(4)代码剖析
来源:互联网 发布:农村创业软件 编辑:程序博客网 时间:2024/06/01 20:12
上一章节我们将代码都罗列出来 ,实际上这还是一个测试代码,不会真正的加载 loader; 在后面Loader实现后,会对此代码再进行充实完善,当前我们只用来验证下分段mbr是否能正常运行。
boot.asm如下:
这一行表示引用头文件的意思,与C中的include一样,编译时会在此展开。
section表示 这是一个段,align表示 编译时按照16bit对齐, vstart表示 段内起始地址,参考base_phy.inc知道,macro_boot_addr为0x7c00,正好是我们的boot加载地址
紧跟着定义一个数据字符串,用来显示下内容,bootmsglen为一个常量,类似c中的宏一样。它表示字符串长度
这段是实际 的代码运行区,先初始化相应的段寄存器,设置栈顶sp;然后清除屏幕并显示第7行设置的字符串信息。
这里先获取这个mbr剩余的字节,保存在mbr_left_len(第10 行),这里我们用地址相减的方法来获取剩余字节长度,这个我们最后看下他是如何计算这个长度的。
34行到41行计算出剩余字节对应的扇区数目,不足一个扇区的按照一个扇区来计算。
44到52行,将上一步计算出的扇区数目,起始扇区号,起始 内存地址传入getDataFromSectors函数 ;这里面的起始扇区号=4096 , 起始 内存0x7e00,这都是我们约定好的。
getDataFromSectors完成剩余内容读入到指定内存位置处
54行就简单了,加载 完内容后,跳转到load-loader处执行,这里面有点特殊的是这个Load-loader实际 的位置是在512字节之后,
56-75行定义了clearscreen的实现, 与c里面的函数定义一样。这个完成屏蔽清除,并将光标设置为屏蔽起始 位图处。
76-99行,定义了showstring的实现,用来 显示指定字符串。它先读取当前光标位置,然后在此位置上显示用户传入的字符
这个getdatafromsectors是 这个boot的主要函数 ,113-118获取传入的扇区起始地址,扇区数目,内存起始地址 ; 它要完成磁盘内容读取的工作。这里面的读取采用lba模式,依次从端口0x1f0-0x1f7设置扇区数目,起始lba号(125-147),
然后检查是否可用(149-153),可用时再读取内容以指定内存处(155-169)
这个指令比较特殊点,使用了times,它表示重复多少个内存地址填写指定内容,并以0xaa55结束,这个是磁盘可加载 的标志,不能缺少。
后面多于512字节的主要是处理loader,当前定义一个loader字串,并显示
上面说到我们需要计算出的内容,这里面直接使用mbr_end-loader-begin即可
到此,我们的boot.asm就介绍完了,主要完成清除屏幕-》显示boot-》加载剩余内容-》跳转到剩余内容处执行,如果 一切正常,它会显示如上
- mbr_left_len dw mbr_end-loader_begin
- D_D系统构建-MBR(4)代码剖析
- D_D系统构建-MBR(3)代码
- D_D系统构建-MBR(1)
- D_D系统构建-MBR(6)加载loader文件代码MBR解析
- D_D系统构建-MBR(7)加载loader文件代码filesystem.inc解析
- D_D系统构建-文件系统
- D_D系统构建-篇外话
- D_D系统构建-MBR(8)filesystem.inc代码整改适配32位(附提供当前整个开发目录文件)
- D_D系统构建-简述及环境准备
- D_D系统构建-文件分布及说明
- D_D系统构建-文件写入方法
- D_D系统构建-开发文件目录结构
- D_D系统构建-loader保护模式修改
- D_D系统构建-Loader的保护模式尝试
- DD_系统构建-MBR(2) 流程
- 系统引导 - MBR引导代码研究(1)
- 系统引导 - MBR引导代码研究(2)
- 系统引导 - MBR引导代码研究(3)
- hbase 源代码解析(4) 的createTable 的 region assign
- nodejs 发起http get post 请求
- Java经典算法40例(十四)
- HDU
- C#(2)-------使用Log4Net记录日志
- D_D系统构建-MBR(4)代码剖析
- 自定义信号
- linux线程之间的通信
- python import 详解
- Java经典算法40例(十五)
- 浅谈前端模块开发的方法
- 前端常见的功能实现总结
- R中重复值、缺失值及空格值的处理
- 阿里云远程登陆MySql数据库连接失败