网站大量收购独家精品文档,联系QQ:2885784924

修改MBR从硬盘启动linux0-Read.doc

  1. 1、本文档共7页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
修改MBR从硬盘启动linux0-Read

编写MBR从硬盘启动linux0.11 作者: dswei email: dswei@ 日期: 2005.4.3 计算机启动时BIOS会把启动盘第一个扇区的数据读入内存0x7C00开始处,然后跳到这里继续执行。从硬盘启动和从软盘启动唯一的区别就是映象文件存储方式的不同: 对于从软盘启动的方式,映象文件连续地存放在软盘开始的位置处。放在第一个扇区的bootsect.s被BIOS读入内存后,就会把余下的映象文件读入内存,然后继续执行 对于从硬盘启动的方式,映象文件存放在Minix格式的硬盘分区里,MBR(硬盘第一个扇区)中的程序需要根据硬盘的参数和Minix文件系统的存储格式读出它 本文描述了如何编写MBR中的程序,把存放在硬盘第一个分区根目录下的linux0.11映像文件Image读入内存。 文章中小字体的括号里的数字表示参考的文献的编号(见后面的参考文献列表)。 本文分5个部分: 1、硬盘简介 2、Minix 1.0文件系统简介 3、程序流程 4、上机实验 5、附录(程序代码) 一.硬盘简介(1) 图1. 硬盘扇区编号(此图来源文献1) 我们需要了解的是物理扇区编号方式和绝对扇区编号方式。物理扇区号直接按柱面、磁头、扇区3者的组合来(以(x,y,z)表示x柱面y磁头z扇区): (0,0,1)、(0,0,2)、……、(0,0,63)、 (0,1,1)、(0,1,2)、……、(0,1,63)、 (0,2,1)、(0,2,2)、……、(0,2,63)、 …… (0,15,1)、(0,15,2)、……、(0,15,63)、 (1,0,1)、(1,0,2)、……、(1,0,63)、 (1,1,1)、(1,1,2)、……、(1,1,63)、 换句话说就是扇区号是从1到63的63进制,磁头号是0到15的16进制,“百位”是柱面号,“十位”是磁头号,“个位”是扇区号。 绝对扇区号从0开始,遍历硬盘时依次增1。 两者的换算关系如下(abs_sector表示绝对扇区号,cyl表示柱面号,head表示磁头号,sector表示扇区号,nheads表示磁头数,nspt表示每磁道扇区数)sector = abs_sector % nspt + 1 track = abs_sector / nspt head = track % nheads cyl = track / nheads 如何知道上面说的磁头数nheads、每磁道扇区数0x41处,即内存地址4*0x41=0x104开始的4个字节表示硬盘参数表的段地址(后面2字节)和偏移地址(前面2字节)。硬盘参数表的结构如下: dw cylinders db nheads dw 0 dw write pre-comp db 0 db 0 control byte db 0, 0, 0 dw landing zone db nspt(sectors/track) db 0 第二个硬盘的参数表地址放在BIOS中断向量0x46处。 对于硬盘,我们还需要稍微知道一点分区表的信息。分区表放在硬盘第一个扇区的0x1be~0x1fd处(共64字节,第一个分区的信息在0x1be~0x1ce)。我们需要使用的仅仅是存放在0x1c6处的“分区起始绝对扇区号”(对应于程序中的start_sect变量) 二.Minix 1.0文件系统简介(2) (3) 关于Minix 1.0文件系统的更详细知识请参考文献2、3,下面仅介绍理解本程序需要了解到的知识。 Minix 1.0格式的分区结构如下: 引导块 超级块 i点位图块… 逻辑块位图块… i节点块… 数据区……… 1、引导块的第一个扇区就是本分区的第一个扇区,扇区号存在MBR中0x1c6处(就是上文的“分区起始绝对扇区号”)。对于Minix 1.0,每个盘块占1k字节(即2个扇区),盘块从0开始编号。对于盘块n,其绝对扇区号 = 2*n +分区起始绝对扇区号。 2、i点位图块和逻辑块位图块的大小、数据区的起始盘块号等信息存放在超级块中,超级块的数据结构如下: struct d_super_block{ unsigned short s_ninodes; //节点数 unsigned short s_nzones; //逻辑块数 unsigned short s_imap_blocks; //i节点位图所占用的数据块数 unsigned short s_zmap_blocks; //逻辑块位图所占用的数据块数 unsigned short s_firstdatazone; //第一个数据逻辑块 unsigned short s_log_zone

文档评论(0)

youbika + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档