MacOS环境-手写操作系统-03-突破512字节的限制 原创

突破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字节的。

在这里插入图片描述

posted @   武子康  阅读(0)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示