(系列视频实战可观看网易云课堂:
Linux kernel Hacker, 从零构建自己的内核
)
上一节,我用java制作了一个虚拟软盘,当把软盘插入虚拟机,启动机器后,屏幕打印出java程序中设定的语句,然后卡死。
在java代码中,有一个二进制数组,imgContent, 它里面存储的实际上是一段二进制代码,当虚拟机设置为从软盘启动后,这段代码会被bios读取到内存中,然后指示cpu去执行imgContent 所存储的二进制代码。
那么这段二进制代码做了些什么呢,它主要是设置了一些初始化数据,然后调用bios中断,将某个缓冲区中的字符打印到屏幕上,然后进入一个死循环,实际上,这段二进制代码的功能,可以用汇编实现,然后用汇编编译器将其编译成二进制文件,然后再读入到imgConent缓冲区中,最后利用java程序生成虚拟软盘,最终也能实现相同的效果,我们先看看对应的汇编程序怎么写:
org 0x7c00
jmp entry
db 0x90
DB "OSKERNEL"
DW 512
DB 1
DW 1
DB 2
DW 224
DW 2880
DB 0xf0
DW 9
DW 18
DW 2
DD 0
DD 2880
DB 0,0,0x29
DD 0xFFFFFFFF
DB "MYFIRSTOS "
DB "FAT12 "
RESB 18
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 0x0a, 0x0a
db "hello, world"
db 0x0a
db 0
上面的汇编代码,实际上就实现了将hello, world 打印到屏幕上,然后进入死循环的功能,一般而言,操作系统的研究和设计,理论上已经很成熟,也不难懂,就是系统内容被加载如内存前,所做的一系列操作需要汇编来编写,而卡死很多人的,就是搞不懂汇编,就是因为掌握不了汇编,于是很多人被挡在了操作系统精髓的大门之外,其实,汇编没什么难的,我们一句一句来理解,就像背单词。
上面的程序第一句是 org 0x7c00, org 的意思是origin, 中文意思是“起始,起源,” org 后面的7c00 是物理内存地址,假设物理内存是一个byte类型的大数组,例如byte[] memory, 如果你有2 G内容&#x