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

简介: 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字节的。

相关文章
|
15小时前
|
存储 Java iOS开发
MacOS环境-手写操作系统-02-读写软盘
MacOS环境-手写操作系统-02-读写软盘
9 3
|
15小时前
|
存储 Java C语言
MacOS环境-手写操作系统-04-实模式进入保护模式
MacOS环境-手写操作系统-04-实模式进入保护模式
6 1
|
13小时前
|
Web App开发 Shell Linux
MacOS环境-手写操作系统-41-mem 第一个控制台程序
MacOS环境-手写操作系统-41-mem 第一个控制台程序
8 1
|
5月前
|
运维 开发工具 C语言
手写操作系统(1)——HelloOS
手写操作系统(1)——HelloOS
140 3
|
15小时前
|
Java C语言 iOS开发
MacOS环境-手写操作系统-01-最小操作系统
MacOS环境-手写操作系统-01-最小操作系统
5 0
|
14小时前
|
算法 iOS开发 MacOS
MacOS环境-手写操作系统-22-突破扇区读取限制
MacOS环境-手写操作系统-22-突破扇区读取限制
7 0
|
13小时前
|
小程序 iOS开发 MacOS
MacOS环境-手写操作系统-44-运行简单的程序
MacOS环境-手写操作系统-44-运行简单的程序
7 0
|
13小时前
|
编解码 C语言 iOS开发
MacOS环境-手写操作系统-27-修改分辨率
MacOS环境-手写操作系统-27-修改分辨率
6 0
|
14小时前
|
存储 算法 C语言
MacOS环境-手写操作系统-15-内核管理 检测可用内存
MacOS环境-手写操作系统-15-内核管理 检测可用内存
8 0
|
14小时前
|
Java C语言 iOS开发
MacOS环境-手写操作系统-16-内存管理 解析内存状态
MacOS环境-手写操作系统-16-内存管理 解析内存状态
6 0