JAVA程序员需要知道的计算机底层基础10-操作系统引导程序的简单制作

汇编实现引导程序

编写汇编码

; 文件名 boot.asm
 
org 7c00h              ; BIOS读入MBR(Master Boot Record主引导记录)后,从0x7c00h处开始执行,所以这里把程序扔到内存的0x7c00h中去
 
; 下面部分和10h有关中断,10h中断用来显示字符
mov ax, cs
mov es, ax
mov ax, msg
mov bp, ax                    ; ES:BP表示显示字符串的地址
mov cx, msgLen                ; CX存字符长度
mov ax, 1301h                 ; AH=13h表示向TTY显示字符,AL=01h表示显示方式(字符串是否包含显示属性,01h表示不包含)
mov bx, 000fh                 ; BH=00h表示页号,BL=0fh表示颜色
mov dl, 0                     ;int 10h                       ;10h代表显示器硬件对应的中断信号
  
msg: db "hello world, welcome to OS!"
msgLen: equ $ - msg           ; 字符串长度
times 510 - ($ - $$) db 0     ; 因为整个程序不足512字节,需要填充剩余部分
dw 0aa55h                     ; 魔数,必须有这两个字节BIOS才确认是MBR

程序实现的就是一个系统引导程序,在屏幕中输入一段文字。
可以发现这就是一个硬中断的简单实践,实际上和软中断的调用过程类似,也是给出参数到对应的寄存器,然后进行中断操作,由内核做出对应的操作。

编译

nasm boot.asm -o boot.bin

制作启动软盘

1、 生成空白软盘镜像(软盘大小必须为1.44M,因此bs=1474560 )

dd if=/dev/zero of=floppy.img bs=1474560 count=1

2、制作包含主引导记录boot.bin的启动镜像文件(引导程序占512byte)

dd if=boot.bin of=myos.img bs=512 count=1

3、将第2步生成的bin引导镜像文件复制到空白软盘中,并在引导镜像内容后面的软盘内容补上空白,成为合适大小的软盘镜像,一共2880个扇区,略过第一个

dd if=floppy.img of=myos.img skip=1 seek=1 bs=512 count=2879 

用软盘启动系统

1、将myos.img下载到windows
2、VMWare创建空的虚拟机

  • a、文件 - 创建新的虚拟机 - 典型

  • b、稍后安装操作系统

  • c、其他

  • d、一路next 完成

  • e、虚拟机设置,去掉CD/DVD选项中“启动时连接”

  • f、网络,选择“仅主机模式”,勾选“启动时连接”(好像无所谓)

  • g、添加软盘驱动器 使用软盘映像 找到myos.img

3、启动虚拟机

内存时模式

内存时模式指的是计算器启动后,内存里存放的内容结构。
在这里插入图片描述
在这里插入图片描述

从这里可以发现,操作系统的引导程序确实是在内存地址中的07C00H位置上。在这个引导程序之前的内存还存放了一些其他的东西,是关于一些例如BIOS自身的数据(例如我怎么输入了一串英文,但实质这对计算机来说就是一段01的数,如何让显示器可以把这段翻译成英文显示? 我猜测BIOS Data Area中就是装了这个映射的东西。

内存从引导程序再向上面看,发现还有一些固定的硬件之类的了。

为什么引导程序一定在07C00H?

简单来说,IBM最初约定的是在07C00H,但后续为了兼容性,就都统一都放在这个地方了。

参考:https://www.glamenv-septzen.net/en/view/6

©️2020 CSDN 皮肤主题: 1024 设计师:上身试试 返回首页