从零开始写一个操作系统内核 笔记(三)

BootLoader引导启动程序

组成2部分:
1.Boot引导程序:主要负责启动和加载Loader程序。
2.Loader引导加载程序:用于完成配置硬件工作环境、引导加载内核等任务。

Boot引导程序

在这里插入图片描述
计算机上电启动 →
BIOS上电自检(检测硬件是否异常) →
根据BIOS启动配置选择引导设备(软盘、默认:硬盘、U盘、网络启动)

BIOS启动原理
  1. BIOS自检结束后会从启动项(软盘、硬盘…)去启动设备
  2. BIOS会读取第0磁头第0磁道第一扇区,的521 字节如果最后两字节 是以 0x55 和 0xaa结尾那么久认为是引导扇区。
  3. 然后将这个扇区的内容复制到物理内存0x7c00处。
  4. 512B的内容是完全不够实现一个 加载程序的,所以Boot引导作为一级助推。 干完了加载第一扇区的活接下来的活接下来就交给软件控制了。
org 0x7c00;程序加载到的内存
BaseOfStack equ 0x7c00
Label_Start:
mov ax,cs;取代码段寄存器0x7c00
mov ds,ax ;设置数据段寄存器
mov es,ax ;设置附加寄存器
mov ss,ax ;设置栈顶
mov sp,BaseOfStack ;设置栈底
;清屏 相当于窗口的滚动条 滚动了指定行 实现清屏
mov ax,0600h ;按指定范围滚动窗口
mov bx,0700h;设置显示的属性
mov cx,0;滚动范围的左上角坐标行列号
mov dx,184fh;.....右下角行列号
int 0x10
;设置光标位置
mov ax,0200h ;AH02 功能:设置屏幕光标位置
mov bx,0000h ;BH页码
mov dx,0000h ;dx 游标的列行数
int 0x10 ;调用硬件中断 实现光标设置

上面的 代码 其实就是传入几个参数然后清屏、设置光标 平时用浏览器的时候会拉滚动条其实就是换一页没写入数据的显存,上面代码没什么太大的显示处理的代码没什么意义不需要完全理解。

mov ax,1301h;AH = 13h显示一行字符 AL = 01h 显示字符串光标移动到字符串末尾
mov bx,000fh; BH:页码 BL:字符属性/颜色属性
mov dx,0000h;游标的坐标行列号
mov cx,10;字符串的长度
push ax ;保存ax
mov ax,ds ;得到数据段地址
mov es,ax ;附加段 设置为 数据段
pop ax ;恢复ax
mov bp,StartBootMessage ;ES:BP 段偏移 << 4 + bp 放的是要显示的字符
int 0x10

上面是显示一字符串,Start Booting…

jmp $ ;让系统停在这 死循环
StartBootMessage db "Start Boot"
times 510 -($ - $$) db 0 ;计算前面代码用了多少字节 填充00到剩余 直到510字节
dw 0xaa55 ;识别引导扇区标识

把上面所有的代码 保存编译一下

nasm boot.asm -o boot.bin
dd if=boot.bin of=boot.img bs=512 count=1 conv=notrunc
if = boot.bin 源文件名 of = boot.img 指定输出名 bs =512 指定 count=1 conv = notrunc

在这里插入图片描述

bochs -f bochsrc.txt 启动bochs

在这里插入图片描述在这里插入图片描述
注意:硬盘文件和 配置文件 我放在了同一个目录下。
在这里插入图片描述

加载Loader程序到内存

如果每一次 都将要读的扇区写入汇编代码,然后修改引导扇区这样 后面随着代码的不断更改需要不停地更改所以为了后面更好的偷懒,所以实现一个简单的FAT12文件系统来实现装载程序。
在这里插入图片描述

  • 引导扇区
    包含:引导程序, FAT12文件系统的整个组成结构信息(描述FAT12系统对磁盘扇区的管理情况)。
    在这里插入图片描述

    扫描二维码关注公众号,回复: 9411802 查看本文章
  • BS_OEMName:记录制造商的名字。

  • BPB_SecPerClus:描述每簇扇区数,你看看你的文件 如果写入一个 a 实际上占用的空间肯定不是一个字节。因为存储的最小单位 是簇定义为2 的n次方个字节为一个簇。

  • BPB_RsvdSecCnt:保留扇区数量。第一个引导扇区是保留扇区所以要至少要设置为1,保留扇区是头开始的。

  • BPB_NumFATs:指定FAT文件系统中FAT表的份数,建议为2,一个为主表,一个作为备份,都是存储一样的数据。

  • BPB_RootEntCnt:指定根目录项数。FAT12文件系统,这个数值乘以 32 必须是- BPB_BytesPerSec的偶数倍。

  • BPB_ToSec16:记录着总扇区数。包含保留扇区、FAT表、根目录区以及数据区占用户的全部扇区数,为0 时 BPB_TotSec32字段必须是非0值。

  • BpB_Media:描述存储介质类型。对于不可移动的存储介质而言,标准值是0xF8.对于可移动的存储介质,常用值为0XF0。

  • BPB_FATSz16:记录着Fat表占用的扇区数。FAT表1和FAT表2拥有相同的容量,它们的容量均有此值记录。

  • BS_VolLab:指定卷标,就是windows或Linux系统中显示的磁盘名。

  • BS_FileSysType:描述文件系统类型.如:“FAT12” 本质是一个字符串。

在这里插入图片描述

FAT表

簇的长度为:BPB_BytesPerSec * BPB_SecPerClus 字节

根目录区和数据区

根目录区和数据区都保存着与文件相关的数据,只不过根目录区只能保存目录项信息,而数据区不但可以保存目录信息,还可以保存文件内数据。
在这里插入图片描述

org 0x7c00
BaseOfStack equ 0x7c00
BaseOfLoader equ 0x1000
OffsetOfLoader equ 0x00

RootDirSectors equ 14
Sector

…未完成

发布了85 篇原创文章 · 获赞 5 · 访问量 4708

猜你喜欢

转载自blog.csdn.net/weixin_41315492/article/details/104396248
今日推荐