首页 工作计划 工作总结 事迹材料 心得体会 述职报告 疫情防控 思想汇报 自查报告 党建材料 策划方案 教案设计 范文大全
  • 工作计划
  • 工作总结
  • 事迹材料
  • 心得体会
  • 述职报告
  • 疫情防控
  • 思想汇报
  • 自查报告
  • 党建材料
  • 策划方案
  • 教案设计
  • 范文大全
  • U盘操作系统引导和内核加载器设计

    时间:2023-06-01 11:50:08 来源:正远范文网 本文已影响 正远范文网手机站

    操作系统大部分运行在硬盘上,先如今U盘等可移动存储设备越来越普及和方便,在U盘上运行操作系统已成为普遍现象。设计U盘操作系统的引导和内核加载器是编写操作系统内核的第一步,也是关键的一步。操作系统的引导大体分为三步,第一步为U盘主引导扇区MBR程序加载;第二步为U盘分区引导扇区DBR程序加载;第三步内核加载器加载内核文件。本文程序分为三个文件,分别为MBR引导代码,DBR启动代码,内核加载器代码,同时MBR引导代码和DBR启动代码是通过linux的dd命令写入到U盘的指定位置,内核文件是通过拷贝到U盘的根目录下实现写入的。

    【关键词】U盘操作系统 引导 内核加载器 设计

    1 MBR引导程序

    MBR引导程序代码开始运行于org 0x7c00代码处,代码大小为512字节,引导扇区的标志为扇区最后两个字节为0xAA55,所以MBR引导程序代码最后两个字节为0xAA55。引导程序代码首先自迁移至0x600内存处并跳转执行。调取MBR主引导扇区中的分区表项至内存,从内存相应位置取出分区表项中的DBR扇区位置以及总扇区数存至内存以备DBR和内核加载器使用。通过0x13扩展中断判断是否支持读取大硬盘数据以便我们可以读取U盘扇区数据。方法是通过ah=0x41,bx=0x55AA 调用int 0x13 调用结束后bx内容为0xAA55,则表示支持扩展中断。读取U盘扇区内容的方法为调用BIOS的0x42号中断,入口参数:ah=0x42,dl=0x80,ds:si=调用参数列表。参数列表内容从低字节到高字节顺序为:2个字节的列表大小(固定为0x10),2个字节大小的读取扇区数,2个字节大小的读取至内存段地址,2个字节的读取至内存偏移地址,8个字节的线性扇区数。通过BIOS扩展int 0x13扩展中断ah=0x42,将DBR活动分区启动代码加载至0x7c00代码,并跳转执行。

    2 DBR活动分区启动代码

    活动分区DBR扇区代码从org 0x7C5A地址处运行,原因是0x7C00~0x7C59之间为BPB(BIOS参数块)格式文件信息,里面存放着文件系统的信息等。我们默认将内核加载器写入到从MBR扇区后的第一个扇区开始的扇区位置,大小为10个扇区,线性扇区数为1,读至内存的0x8000地址处。读取内核加载程序之后,我们需要利用之前保存在0x7c00处的DBR中的BPB信息来找到根目录开始扇区。根目录开始扇区数=保留扇区数+FAT表大小*FAT表个数+隐藏扇区数。DBR开始偏移地址0x20处为总共扇区数,偏移地址0x0e处为保留扇区数,偏移地址处0x24地址处为FAT大小,偏移地址0x10地址处为FAT表的个数。同时,我们后续我们还将用到偏移地址为0x0d处的每簇扇区数。DBR扇区大小为512字节,同时程序最后以0xAA55结尾,以表示活动分区。获取以上信息之后,存至内存中,默认将我们有用的信息存至0x600内存开始处,因为该地址处的MBR代码对于我们已经没有用处了,所以覆盖掉。最后跳转至0x8000地址处的内存加载器程序并执行。

    3 内核加载器程序Loader

    内核加载器代码是本文的设计重点,内核加载程序Loader将实现画面显示,所以要操作显存地址,显存地址为0xB8000,同时设置ah寄存器为0x1F,表示蓝底白字,显示字符调用int 0x10中断,ah=0xE的方法显示。Loader程序将打印在屏幕上U盘的大小以及磁盘的一些信息,同时打印出CPU的相关信息。取得CPU信息的方法是利用cpuid 汇编命令获取。同时,需要获取扩展内存大小,以便于传给内核,检测方法是调用BIOS int 0x15中断,设置eax=0xE801,调用无溢出则表示成功,成功后,eax寄存器存放16M以下大小,单位为K,ebx寄存器存放大于16M以上内存,单位为64K,两者最后相加为最终扩展内存大小。通过int 0x10,ax=0x4F00中断功能,获取VBE(VESA BIOS EXTENSION)512字节信息,在VBE信息中存有显存模式号的列表,通过int 0x10, ax=0x4F01,cx=模式号,可以获取该模式下的信息并存放到es:di内存处,在es:di处可获取该模式的显存地址和分辨率等信息。接下来需要从FAT32文件系统的U盘根目录下获取文件的开始扇区号以及文件大小,并加载到内存1M地址处。从DRB程序中获取根目录扇区号,并读取一个簇的扇区数,加载至内存0xD000地址处,该地址为Loader程序的数据加载地址,存放临时数据的位置。从0xD000位置处查找内核文件的名字,目录项大小为32字节,目录项中存放着根目录下的文件名称和该文件的开始簇号和文件大小,通过簇号转换得到开始扇区数,并通过扩展int 0x13号中断从U盘加载至内存运行。同时,需要强调一下,目前程序还处在实模式下,不能访问1M内存地址,本文采用加载内核文件的一个扇区之后,通过BIOS 扩展int 0x15中断,ax=0x8700,ecx=拷贝字节数,ds:si为临时的gdt表,实现从内存的低地址拷贝到扩展内存地址,直到完成加载内核文件的最后一个扇区才结束加载。加载完内核文件之后,需要加载提供给内核文件使用的GDT表。GDT格式不在详谈。通过汇编命令LGDT加载GDT表后,使能A20地址线,并设置CR0寄存器的PE位,以便进入保护模式,进入保护模式之后,重新使用GDT表提供的段选择子,设置好之后便跳转至1M地址内存处开始执行内核代码。

    参考文献

    [1]白中英.计算机组成原理(第三版)[M].北京:科学出版社,2002.

    [2]川合秀实.30天自制操作系统[M].北京:人民邮电出版社,2012(08).

    [3]于振南.振南znFAT--嵌入式FAT32文件系统设计与实现[M].北京:北京航空航天大学出版社,2014(04).

    [4]赵炯.linux0.11内核完全注释(修正版v3.0)[D].上海同济大学,2011(06).

    作者单位

    青岛市黄岛区人民医院信息中心 山东省青岛市 266400

    推荐访问:内核 引导 加载 操作系统 设计