本书依靠的教材是于渊的《Orange'S:一个操做系统的实现》linux
实验环境及工具windows
思路:session
Hello, World
;; BIOS会把512字节的引导扇区加载到 0000:7c00 处, ;; 而后跳转到0000:7c00处,将控制权交给引导代码。 org 07c00h ;这一行告诉编译器,咱们的代码将被加载到7c00处。 mov ax, cs ;将代码段寄存器的值送入AX mov ds, ax ;将数据段的地址置为代码段的地址? mov es, ax ;将附加段的地址置为代码段的地址? call DispStr ;调用显示字符串例程 jmp $ ;无限循环, $表示当前行编译后的地址 ;; 以上就是整个程序的执行过程了 ;; 下面是DispStr子程序 DispStr: mov ax, BootMessage ;将字符串首地址传给寄存器ax mov bp, ax ;CPU将用ES:BP来寻址字符串 mov cx, 16 ;经过CX,CPU知道字符串的长度 mov ax, 01301h ;AH=13表示13号中断, AL=01H,表示目标字符串仅仅包含字符,属性在BL中包含,移动光标 mov bx, 000ch ;黑底红字, BL=0CH,高亮 mov dl, 0 ;dh表示在第几行显示,dl表示第几列显示 int 10h ;BIOS的10H中断的13号中断用于显示字符串 ret BootMessage: db "Hello, OS world!" ;对NASM来说,标号和变量的做用同样, db表示define byte ;; $当前行被汇编后的地址,$$表示一个section开始处的地址,本程序只有一个section,因此指0x7c00 times 510-($-$$) db 0 ;填充剩下空间,使生成的二进制刚好为512字节 dw 0xaa55 ;结束标志,若是发现扇区以0xAA55结束,则BIOS认为它是一个引导扇区,dw表示define word
关于中断显示字符串的细节,可参见使用BIOS中断显示字符串笔记(int 10h 13号中断)。编辑器
须要nasm
。若是你使用Linux,能够直接从软件仓库安装。nasm
便可以从汇编代码生成目标代码,也带了一个反汇编工具ndisasm
, 能够从目标代码生成汇编代码。工具
编译咱们的扇区代码生成二进制:spa
nasm boot.asm -o boot.bin
咱们用软盘镜像来模拟软盘。操作系统
dd if=/dev/zero of=emptydisk.img bs=512 count=2880 #生成空白软盘镜像文件 dd if=boot.bin of=boot.img bs=512 count=1 #用 bin file 生成对应的镜像文件 dd if=emptydisk.img of=boot.img skip=1 seek=1 bs=512 count=2879 #在 bin 生成的镜像文件后补上空白,成为合适大小的软盘镜像
这样,咱们引导系统用的虚拟软盘就准备好了。.net
能够直接从Linux软件仓库安装virtualbox。code
把当前用户加入vboxusers
组:gpasswd -a <username> vboxusers
。blog
启动virtualbox,可能提示vboxdrv未能成功加载。若是发生这种状况,须要从新编译vboxdrv模块。安装linux-headers
和dkms
,而后sudo dkms autoinstall
就会编译生成vboxdrv模块。
手动执行sudo modprobe vboxdrv
加载vboxdrv模块,启动virtualbox应该不会有问题了。
创建一个虚拟机,有没有硬盘均可以,增长一个软驱,把咱们的boot.img
加载到软驱中,启动虚拟机,成功的话,能够看到:
virtualbox可能出现的问题:
Failed to open a session for the virtual machine a. Failed to load VMMR0.r0 (VERR_SUPLIB_OWNER_NOT_ROOT). Unknown error creating VM (VERR_SUPLIB_OWNER_NOT_ROOT).
解决方法:sudo chown -R root:root /usr/lib/virtualbox
Effective UID is not root
. 解决方法: sudo chmod 4711 /usr/lib/virtualbox/VirtualBox
。
参见: https://www.virtualbox.org/ticket/7889