突破512字节的限制
文章写于两年前的 MacBookAir(2015)
目前笔者为 MacBookPro M1 (抽查了部分 都运行正常)
Github项目地址: https://github.com/wdkang123/MyOperatingSystem
MacOS X86架构(x新版的arm架构的我没有 所以大家自行测试)
VirtualBox
C/C++环境 (Xcode必装)
1.简介
当前我们的系统内核 必须在虚拟软盘的第一扇区 由于第一个扇区只有512个字节
因此 系统内核不能超过512个字节
但是添加功能之后 512字节远远不够 要想超过512
具体做法就是 做一个内核加载器 放入到第一扇区
加载器加载内存后 再将软盘加载到系统中去 然后 跳转到内核的加载地址
2.boot.asm
假定我们把编译好的内核代码写入软盘的第1柱面 第2扇区
那么具体代码如下
org 0x7c00; LOAD_ADDR EQU 0X8000 entry: mov ax, 0 mov ss, ax mov ds, ax mov es, ax mov si, ax readFloppy: mov CH, 1 ;CH 用来存储柱面号 mov DH, 0 ;DH 用来存储磁头号 mov CL, 2 ;CL 用来存储扇区号 mov BX, LOAD_ADDR ; ES:BX 数据存储缓冲区 mov AH, 0x02 ; AH = 02 表示要做的是读盘操作 mov AL, 1 ; AL 表示要练习读取几个扇区 mov DL, 0 ;驱动器编号,一般我们只有一个软盘驱动器,所以写死 ;为0 INT 0x13 ;调用BIOS中断实现磁盘读取功能 JC fin jmp LOAD_ADDR fin: HLT jmp fin
readFloppy 这段代码从软盘的1柱面,2扇区,将内核读取到系统内存的0x8000处,读取成功后,通过一个jmp 跳转到内核的加载地址,将机器的控制权转交给内核。我们看看内核代码,kernel.asm:
org 0x8000 entry: mov ax, 0 mov ss, ax mov ds, ax mov es, ax mov si, msg putloop: mov al, [si] add si, 1 cmp al, 0 je fin mov ah, 0x0e mov bx, 15 int 0x10 jmp putloop fin: HLT jmp fin msg: DB "This is Hello World from kernel"
3.编译
我们的内核很简单 只不过打印一句:“This is Hello World from kernel”
我们对其进行编译
nasm kernel.asm -o kernerl.bat nasm boot.asm -o boot.bat
打开java工程 对其进行处理:
public void makeFllopy() { writeFileToFloppy("kernel.bat", false, 1, 2); floppyDisk.makeFloppy("system.img"); }
运行之后 生成 system.img
装载运行 即可看到
如果内核大小超过512字节,我只要在加载器中多读取几个扇区,就可以将内核加载进系统内存了,由此,通过内核加载器这个二传手,我们能够有效的突破512字节的大小限制,今后我们在内核中添加各种操作系统功能时,系统内核肯定是远远不止512字节的。