OS自作入門3日目おわり、4日目にちょっと手を出した #osdevjp
実はサポートサイトを見ていなくてCDの内容を参照しているときに???と思いながら読み進めていたのだった
書籍の中にコード全部載っているわけじゃないのでCDの中身を見ながら進めないとうまく進まないっぽい。
32bitモードのところ実装していて、なんかうまく動いてないのは32bitモード以降のコードをちゃんと入れれてなかったからか......。
zip展開してiso開くと/media/sei/HariboteOS
あたりにマウントされたのでprojects/03_day
みていく。ありがてえ。。。
PIC無効化はこのへん使っていそう
The OUT instruction is very similar to the IN instruction. OUT outputs data from a given register (src) to a given output port (dest). In protected mode, the OUT instruction is frequently locked so normal users can't use it. X86 Assembly/Other Instructions - Wikibooks, open books for an open world
なるほど、ふつうのユーザーは使えない、理解。今から使えなくするんだな。
ポート番号0x21なんだろうと思ってググった 日記/2009/11/03/8259A(PIC)のIOポート番号が謎だった件 - Glamenv-Septzen.net
8259A、OS wikiにあるやん...!
よくわかっていないけど割り込みのマスクの設定で0xFFすると全部マスクされるよう
Clears the interrupt flag. Hardware interrupts cannot interrupt execution. Programs can still generate interrupts, called software interrupts, and change the flow of execution. Non-maskable interrupts (NMI) cannot be blocked using this instruction. X86 Assembly/Other Instructions - Wikibooks, open books for an open world
CLIはハードウェア割り込みを無効にしてる。
説明Wikipediaにもあった
waitkbdout
ってなんだー?と思ったら後ろのほうで定義されてた
待ってるポート0x64とは、でここ読んでいた。なるほど。(なんか説明逆っぽいところあったのでTwitterで報告した)
0から作るOS開発 カーネルローダその3 プロテクティッドモードへの移行とA20
instrsetはnasmでは削除でいいらしい
ところでA20とは、でここみつけた。キーボードポートに繋がってたからキーボードポートで設定できるの、おおらかな時代という感じ...!!
LGDTはOSしかつかわない、load gdtでgdtはglobal descripter table
X86 Assembly/Global Descriptor Table - Wikibooks, open books for an open world
LGDTにわたしてるGDTR0は後ろの方で定義されてるラベル この内容に基づいてGDTを設定する
なるほど、デフォルトだとGDTが16bitなんだな(確認したいけど確認するためにはアセンブリで数字表示とか書かないとだ...よ、余力があればで)
GDTここのページが説明詳しいけどちょっと読む元気がない、飛ばす。 Global Descriptor Table - OSDev Wiki
次にCR0設定している Control register - Wikipedia
ページ無効と32bitに移行
なんかなかなか動作しない。 bootpackからhltよべてなさそう。
結局memcpyのADD EDI, 4を忘れててコピーがちゃんとできてなかったのが問題だった....(爆死)
memcpy: MOV EAX, [ESI] ADD ESI, 4 MOV [EDI], EAX ADD EDI, 4 SUB ECX, 1 JNZ memcpy RET