読者です 読者をやめる 読者になる 読者になる

OS自作3日目その3

1段階あきらめて,先駆者がいないが検索.

Linuxで開発してる人はけっこういるが,
tolsetを使ってない人は少ないみたい.

それっぽいサイトがあったらしいけど,リンク切れ.
どうやら自分で開拓するしかないらしい.

あとひとつ,ヒントを見つけた.
naskとnasmでアセンブル結果が違うらしい.

ヒントというより諦めろ宣告.
もうちょっと粘るか.

とりあえず,printfデバッグはできないけど,
CPU使用率である程度判断できる.

現状,harib00iあたりまで作ったを起動するとCore i7 620Mさんの1つが100%までいくので,
HLTのループができてるかできてないかで判断することができる.

ってわけで,前までのfin:のループをコピペして,検討をつけつつずらしていく.
fin:
HLT
JMP fin

すると,
「; 残り全部」
のコメント以下の塊がおかしい.

どうやらmemsetが無限ループしておる.
CYLSの指す先は0.
vFATとして書き込んだのが仇になったのかな.

ここはとりあえずアセンブリを書かずに定数を書き込んじゃって終了.
512 * (80 * 2 * 18 - 1) / 4
ちょっと不安だけどこれでおk(?).

さて,このmemcpyが終わると,
finループはちゃんとHLTしてくれてるらしい.
一見落着.

っと思ったらすぐ下の
「; bootpackの起動」
のあたりも無限ループ.
memcpyまたお前か.

アセンブリがなにやってるのかさっぱりなので,
本を読み進めると,p171あたりに記述が.

うーん,ちゃんとC言語の関数として呼び出しているようだ.
ぐぬぬ.

こまったことに,僕は,
intel2gas -g
で変換したんですが,
いろいろと変換しきれなかったものがあって,
最終的に
gcc -S bootpack.c
intel2gas -g bootpack.s | sed "/^MISMATCH.*/D" | sed "/.*SECTION.*/D" | sed "/.*GLOBAL.*/D" | sed "/¥..*/D" | tail -n +2 | sed "s/L2/bootpack/g" > bootpack.asm

と呪文のような形に落ち着いたわけです.

こいつの出力結果bootpack.asmは
bootpack:
        jmp bootpack

となるわけでして,
関数呼び出しもクソもあったもんじゃないわけです.

p171あたりに記述を見ると,
tolsetを使って変換したアセンブリには,ちゃんとヘッダがあるみたいでして,
あのへんは,それに合わせて作られているわけです.

よし,めんどくさいので,カットだっ
MOV	EBX,BOTPAK	; ベースレジスタを設定
JMP	DWORD 2*8:0x00000000	;もちろん先頭から呼びます


これで,無事harib00iまで終了…でいいのか?

で,やっぱり次に行くとえらい目に会います.

;FILE "bootpack.c"
        SECTION .text
GLOBAL HariMain
        GLOBAL HariMain:function
HariMain: 
.LFB0: 
MISMATCH: "        .cfi_startproc"
MISMATCH: "        pushq   %rbp"
MISMATCH: "        .cfi_def_cfa_offset 16"
MISMATCH: "        movq    %rsp, %rbp"
MISMATCH: "        .cfi_offset 6, -16"
MISMATCH: "        .cfi_def_cfa_register 6"
L2:
        call    io_hlt
        jmp L2
MISMATCH: "        .cfi_endproc"
.LFE0: 
        GLOBAL  HariMain:function (.-HariMain)
        ;IDENT "GCC: (Debian 4.4.5-8) 4.4.5"
MISMATCH: "        .section        .note.GNU-stack,"",@progbits"


オラオラ,intel2gasさんヨォ,いい度胸してんじゃねーか
リンカ?そんなもんsedとその愉快な仲間たちでフルボッコにしてやんよ

intel2gas -g bootpack.s | sed "/^¥..*/D" | sed "/^MISMATCH.*/D" | sed "/.*SECTION.*/D" | sed "/.*GLOBAL.*/D" | tail -n +3 | sed "s/L2/bootpack/g" > bootpack.asm
cat libutix.asm >> bootpack.asm

まさに外道
まちがってるっぽいし