Linux教程

30天自制操作系统(一)从计算机结构到汇编程序入门

本文主要是介绍30天自制操作系统(一)从计算机结构到汇编程序入门,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

其实本文的绝大多数的内容都是根据《30天自制操作系统》进行撰写的。可以把本文看做是原书的一些辅助教程吧。

在阅读文章之前,建议大家手头有一本《30天自制操作系统》以及其附带的文件。附带光盘中的文件,很多网上都有下载。

我们先看第一章。第一章的内容简单概括一下:

1.用十六进制编辑器(叫二进制编辑器也可以,个人习惯)编写img文件

2.汇编语言的DB和RESB指令

 

首先,我们先看十六进制编辑器。原文是这样写的:

 

 

 

 

 这个网页在笔者的电脑上是打不开的,下图:

 

由于原书的出版年代较早,导致部分网页是打不开的,对于这类十六进制编辑器之类的辅助工具,笔者这里找到一个网址:

https://www.cr173.com/soft/44565.html

打开应该是这样的:

 

 

 

 

 

 左边的东西是十六进制的编码,右边的其实是把十六进制的编码转换为字符后的编码。这样我们就可以看到一些字符串的值。例如,右边类似HELLOIPL FAT32等标记就是字符串。

如果要运行的话,注意!把z_tools文件夹复制到同一目录下!

 

 这样,我们就完成了最简单的操作系统的开发。

 

 顺带说明一下,

 

其中的美元符号其实是反斜杠。这是由于日语编码的问题。

 

后面对于十六进制和二进制的相关介绍,原书写的很清楚,这里不再阐述。

然后我们就开始编写汇编语言程序了。其实在现在这个年代,其实汇编语言已经很少再使用了。不过在操作系统的领域内,汇编语言其实也是不可缺少的。

    DB    0xeb, 0x4e, 0x90, 0x48, 0x45, 0x4c, 0x4c, 0x4f
    DB    0x49, 0x50, 0x4c, 0x00, 0x02, 0x01, 0x01, 0x00
    DB    0x02, 0xe0, 0x00, 0x40, 0x0b, 0xf0, 0x09, 0x00
    DB    0x12, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00
    DB    0x40, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x29, 0xff
    DB    0xff, 0xff, 0xff, 0x48, 0x45, 0x4c, 0x4c, 0x4f
    DB    0x2d, 0x4f, 0x53, 0x20, 0x20, 0x20, 0x46, 0x41
    DB    0x54, 0x31, 0x32, 0x20, 0x20, 0x20, 0x00, 0x00
    RESB    16
    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, 0x0a, 0x0a, 0x68, 0x65
    DB    0x6c, 0x6c, 0x6f, 0x2c, 0x20, 0x77, 0x6f, 0x72
    DB    0x6c, 0x64, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00
    RESB    368
    DB    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0xaa
    DB    0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00
    RESB    4600
    DB    0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00
    RESB    1469432

这段东西中只有DB和RESB指令。仔细一看就知道和刚才的img一样的。

DB表示往这个文件里面放入一个字节的指令。DB是data byte的缩写。RESB表示空出相应的字节数,填充0x00。

这样,我们就往文件里面写入了1440KB的指令。系统起动时候,会把这些指令放入内存中进行执行。(系统是不会直接在软盘执行数据的,因为内存相对磁盘读写比较快)

理解了这些,我们来看看helloos2.

; hello-os
; TAB=4

; 以下は標準的なFAT12フォーマットフロッピーディスクのための記述

        DB        0xeb, 0x4e, 0x90
        DB        "HELLOIPL"        ; ブートセクタの名前を自由に書いてよい(8バイト)
        DW        512                ; 1セクタの大きさ(512にしなければいけない)
        DB        1                ; クラスタの大きさ(1セクタにしなければいけない)
        DW        1                ; FATがどこから始まるか(普通は1セクタ目からにする)
        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        0xffffffff        ; たぶんボリュームシリアル番号
        DB        "HELLO-OS   "    ; ディスクの名前(11バイト)
        DB        "FAT12   "        ; フォーマットの名前(8バイト)
        RESB    18                ; とりあえず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        ; 改行を2つ
        DB        "hello, world"
        DB        0x0a            ; 改行
        DB        0

        RESB    0x1fe-$            ; 0x001feまでを0x00で埋める命令

        DB        0x55, 0xaa

; 以下はブートセクタ以外の部分の記述

        DB        0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00
        RESB    4600
        DB        0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00
        RESB    1469432

这段东西是直接在附带光盘复制过来的,因此注释都是日语版本的。

原书中有中文版本的注释,写的很清楚,这里不再阐述。最前面的部分是起动区的标准写法。

补充内容:

1.起动区的最后两个字节必须为0x55和0xaa

2.汇编语言的字符串没有转义字符,需要手动在后面添加DB 0x0a,不能写作:DB"hello world\n"这样输出不对,出现下图的情况

(C语言写多的人一定要注意!)

 

这篇关于30天自制操作系统(一)从计算机结构到汇编程序入门的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!