📜  制作<hr>引导程序中的更大 (1)

📅  最后修改于: 2023-12-03 15:22:44.687000             🧑  作者: Mango

制作更大的引导程序

简介

引导程序是计算机系统启动时第一个运行的程序,它的作用是从计算机的硬盘驱动中读取操作系统的核心文件到内存中,使得计算机能够正常启动。

而制作更大的引导程序,则可以为操作系统的启动提供更强大的功能,例如:文件系统的支持、分区表管理、硬件检测、驱动加载等。

本文将介绍如何制作更大的引导程序。

步骤
  1. 编写MBR(Master Boot Record)程序

MBR程序是引导程序的核心,它位于硬盘分区的第一个扇区,主要作用是加载操作系统核心文件到内存。在编写MBR程序时,需要注意以下几个方面:

  • 引导扇区大小为512字节,不能超过这个大小。
  • 需要设置MBR程序的加载地址,通常设为0x7c00。
  • 需要读取操作系统核心文件,并将其复制至内存中。
  • 需要跳转到操作系统核心文件的入口点。

以下是MBR程序的示例代码:

[org 0x7c00]     ; 设置加载地址为0x7c00
mov ax, 0x07c0    ; 设置段寄存器
mov ds, ax
mov es, ax
mov bx, 0x8000    ; 设置内存加载地址
mov ah, 0x02      ; 设置读取扇区的BIOS功能号
mov al, 0x01      ; 设置读取扇区的数量
mov ch, 0x00      ; 磁头号为0
mov cl, 0x02      ; 起始扇区号为2
mov dh, 0x00      ; 磁道号为0
mov dl, 0x80      ; 驱动器号为0x80
int 0x13          ; 调用BIOS读取扇区
jmp 0x0000:0x8000 ; 跳转至操作系统核心文件的入口点
times 510-($-$$) db 0 ; 填充0,使MBR程序大小为512字节
dw 0xaa55         ; MBR标志
  1. 添加文件系统支持

在MBR程序中添加文件系统支持,可以使得操作系统可以读写硬盘上的文件。常见的文件系统包括FAT、NTFS等。

在添加文件系统支持时,需要注意以下几个方面:

  • 需要读取分区表信息,确定硬盘分区的位置和大小。
  • 需要将文件系统的文件读取到内存中,以便操作系统可以访问和修改文件。
  • 需要处理文件系统的目录结构,以便操作系统可以访问和创建文件。

以下是MBR程序添加FAT文件系统支持的示例代码:

[org 0x7c00]     ; 设置加载地址为0x7c00
mov ax, 0x07c0    ; 设置段寄存器
mov ds, ax
mov es, ax
mov bx, 0x8000    ; 设置内存加载地址
mov ah, 0x02      ; 设置读取扇区的BIOS功能号
mov al, 0x01      ; 设置读取扇区的数量
mov ch, 0x00      ; 磁头号为0
mov cl, 0x02      ; 起始扇区号为2
mov dh, 0x00      ; 磁道号为0
mov dl, 0x80      ; 驱动器号为0x80
int 0x13          ; 调用BIOS读取扇区

mov ax, 0x8000
mov es, ax
mov ah, 0x0e      ; 显示字符的BIOS功能号
mov al, 'F'
int 0x10

jmp $            ; 死循环
times 510-($-$$) db 0 ; 填充0,使MBR程序大小为512字节
dw 0xaa55         ; MBR标志
  1. 添加分区表管理

在MBR程序中添加分区表管理,可以使得操作系统可以多重启动,同时支持多个操作系统。

在添加分区表管理时,需要注意以下几个方面:

  • 需要读取分区表信息,确定硬盘分区的位置和大小。
  • 需要加载其他操作系统的引导程序,并跳转至其入口点。

以下是MBR程序添加分区表管理的示例代码:

[org 0x7c00]     ; 设置加载地址为0x7c00
mov ax, 0x07c0    ; 设置段寄存器
mov ds, ax
mov es, ax
mov bx, 0x8000    ; 设置内存加载地址
mov ah, 0x02      ; 设置读取扇区的BIOS功能号
mov al, 0x01      ; 设置读取扇区的数量
mov ch, 0x00      ; 磁头号为0
mov cl, 0x02      ; 起始扇区号为2
mov dh, 0x00      ; 磁道号为0
mov dl, 0x80      ; 驱动器号为0x80
int 0x13          ; 调用BIOS读取扇区

mov ax, 0x8000
mov es, ax
mov ah, 0x0e      ; 显示字符的BIOS功能号
mov al, 'F'
int 0x10

mov si, partition_table_offset ; 读取分区表偏移量
mov di, 0x7be                  ; 存储分区表信息的内存地址
mov cx, 0x10                   ; 存储分区表信息的数量
rep movsb                       ; 将分区表信息复制到内存中

mov dl, [partition_table_offset + 0x08] ; 获取第一个分区的驱动器号
mov ah, 0x02                   ; 设置读取扇区的BIOS功能号
mov al, 0x01                   ; 设置读取扇区的数量
mov ch, byte [partition_table_offset + 0x04] ; 获取起始扇区号
mov cl, byte [partition_table_offset + 0x03] ; 获取起始磁头号和磁道号
mov dh, byte [partition_table_offset + 0x05]
mov bx, 0x8000                 ; 设置内存加载地址
int 0x13                       ; 调用BIOS读取扇区

mov ax, 0x8000
mov es, ax
mov ah, 0x0e      ; 显示字符的BIOS功能号
mov al, 'B'
int 0x10

jmp 0x0000:0x8000 ; 跳转至操作系统核心文件的入口点

times 510-($-$$) db 0 ; 填充0,使MBR程序大小为512字节
dw 0xaa55         ; MBR标志

partition_table_offset:
  times 446 db 0           ; 主引导记录段0~445字节填充0
  db 0x80                  ; 驱动器号为0x80
  db 0x01                  ; 起始磁头号
  db 0x00                  ; 起始扇区号
  db 0x00                  ; 起始磁道号
  db 0x01                  ; 分区类型为FAT16
  db 0x00                  ; 结束磁头号
  db 0x08                  ; 结束扇区号
  db 0xe0                  ; 结束磁道号
  dd 0x00                  ; 分区起始扇区的LBA地址
  dd 0x20                  ; 分区大小的扇区数
结论

制作更大的引导程序可以为操作系统启动提供更强大的功能。其中包括文件系统的支持、分区表管理、硬件检测、驱动加载等。在编写MBR程序时,需要注意MBR程序的大小不能超过512字节,需要设置MBR程序的加载地址,也需要注意处理分区表信息等。