跟着写操作系统(开发环境的搭建)

5 篇文章 0 订阅
4 篇文章 0 订阅

    本来准备去图书馆借一本嵌入式的书回去研究研究,可是无意间被我发现了之前一直中青的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,显示成功,上面出现了我的输出信息,小激动哦,

    节本汇编书,好好研究这本书,寒假一定要坚持下来,吼!


  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值