一个操作系统的实现 CH1
环境为Archlinux!!!
如果想要安装arch请移步:
或者
友情提示:没有完全的把握最好不要实机安装喔
可以移步 Manjaro or Garuda Linux或者其他基于Arch的发行版
也可以直接移步其他非Arch发行版诸如Ubuntu、Debian等等
推荐最好是实机安装
书本制作的os是针对x86平台的,所以所有的汇编都是x86平台的汇编
首先下载nasm(Intel 语法汇编) 以及 cgasm(AT&T 语法汇编, 一般称为gas?)
sudo pacman -S nasm cgasm
然后使用一个用着爽的编辑器,打开一个文件:
vim boot.asm
输入以下内容:
org 07c00h ; 将程序加载到7c00处
mov ax, cs ; 对ax进行清零
mov ds, ax ; 对ds进行清零
mov es, ax ; 对es进行清零
call DispStr ; 调用DispStr代码段
jmp $ ; 从DispStr代码段返回之后进行无限循环
DispStr:
mov ax, BootMessage ; 将BootMessage地址赋给ax
mov bp, ax ; ES:BP = 串地址
mov cx, 16 ; CX = 串长度
mov ax, 01301h ; AH = 13 用于显示字符串,AL = 01 用于光标跟随打印的字符串移动
mov bx, 000ch ; BH = 页号,BL = 背景及字体色,此处为黑底红字高亮
mov dl, 0 ; DL = 起始行列
int 10h ; 10h 号中断,打印字符串调用以上参数包括从ES:BP开始的到DL的行
ret ; 返回到call DispStr的下一行
BootMessage: db "Hello, OS world!" ; 要打印的字符串
times 510 - ($ - $$) db 0 ; 用 0 填充剩余的空间,使生成的代码刚好为512字节
dw 0xaa55 ; 结束标志,0xaa55 用于告诉bios这是一个可启动扇区
然后在终端编译:
nasm boot.asm -p boot.bin
接着是安装qemu-full:
sudo pacman -S qemu-full
然后尝试用qemu将这个程序启动:
qemu-system-x86_64 -fda ./boot.bin
因为是 x86 架构的,并且程序实际上是由 bios 进行执行,而 bios 是一个基于16位环境的程序,所以也可以用如下命令:
qemu-system-i386 -fda ./boot.bin
其中 -fda 参数用于指定软盘启动,当然在这里有没有都可以正常执行
然后就可以看到如下的效果图了:
然后,将这个程序烧录到U盘,尝试在一台支持bios启动的电脑上启动这个程序,
将U盘插入到电脑后(注意U盘内容的备份!!!)
lsblk
终端会有如下输出:
可以看到,sda是我插入的U盘
注意自己辨别是不是你的U盘,可以先拔出来,然后lsblk一下,然后再插进去,再lsblk一下,根据变化来判断!要是后续dd误操作可能会导致系统数据丢失!!!!!
然后就是将程序刻录到U盘
sudo dd if=boot.bin of=/dev/sda bs=512 count=1 conv=notrunc
注意U盘先插好了再刻录,否则没插好就输入这条命令将会在/dev下创建一个sda文件,之后无论U盘插拔都只会对这个文件进行读写,不会对U盘产生作用,此时就得先删除/dev/sda这个文件(U盘拔出时),然后再插入U盘刻录
然后因为上面的代码不知道为什么在qemu中可以启动,在我的实机上不行,经过热心网友的指导,将其中一行
mov ax, cs
更改为
xor ax, ax
一样是将 ax 清零,第一条无法跑的具体原因留到后续再看看
所以程序就变为:
org 07c00h ; 将程序加载到7c00处
xor ax, ax ; 对ax进行清零
mov ds, ax ; 对ds进行清零
mov es, ax ; 对es进行清零
call DispStr ; 调用DispStr代码段
jmp $ ; 从DispStr代码段返回之后进行无限循环
DispStr:
mov ax, BootMessage ; 将BootMessage地址赋给ax
mov bp, ax ; ES:BP = 串地址
mov cx, 16 ; CX = 串长度
mov ax, 01301h ; AH = 13 用于显示字符串,AL = 01 用于光标跟随打印的字符串移动
mov bx, 000ch ; BH = 页号,BL = 背景及字体色,此处为黑底红字高亮
mov dl, 0 ; DL = 起始行列
int 10h ; 10h 号中断,打印字符串调用以上参数包括从ES:BP开始的到DL的行
ret ; 返回到call DispStr的下一行
BootMessage: db "Hello, OS world!" ; 要打印的字符串
times 510 - ($ - $$) db 0 ; 用 0 填充剩余的空间,使生成的代码刚好为512字节
dw 0xaa55 ; 结束标志,0xaa55 用于告诉bios这是一个可启动扇区
然后重新进行编译
nasm boot.asm -o boot.bin
再按上述步骤烧录到U盘内
插到电脑上,bios设置为U盘启动
重启
闪亮登场:
这台电脑的配置为:
Intel I7-680um(一代酷睿)所以只支持BIOS启动
8G 800Mhz
256G SSD
目前来说用于实机测试刚刚好