本来准备去图书馆借一本嵌入式的书回去研究研究,可是无意间被我发现了之前一直中青的orange's一个操作系统的实现,果断借来研究一番阿。
乍一看,语言主要就是会变喝c语言,这样看来我还要借一本汇编书做参考咯,艾, 关于汇编我想说只是之前嵌入式中设计一点点会变的语法,没有学过汇编的孩子感觉压力有点山大阿,不过没关系,我不怕,^_^。
前两章就是一些介绍和环境大搭建,其中感觉自己没有必要对于其开发环境的选择研究一番,但是还是忍不住看了以下,个人感觉作者写的很好,作为一个开发人员,就必须要会使用linux,电脑小白使用windows因为其入门门槛低,linux,哦,不,应该说gnu,虽然入门路线比较陡峭,但是入门之后就会得心应手,这一点真是深有感触阿,虽然还是时不时借助于图形化界面,另外呢,linux没有病毒的困扰,之前也看过一篇文章,说linux病毒的,世界上第一个linux病毒不是用来破坏linux的,而是要证明linux下是可以有病毒的,完全不需要杀毒软件阿。^_^。
闲话少说,开始动手,我的系统是debian7,虚拟机采用的bochs2.6.2,最新版,点击进入下载,关于虚拟机呢,这里一篇文章介绍了主流的三种的区别,可以看看。在安装之前呢,需要有gcc编译器,当然完整安装文件如下:
apt-get install build-essential xorg-dev bison libgtk2.0-dev libtool
这里参考自 debian安装bochs2.6。一开始只是装了build-essential,make执行不了,全部装上解决;
接下来编写一个引导扇区:
org 07c00h ; tell the compile load data from 7c99
mov ax, cs
mov ds, ax
mov es, ax
call DispStr ; monitor the example of show string
jmp $
DispStr:
mov ax, BootMessage
mov bp, ax ; ES:BP = the address of the serial
mov cx, 16 ; CX = the length of the serial
mov ax, 01301h ; AH = 13, AL = 01h
mov bx, 000ch ; 0 page(BH = 0) red buttom and red word(BL = 0ch, highlig ht)
mov dl, 0
int 10h ; 10h break
ret
BootMessage: db "Hello, Crazy.J OS"
times 510-($-$$) db 0 ; Fill the remain space,make the 2 binary file 512 byt es
dw 0xaa55 ; end sign
ok,书上说要使用软盘,天哪,我哪里来的软盘阿,继续让下面看,还好可以在虚拟机里面进行,大爱bochs阿,ok配置bochs,配置文件.bochsrc是默认加载的.bochsrc之后就是bochsrc,bochsrc.txt,如果是自己添加配置文件呢,使用-f 配置文件名即可,在安装目录下找到.bochsrc,使用vim编辑,这里需要将floppya的镜像的文件位置修改成自己编译成的文件的位置,编译的话使用
nasm boot.asm -o boot.bin
ok,有了bin文件,再下面就是通过bximage生成img文件,这里直接键入bximage就好,然后选择盘类型的时候换成fp就好,镜像的名字也可以更改,总之按提示操作即可,很简单,then,使用
dd -if=boot.bin of=boot.img bs=512 count=1 conv=notrunc
这里由于是虚拟机操作,故加上参宿conv=notrunc,防止被分片,接下来就是将配置文件中的boot disk注释掉,将boot floppy取消注释,关于key mapping默认的配置是注释掉的,添加以下一段,相对路径找到map文件:
keyboard_mapping:= enabled=1, map=gui/keymaps/x11-pc-us.map
对于其中的cpu的配置部分,由于初学,就给他注释掉了,不然就会报错: cpu directive malformed.注释掉就不会报错了。
基本可以了,可以使用bochs开始操作系统之旅了。
刚开始进入的时候有点不太会使用,选择了6之后,出现窗口,对这bochs点击,就是没有响应,难道是死掉了???抱着尝试的态度在终端里面输入了exit,哇哦,果然就退出了,原来控制是在终端里面进行的阿,这就好办了,在出现了<bochs:1>时就键入b 0x7c00,这里就是程序里面的地址,接下来c,就是:
<bochs:1> b 0x7c00
<bochs:2> c
(0) Breakpoint 1, 0x00007c00 in ?? ()
Next at t=14040378
(0) [0x000000007c00] 0000:7c00 (unk. ctxt): mov ax, cs ; 8cc8
接下来可以
按需要显示CPU相关信息.按照书上介绍的使用dump_cpu显示语法错误,查询了一下,
这一篇帖子回答了原因,大概就是因为版本在2.3.5之后的都不支持着一条命令了,ok,命令记录一下,直观查看。
r
fp
mmx
sse
dreg
sreg
creg
之后输入输出信息如下:
<bochs:11> x /64xb 0x7c00
[bochs]:
0x00007c00 <bogus+ 0>: 0x8c 0xc8 0x8e 0xd8 0x8e 0xc0 0xe8 0x02
0x00007c08 <bogus+ 8>: 0x00 0xeb 0xfe 0xb8 0x1e 0x7c 0x89 0xc5
0x00007c10 <bogus+ 16>: 0xb9 0x10 0x00 0xb8 0x01 0x13 0xbb 0x0c
0x00007c18 <bogus+ 24>: 0x00 0xb2 0x00 0xcd 0x10 0xc3 0x48 0x65
0x00007c20 <bogus+ 32>: 0x6c 0x6c 0x6f 0x2c 0x20 0x43 0x72 0x61
0x00007c28 <bogus+ 40>: 0x7a 0x79 0x2e 0x4a 0x20 0x4f 0x53 0x00
0x00007c30 <bogus+ 48>: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
0x00007c38 <bogus+ 56>: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
<bochs:12> n
Next at t=14040382
(0) [0x000000007c02] 0000:7c02 (unk. ctxt): mov ds, ax ; 8ed8
<bochs:13> trace-reg on
Register-Tracing enabled for CPU0
<bochs:14> n
Next at t=14040383
eax: 0x00000000 0
ecx: 0x00090000 589824
edx: 0x00000000 0
ebx: 0x00000000 0
esp: 0x0000ffd6 65494
ebp: 0x00000000 0
esi: 0x000e0000 917504
edi: 0x0000ffac 65452
eip: 0x00007c04
eflags 0x00000082: id vip vif ac vm rf nt IOPL=0 of df if tf SF zf af pf cf
(0) [0x000000007c04] 0000:7c04 (unk. ctxt): mov es, ax ; 8ec0
<bochs:15> c
^CNext at t=75215074136
eax: 0x00001301 4865
ecx: 0x00090010 589840
edx: 0x00000000 0
ebx: 0x0000000c 12
esp: 0x0000ffd6 65494
ebp: 0x00007c1e 31774
esi: 0x000e0000 917504
edi: 0x0000ffac 65452
eip: 0x00007c09
eflags 0x00000082: id vip vif ac vm rf nt IOPL=0 of df if tf SF zf af pf cf
(0) [0x000000007c09] 0000:7c09 (unk. ctxt): jmp .-2 (0x00007c09) ; ebfe
<bochs:16> exit
eax: 0x00001301 4865
ecx: 0x00090010 589840
edx: 0x00000000 0
ebx: 0x0000000c 12
esp: 0x0000ffd6 65494
ebp: 0x00007c1e 31774
esi: 0x000e0000 917504
edi: 0x0000ffac 65452
eip: 0x00007c09
eflags 0x00000082: id vip vif ac vm rf nt IOPL=0 of df if tf SF zf af pf cf
(0).[75215074136] [0x000000007c09] 0000:7c09 (unk. ctxt): jmp .-2 (0x00007c09) ; ebfe
ok,显示成功,上面出现了我的输出信息,小激动哦,
节本汇编书,好好研究这本书,寒假一定要坚持下来,吼!