Keep Thinking

Clean Accout. God death. So, goodbye and good luck.
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

[翻译]如何用汇编创建一个基础内核

Posted on 2011-03-10 23:20  gelosie  阅读(564)  评论(0编辑  收藏  举报
原文是 OSDev Wiki上的一个 Tutorials 文章。

1,第一个启动扇区

2,使用BIOS写消息

3,看看机器码

4,不用BIOS向屏幕打印输出

5,中断

6,进入保护模式

7,非实模式

8,32 位打印输出

附录A,更多资讯

1,第一个启动扇区

 代码

 下面的代码可能是从软盘启动的最小代码的例子。

1 ; boot.asm
2  hang:
3      jmp hang
4      times 512-($-$$) db0

 在实模式下,CPU启动,然后BIOS从地址0000:7C00处开始加载代码。在NASM汇编器中,“ times 512 ...”是指

用0填充满512字节。有时候会用另一种表述,在十六进制中 200 等于 十进制中的 512。

经常地,你会在最后看到一个叫启动标识符的东西: 0xAA55。旧版本的 BIOS 通过检查这个标记去差别磁盘上是否

是一个启动扇区。现在,这个是不必要的,若是必要的,最后的代码行会用这个标识符替换 。如下面的版本:

1 ; boot.asm
2  hang:
3     jmp hang
4  
5     times 510-($-$$) db 0 ; 留下最后2字节
6      db 0x55
7     db 0xAA

但是,我需要指出的是,当你用这些代码启动,你会看光空白的屏幕同闪烁的光标。你或许会注意到了另外两件事:一个是软驱马达已经关闭,另一个是,你可以按 Ctrl-Alt-Del来重新启动。这儿的重点是,中断(如 0x09 号中断)仍然像平常一般生效。

下面,试试关中断看看发生了什么事情:

1 ;boot.asm
2       cli ; 关中断
3   hang:
4      jmp hang
5  
6      times 510-($-$$) db 0
7      db 0x55
8      db 0xAA

你会看到,软驱马达没有关闭,并且不能通过 Ctrl-Alt-Del来进行重启。

如何你移除循环代码,用0填满启动扇区,BIOS对此会给出一些提示。在我的机器上是“Operating System Not Found”。

我换没有尝试用0填满除启动标示符外的启动扇区会是什么情况。

创建磁盘镜像

 上面代码是NASM汇编代码。用partcopy, dd 或者debug得到到软盘。然后你能从这个软件启动

windows

1 nasmw boot.asm -f bin -o boot.bin
2 partcopy boot.bin 0 200 -f0 
3  OR
4 debug boot.bin
5 -W 100 0 0 1

6 -Q  


Unix

1 nasm boot.asm -f bin -o boot.bin

2dd if=boot.bin of=/dev/fd0

(第一篇END)