您的位置:首页 > 其它

一步一步实现一个简单的OS(HelloWorld)

2016-02-29 11:53 337 查看
先弄个HelloWorld吧,虽然这个网上一大堆,不过不知道的人还是不少,就简单的弄一个吧。。。。。。。

系统启动时,第一步是BIOS自检(这个不管),然后从CMOS中设置的默认引导介质中加载第一个扇区(512字节)到内存的0x07C00处(0x0000:0x7C00),

之后,跳转执行。

所以,引导启动系统的第一部分就是对这512字节进行编程。。。

这次呢,就写一个简单的HelloWorld(启动后,在屏幕显示HelloWorld)。

其它功能不考虑,

下面我就开始整了,思想有写乱,你们讲究的看吧。

显示服务(Video Service——INT 10H)

13H号功能

入口:

AH = 13H

AL = 输出方式(用1号,具体为什么自己百度去)

BH = 页码(咱用0号的)

BL = 字符属性

CX = 字符串长度

DH,DL = (x, y) 坐标

ES:BP = 字符串地址

OK

开始吧

# bootasm.S    这里,扩展名必须大写,具体为什么,问GCC去

.globl start

start:   # 入口地址

.code16     # 声明是16位代码(为什么启动时要用16位代码。。。。自己百度去,,,)

# 初始化各个段寄存器
movw    %cs, %ax
movw    %ax, %ds
movw    %ax, %es
movw    %ax, %ss


# 设置栈顶
movw    $0x7C00, %sp

# 清一下屏幕吧。。。。
movw    $0x02, %ax
int     $0x10

# 显示Hello World !!!
movw    $putstr, %bp
movb    $0x13, %ah
movb    $0x01, %al
movb    $0x00, %bh
movb    $0x0F, %bl
movw    $14, %cx      # 14个字符
xorw    %dx, %dx      # 显示坐标为(0, 0)
int     $0x10

# 死循环,停机
1:
hlt
jmp     1b

putstr:
.ascii "Hello World!!!"
.byte 0
#  后面要多空开一行,不然编译不通过

编译命令为:
gcc -fno-builtin -O2 -MD -nostdinc -I. -c bootasm.S
然后链接:

ld -N -e start -Ttext 0x7C00 -o boot.o bootasm.o

最后把链接出来的boot.o转换为bin文件

objcopy -S -O binary -j .text boot.o boot

然后需要将boot扩展到512字节,

最后两个字节设置为

0x55, 0xAA

这是引导标志。

到这里,代码就编译完毕了。

用dd命令把boot写入硬盘镜像中

dd if=/dev/zero of=os0.00.img count=10000 # 创建一个硬盘镜像文件os0.00.img

dd if=boot of=os0.00.img # 把boot写入镜像开头,就是第一个扇区处

这个是截图:



然后就跑一下,看看效果吧。。。。



今天就到这里吧,。。。。。后面慢慢的往里面加功能

先整个简单的。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: