30天自制操作系统之第1天

来源:互联网 发布:sql server 混合模式 编辑:程序博客网 时间:2024/06/06 18:45

转载自:http://www.fanis.cn/post/16

本节从计算机结构讲到汇编程序编写的最小化启动程序加载器IPL(Initial Program Loader),汇编编译器使用NASM,虚拟机使用QEMU,每个章节都有对应的代码段,是编写操作系统非常实用的一本教材。

这里制作软盘的代码含义如表中所示:

偏移

字节

内容/含义

(参考)值

0

3

跳转到软盘指令开始处的跳转指令

jmp l_start(l_start为软盘内第一条指令处的标号)

3

8

第一个扇区的名字

"xnlosipl"

11

2

软盘每个扇区的大小(字节为单位)

必须为512

13

1

每簇的扇区数

必须为1

14

2

保留扇区数/FAT的起始位置/Boot记录占用扇区

一般为1

16

1

FAT的个数

必须为2

17

2

根目录文件数的最大值

一般为224

19

2

扇区总数

(必须为)2880

21

1

介质描述符

必须为0xf0

22

2

每FAT扇区数

必须为9

24

2

每磁道扇区数

必须为18

26

2

磁头数

必须为2

28

4

隐藏/不使用的扇区数

必须为0

32

4

如果偏移19处值为0,由这个值表示总扇区数

2880

36

1

中断13h的驱动器号

固定为0

37

1

未使用

固定为0

38

1

扩展引导标记

固定为0x29

39

4

卷列序号

0xffffffff

43

11

软盘名称

"xnlhello-os"

54

8

软盘格式名称

"FAT12   "(8字节,空格填充)

62

448

(引导)代码、数据及其它填充字符

……

510

2

标明软盘有无所需的启动代码(在第一个扇区内)

0x55aa(为0x55aa表明有)

 

 

下面直接上本章代码:

  1. ; hello-os
  2. ; TAB=4
  3.  
  4. ;以下的记述用于标准FAT12格式的软盘
  5.  
  6. DB0xeb,0x4e,0x90
  7. DB"HELLOIPL";启动区的名称可以是任意的字符(8字符)
  8. DW512;每个扇区的大小
  9. DB1;簇的大小(必须为1个扇区)
  10. DW1; FAT的起始位置(一般从第一扇区开始)
  11. DB2; FAT的个数(必须为2
  12. DW224;根目录的大小(一般设为224
  13. DW2880;该磁盘的大小(必须为2880扇区)
  14. DB0xf0;磁盘的种类(必须是0xf0
  15. DW9; FAT的长度,必须是9扇区
  16. DW18;1个磁道有几个扇区,必须是18
  17. DW2;磁头数,必须是2
  18. DD0;不使用分区,必须是0
  19. DD2880;重写一次磁盘大小
  20. DB0,0,0x29;意义不明,固定
  21. DD0xffffffff;卷标号码
  22. DB"HELLO-OS ";磁盘名称
  23. DB"FAT12 ";磁盘格式
  24. RESB18;空出
  25.  
  26.  
  27. ;程序主体
  28.  
  29. DB 0xb8,0x00,0x00,0x8e,0xd0,0xbc,0x00,0x7c
  30. DB 0x8e,0xd8,0x8e,0xc0,0xbe,0x74,0x7c,0x8a
  31. DB 0x04,0x83,0xc6,0x01,0x3c,0x00,0x74,0x09
  32. DB 0xb4,0x0e,0xbb,0x0f,0x00,0xcd,0x10,0xeb
  33. DB 0xee,0xf4,0xeb,0xfd
  34. ;信息显示
  35.  
  36. DB 0x0a,0x0a;2个换行
  37. DB "hello,world"
  38. DB 0x0a;换行
  39. DB 0
  40. RESB 0x1fe-$ ;填入0x00,直到510字节
  41. DB 0x55,0xaa
  42. ;启动区以外部分的输出
  43.  
  44. DB 0xf0,0xff,0xff,0x00,0x00,0x00,0x00,0x00
  45. RESB 4600
  46. DB 0xf0,0xff,0xff,0x00,0x00,0x00,0x00,0x00
  47. RESB 1469432

0 0
原创粉丝点击