忍者ブログ

Cyber Bird

   

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

Share on Google+

OS自作入門 onLinux 2日目

OS自作、2日目です。試験中なのは秘密
2日目は結構楽だったので、まとめていきます。

実は、IPLを読み込む位置がうまくいかず、バイナリを解読してたんですが…

まずはソースコードをGAS用に変換します。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
.code16
.text
    jmp entry
 
    .byte 0x90
    .ascii "HELLOIPL"   # ブートセクタの名前
    .word 512       # 1セクタの大きさ
    .byte 1         # クラスタの大きさ
    .word 1         # FATがどこから始まるか
    .byte 2         # FATの個数
    .word 224       # ルートディレクトリのサイズ
    .word 2880      # このドライブの大きさ
    .byte 0xf0      # メディアのタイプ
    .word 9         # FAT領域の長さ
    .word 18        # 1トラックにいくつのセクタがあるか
    .word 2         # ヘッドの数
    .int 0          # 必ず0
    .int 2880       # ドライブのサイズ
    .byte 0, 0, 0x29
    .int 0xffffffff     # ボリュームシリアル番号
    .ascii "HELLO-OS   "    # ディスクの名前
    .ascii "FAT12   "   # フォーマットの名前
.skip 18, 0x00          # 18バイト空ける
 
# プログラム本体
entry:
    movw $0, %ax        # レジスタ初期化
    movw %ax, %ss
    movw $0x7c00, %sp
    movw %ax, %ds
    movw %ax, %es
     
    movw $msg, %si
putloop:
    movb (%si), %al
    addw $1, %si
    cmpb $0, %al
    je fin
    movb $0x0e, %ah     # 一文字表示BIOSコール
    movw $15, %bx       # カラーコード
    int $0x10       # ビデオBIOS呼び出し
    jmp putloop
fin:
    hlt
    jmp fin
 
.data
msg: .string "Hello, world!\n"
まずは、コメントがついてなかったので、すべてつけました。
今回はちょっとずつGASのソースも解説していきます。

1行目.code16ディレクティブは、16bit用のバイナリを吐きます。
.byte、.word、.int、.ascii、.skipは前回説明したので省略。

26行目からプログラム本体です。
mov命令"w""b"とついていますが、GASではオペランドが2バイト(16bit)なら"w"を、
1バイト(8bit)なら"b"を命令のあとにつけることになってます。
ちなみに、4バイト(32bit)なら"l"、8バイト(64bit)なら"q"です。
あと、GASではデフォルトではAT&T記法なので、Intel記法のアセンブラと
ソースオペランドとデスティネーションオペランドが逆になっているのに注意。

(例) AT&T:movw $0, %ax → Intel:mov ax, 0

33行目でmsgのアドレスをsiレジスタに入れていますが、
ラベルのアドレスをレジスタにぶち込むときは"$"をつける。

35行目、siレジスタの数値をアドレスをして利用するときは
nasmでは[](大括弧)でくくるが、GASでは()(中括弧)でくくる。
※これはアドレッシングモードという使い方だが、厳密な説明は省く

48行目で.stringディレクティブをつかっているが、これと.asciiの違いは
「最後に自動で"\0"が入るかどうか」だけ。
.stringなら、勝手にヌルバイトが入る。

あとはOS自作本通りの説明です。



このIPLのソースだけでは、OS自作本にあるように0x7c00にロードしたり
できません。最後の0x55AAも消しましたし、1440KBまで埋めるような記述もありません。

まずは、リンカスクリプトを拡張します。

1
2
3
4
5
6
7
8
9
10
OUTPUT_FORMAT("binary");
IPLBASE = 0x7c00;
 
SECTIONS {
    . = IPLBASE;
    .text   : {*(.text)}
    .data   : {*(.data)}
    . = IPLBASE + 510;
    .sign   : {SHORT(0xaa55)}
}
2行目に、IPLBASEという変数を定義します。
リンカスクリプトは、3行目から始まるSECTIONSコマンドで、バイナリを制御できます。
詳しいことはあまり触れませんので、興味があったらこちらをどうぞ。



さて、それではMakefileを作ります。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
IMG=os.img
IPL=ipl.bin
 
all : ipl.s
    make ipl
    make img
    make run
 
os.img : $(IPL)
    mformat -f 1440 -C -B $(IPL) -i $(IMG) ::
 
ipl.bin : ipl.s ipl.ls
    gcc ipl.s -nostdlib -Tipl.ls -o $(IPL)
 
run : $(IMG)
    qemu -m 32 -localtime -vga std -fda $(IMG)
 
ipl :;  make ipl.bin
img :;  make os.img
ファイル名は以下のようになっています。
IPLのソース:ipl.s
リンカスクリプト:ipl.ls
OSイメージ:os.img

OSイメージを作る時に、mformatコマンドを用いています。
これで1440KBまで埋めます。

また、QEMUに新しいオプションを色々つけています。
-m:RAMのサイズ(MB単位)
-localtime:ホストの時刻をゲストに設定する
-vga:VGAグラフィックスカードを設定する(stdで標準)



これで準備は整いました。

$ make run

ddec4484.png

前回と何の変化もありませんが、できました。
3日目はちょっと大変なんですよね。頑張ります。
PR
Share on Google+

COMMENT

NAME
TITLE
MAIL(非公開)
URL
EMOJI
Vodafone絵文字 i-mode絵文字 Ezweb絵文字
COMMENT
PASS(コメント編集に必須です)
SECRET
管理人のみ閲覧できます

TRACKBACK

Trackback URL:

ブログ内検索

プロフィール

HN:
levelfour
性別:
男性
自己紹介:
ぼちぼち更新を再開する予定です。

twitter

最新コメント

[09/27 菜々氏]
[06/17 NONAME]
[04/30 mithril]
[04/29 Liva]
[01/30 NONAME]

最新トラックバック

コガネモチ

Copyright ©  -- Cyber Bird --  All Rights Reserved
Design by CriCri / Photo by Geralt / powered by NINJA TOOLS / 忍者ブログ / [PR]