When Do We Write Our Chinese OS ?
开始前的说明:本系列依据于《一个操作的实现》
之前在ubuntu下bochs安装使用已经开始了这个系列,那篇文章算是初始环境的一个搭建。下面针对这篇文章的程序进行说明。
org 07c00h ; 告诉编译器程序加载到7c00处
mov ax, cs
mov ds, ax
mov es, ax
call DispStr ; 调用显示字符串例程
jmp $ ; 无限循环
DispStr:
mov ax, BootMessage
mov bp, ax ; ES:BP = 串地址
mov cx, 16 ; CX = 串长度
mov ax, 01301h ; AH = 13, AL = 01h
mov bx, 000ch ; 页号为0(BH = 0) 黑底红字(BL = 0Ch,高亮)
mov dl, 0
int 10h ; 10h 号中断
ret
BootMessage: db "Hello, OS world!"
times 510-($-$$) db 0 ; 填充剩下的空间,使生成的二进制代码恰好为512字节
dw 0xaa55 ; 结束标志
通过nasm编译代码,如下:
brieftime@brieftime-computer:~/Program/Project/OS/chapter1/a$ nasm boot.asm -o boot.bin
brieftime@brieftime-computer:~/Program/Project/OS/chapter1/a$ ls
boot.asm boot.bin
接下来通过bochs的bximage创建一张软盘:
brieftime@brieftime-computer:~/Program/Project/OS/chapter1/a$ bximage
========================================================================
bximage
Disk Image Creation Tool for Bochs
$Id: bximage.c 11315 2012-08-05 18:13:38Z vruppert $
========================================================================
Do you want to create a floppy disk image or a hard disk image?
Please type hd or fd. [hd] fd
Choose the size of floppy disk image to create, in megabytes.
Please type 0.16, 0.18, 0.32, 0.36, 0.72, 1.2, 1.44, 1.68, 1.72, or 2.88.
[1.44]
I will create a floppy image with
cyl=80
heads=2
sectors per track=18
total sectors=2880
total bytes=1474560
What should I name the image?
[a.img]
Writing: [] Done.
I wrote 1474560 bytes to a.img.
The following line should appear in your bochsrc:
floppya: image=”a.img”, status=inserted
brieftime@brieftime-computer:~/Program/Project/OS/chapter1/a$ ls
a.img boot.asm boot.bin
接下来将编译的软件写入软盘:
brieftime@brieftime-computer:~/Program/Project/OS/chapter1/a$ dd if=boot.bin of=a.img bs=512 count=1 conv=notrunc
记录了1+0 的读入
记录了1+0 的写出
512字节(512 B)已复制,5.2399e-05 秒,9.8 MB/秒
brieftime@brieftime-computer:~/Program/Project/OS/chapter1/a$
最后一步就是启动bochs,但是启动之前需要通过配置文件对bochs的参数进行配置,举例如下:
###############################################################
# Configuration file for Bochs
###############################################################
# how much memory the emulated machine will have
megs: 32
# filename of ROM images
romimage: file=/usr/local/share/bochs/BIOS-bochs-latest
vgaromimage: file=/usr/local/share/bochs/VGABIOS-lgpl-latest
# what disk images will be used
floppya: 1_44=a.img, status=inserted
# choose the boot disk.
boot: floppy
# where do we send log messages?
# log: enabled=0
# disable the mouse
mouse: enabled=0
# enable key mapping, using US layout as default.
keyboard_mapping: enabled=0, map=/usr/local/share/bochs/keymaps/x11-pc-us.map
在命令行下输入bochs:
下面对代码进行说明:
前面几行将ds和es两个段寄存器ds和es指向与cs相同的段,以便后面调用INT 10H中断的时候定位到正确位置。
这里对INT 10H功能简要说明:
INT 10H 是由 BIOS 对屏幕及显示器所提供的服务程序,使用 INT 10H 中断服务程序时,先指定 AH 寄存器为下表编号其中之一,该编号表示欲调用的功用,而其他寄存器的详细说明,参考表后文字,当一切设定好之后再调用 INT 10H。底下是它们的说明:
AH
|
功 能
|
调用参数
|
返回参数 / 注释
|
1
|
置光标类型
|
(CH)0―3 = 光标开始行
(CL)0―3 = 光标结束行 | |
2
|
置光标位置
|
BH = 页号
DH = 行 DL = 列 | |
3
|
读光标位置
|
BH = 页号
|
CH = 光标开始行
CL = 光标结束行 DH = 行 DL = 列 |
4
|
读光笔位置
|
AH=0 光笔未触发
=1 光笔触发 CH=象素行 BX=象素列 DH=字符行 DL=字符列 | |
5
|
显示页
|
AL = 显示页号
| |
6
|
屏幕初始化或上卷
|
AL = 上卷行数
AL =0全屏幕为空白 BH = 卷入行属性 CH = 左上角行号 CL = 左上角列号 DH = 右下角行号 DL = 右下角列号 | |
7
|
屏幕初始化或下卷
|
AL = 下卷行数
AL = 0全屏幕为空白 BH = 卷入行属性 CH = 左上角行号 CL = 左上角列号 DH = 右下角行号 DL = 右下角列号 | |
8
|
读光标位置的属性和字符
|
BH = 显示页
|
AH = 属性
AL = 字符 |
9
|
在光标位置显示字符及其属性
|
BH = 显示页
AL = 字符 BL = 属性 CX = 字符重复次数 | |
A
|
在光标位置只显示字符
|
BH = 显示页
AL = 字符 CX = 字符重复次数 | |
E
|
显示字符(光标前移)
|
AL = 字符
BL = 前景色 |
光标跟随字符移动
|
13
|
显示字符串
|
ES:BP = 串地址
CX = 串长度 DH, DL = 起始行列 BH = 页号 AL = 0,BL = 属性 串:Char,char,……,char AL = 1,BL = 属性 串:Char,char,……,char AL = 2 串:Char,attr,……,char,attr AL = 3 串:Char,attr,……,char,attr |
光标返回起始位置 光标跟随移动 光标返回起始位置 光标跟随串移动 |