您的位置:首页 > 其它

30天自制操作系统day01

2014-09-26 14:34 127 查看
第一天的标题,从计算机结构到汇编程序入门。

代码地址:https://github.com/passengerxlt/30OS_Ubuntu

终于能实践了,还这有点小激动呢。

。先安装Ubuntu 14.4,联网更新到最新。安装Emacs,nasm,gcc,qemu,bochs(主要用于调试,需自己下载源码,加上调试选项编译)。并安装中文输入法(Linux不愧是网络操作系统,没了网络真是方便工作,安装软件的过程中可能会出现各种错误,每个人遇到的错误可能不同,但在网上基本都能找到解决方法)。

这一天作者共讲了一下内容:

1. 作者上来就用二进制编辑器制作了一个软盘镜像boot.img。

像作者一样,现在已经不需要再去购买软盘,再说就算想买也不一定买得到。本人使用qemu加载软盘镜像,命令:qemu-system-i386 -fda boot.img -boot a -no-acpi

qemu通过命令配置,需要的命令参数可通过--help查询。此处意思是:禁用ACPI,从软盘A启动,文件boot.img当作软盘A镜像。

2. 为什么使用二进制编辑器写文件这种方法也能开发操作系统?

从电脑的结构说起,电脑最重要的核心即CPU,只能与其他电路交换电信号,而且它只能理解ON和OFF两种状态。我们所理解的事物,如音乐、文章、代码等对它来说都一样,最终都是电信号。二进制的0和1可以与电信号对应起来,而二进制可以与十进制对应起来表示数,也可以与文字对应起来表示文字,然后文章,音乐等,所谓一生二,二生三,三生万物。

CPU除了处理数据之外,我们还能用电信号向CPU发送指令。我们编写的程序最终会被转化成电信号发送给CPU。

软盘使用磁极的N极和S极表示二进制的0和1.

所以我们可以使用二进制编辑器制作出电脑中的任何数据,如图片,软件,数据库,音乐文章等,当然操作系统也同样可以。

3. 使用汇编生成软盘镜像

作者使用的是自己开发的汇编编译器nask,本人只能乖乖的使用nasm,当然nasm还是比较强大的(嘿嘿,

,正在体验)。

作者先是只用最牛*的能作出任何数据的DB指令编写。然后又使用了第二牛*的RESB指令,即nasm 的times DB,一下省却了不少的麻烦事。最后对数据做了分段的解释,大概意思。

最终代码:

{CSDN:CODE:

; hello-os

; TAB=4

; 以下这段是标准FAT12格式软盘专用的代码

    DB    0xeb, 0x4e, 0x90

    DB    "HELLOIPL"        ; 启动去的名称可以是任意的字符串(8字节)

    DW    512            ; 扇区大小(必须512)

    DB    1            ; 簇的大小(必须一个扇区)

    DW    1            ; FAT的起始位置(一般从第一个扇区开始)

    DB    2            ; FAT的个数(必须为2)

    DW    224            ; 根目录的大小(一般设成224项)

    DW    2880            ; 该磁盘的大小(必须2880扇区)

    DB    0xf0            ; 磁盘的种类(必须是0xf0)

    DW    9            ; FAT的长度(必须是9扇区)

    DW    18            ; 1个磁道有几个扇区(必须是18)

    DW    2            ; 磁头数(必须是2)

    DD    0            ; 不使用分区,必须是0

    DD    2880            ; 重写一次磁盘大小

    DB    0,0,0x29        ; 意义不明,固定

    DD    0xffffff        ; (可能是)卷表号码

    DB    "HELLO-OS   "        ; 磁盘的名称(11字节)

    DB    "FAT12   "        ; 磁盘格式名称(8字节)

    times 18 DB 0            ; 先空出18个字节

; 程序主体

    DB    0xb8, 0x00, 0x00, 0x8e, 0xd0, 0xbc, 0x00, 0x7c

    DB    0x8e, 0xd8, 0x8e, 0xc0, 0xbe, 0x74, 0x7c, 0x8a

    DB    0x04, 0x83, 0xc6, 0x01, 0x3c, 0x00, 0x74, 0x09

    DB    0xb4, 0x0e, 0xbb, 0x0f, 0x00, 0xcd, 0x10, 0xeb

    DB    0xee, 0xf4, 0xeb, 0xfd

;信息显示部分

    DB    0x0a, 0x0a

    DB    "hello, xielantian's world!"

    DB    0x0a

    DB    0

    times     0x1fe-($-$$) DB 0

    DB    0x55, 0xaa

; 启动区以外部分的输出

    DB    0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00

    times 4600 DB 0

    DB    0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00

    times 1469432    DB 0

}

本人遇到的问题:

1. times 0x1fe-$ DB 0编译出错,修改为times 0x1fe-($-$$) DB 0通过。原因应该与分段有关,本程序只有一段,结果不影响。

2. qemu找不到;由于版本问题,qemu名称有所变化,本人使用的是64位系统,所以调用qemu-system-i386.

3. bochs链接失败;一个关于lpthread库的问题,需要修改Makefile配置文件。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息