欢迎来到天天文库
浏览记录
ID:25210704
大小:48.50 KB
页数:4页
时间:2018-11-17
《u盘操作系统引导和内核加载器设计》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、U盘操作系统引导和内核加载器设计U盘操作系统引导和内核加载器设计1MBR引导程序 MBR引导程序代码开始运行于org0x7c00代码处,代码大小为512字节,引导扇区的标志为扇区最后两个字节为0xAA55,所以MBR引导程序代码最后两个字节为0xAA55。引导程序代码首先自迁移至0x600内存处并跳转执行。调取MBR主引导扇区中的分区表项至内存,从内存相应位置取出分区表项中的DBR扇区位置以及总扇区数存至内存以备DBR和内核加载器使用。通过0x13扩展中断判断是否支持读取大硬盘数据以便我们可以读取U盘扇区数据。方法是通过ah=0x41,bx=0x55AA调用int0x13调用结束后b
2、x内容为0xAA55,则表示支持扩展中断。读取U盘扇区内容的方法为调用BIOS的0x42号中断,入口参数:ah=0x42,dl=0x80,ds:si=调用参数列表。参数列表内容从低字节到高字节顺序为:2个字节的列表大小(固定为0x10),2个字节大小的读取扇区数,2个字节大小的读取至内存段地址,2个字节的读取至内存偏移地址,8个字节的线性扇区数。通过BIOS扩展int0x13扩展中断ah=0x42,将DBR活动分区启动代码加载至0x7c00代码,并跳转执行。 2DBR活动分区启动代码 活动分区DBR扇区代码从org0x7C5A地址处运行,原因是0x7C00~0x7C59之间为BPB
3、(BIOS参数块)格式文件信息,里面存放着文件系统的信息等。我们默认将内核加载器写入到从MBR扇区后的第一个扇区开始的扇区位置,大小为10个扇区,线性扇区数为1,读至内存的0x8000地址处。读取内核加载程序之后,我们需要利用之前保存在0x7c00处的DBR中的BPB信息来找到根目录开始扇区。根目录开始扇区数=保留扇区数+FAT表大小*FAT表个数+隐藏扇区数。DBR开始偏移地址0x20处为总共扇区数,偏移地址0x0e处为保留扇区数,偏移地址处0x24地址处为FAT大小,偏移地址0x10地址处为FAT表的个数。同时,我们后续我们还将用到偏移地址为0x0d处的每簇扇区数。DBR扇区大小为
4、512字节,同时程序最后以0xAA55结尾,以表示活动分区。获取以上信息之后,存至内存中,默认将我们有用的信息存至0x600内存开始处,因为该地址处的MBR代码对于我们已经没有用处了,所以覆盖掉。最后跳转至0x8000地址处的内存加载器程序并执行。 3内核加载器程序Loader 内核加载器代码是本文的设计重点,内核加载程序Loader将实现画面显示,所以要操作显存地址,显存地址为0xB8000,同时设置ah寄存器为0x1F,表示蓝底白字,显示字符调用int0x10中断,ah=0xE的方法显示。Loader程序将打印在屏幕上U盘的大小以及磁盘的一些信息,同时打印出CPU的相关信息。取
5、得CPU信息的方法是利用cpuid汇编命令获取。同时,需要获取扩展内存大小,以便于传给内核,检测方法是调用BIOSint0x15中断,设置eax=0xE801,调用无溢出则表示成功,成功后,eax寄存器存放16M以下大小,单位为K,ebx寄存器存放大于16M以上内存,单位为64K,两者最后相加为最终扩展内存大小。通过int0x10,ax=0x4F00中断功能,获取VBE(VESABIOSEXTENSION)512字节信息,在VBE信息中存有显存模式号的列表,通过int0x10,ax=0x4F01,cx=模式号,可以获取该模式下的信息并存放到es:di内存处,在es:di处可获取该模式的
6、显存地址和分辨率等信息。接下来需要从FAT32文件系统的U盘根目录下获取文件的开始扇区号以及文件大小,并加载到内存1M地址处。从DRB程序中获取根目录扇区号,并读取一个簇的扇区数,加载至内存0xD000地址处,该地址为Loader程序的数据加载地址,存放临时数据的位置。从0xD000位置处查找内核文件的名字,目录项大小为32字节,目录项中存放着根目录下的文件名称和该文件的开始簇号和文件大小,通过簇号转换得到开始扇区数,并通过扩展int0x13号中断从U盘加载至内存运行。同时,需要强调一下,目前程序还处在实模式下,不能访问1M内存地址,本文采用加载内核文件的一个扇区之后,通过BIOS扩展
7、int0x15中断,ax=0x8700,ecx=拷贝字节数,ds:si为临时的gdt表,实现从内存的低地址拷贝到扩展内存地址,直到完本文由.L地址内存处开始执行内核代码。
此文档下载收益归作者所有