疑問のまとめ(途中)
本書を読んでそういうものとして次に進んだけど、やっぱり納得できなくてもう一度調べ直したもの。
引用箇所を自分用にわかりやすくまとめています。
徐々に増やしていく予定。
●全体
言語を基準にした目次
http://hrb.osask.jp/wiki/?prog_index
前に出てきた命令なんかを忘れたときに見返すとやりやすい。
●2日目
ADD CX, 0x1234 は 81 C1 34 12 という4バイトの命令だが、
ADD AX, 0x1234 は 05 34 12 という3バイトの命令。
機械語に直してみると本当にそうなってる。
1234が34 12になってしまうのと同じように、そういうものらしい。
nasmでコンパイルしてみるとわかる。
http://road-of-os.blogspot.com/2007/10/2makefile1.htmlを参照
●4日目
(http://hrb.osask.jp/wiki/のq_aから抜粋)
<問い>
write_mem8という関数をアセンブラで作っていますが、MOV ECX,[ESP+4] MOV AL,[ESP+8]というところが分かりません。
なぜ[ESP+4]にアドレスが入っていることが分かったのでしょうか?
そしてなぜ、[ESP+8]にデータが入っていることが分かったのでしょうか?
また、p.70に「C言語でwrite_mem8が使われると・・・そして、その時に指定された数字はメモリにメモしてありまして、それぞれ
1番目のもの:[ESP+4]
2番目のもの:[ESP+8]
3番目のもの:[ESP+12]
4番目のもの:[ESP+16]
とありますが、コレは
1番目にVRAMのアドレス、
2番目に15、
3番目にまたVRAMのアドレス、
4番目に15ということでしょうか?
そして値が4増えていっているのは32ビットモードだからでしょうか?
<回答>
簡潔に言えば、なぜ分かったのかというと、tolset内のコンパイラは自分で(=著者自身が)作ったコンパイラだからです。
自分で作った以上、メモリのどこに格納されるような機械語になるかは当然分かっていたわけです
(まあ他の人が作ったコンパイラもたいていは同じですが)
そして[ESP+4]と[ESP+8]についてはそのとおりですが、今回のwrite_mem8には3番目や4番目の数値はないので、[ESP+12]や[ESP+16]に書かれている値がどんなものかはわかりません。
値が4ずつ増えるのは、そうなるようにコンパイラを作ってしまったからというだけの理由で、32bitモードかどうかは直接は関係ありません
●12~13日目
割り込みハンドラ、FIFOバッファって何だっけ?
FIFOの基本的な説明は6日目に戻って読む。
(ファイルの分割についても6日目、結構重要な日)
さらに詳細は7日目。
FIFOについては以下の説明が詳しく、わかりやすい。
http://bttb.s1.valueserver.jp/wordpress/blog/2018/01/01/makeos-7-2/
FIFOバッファそのものの詳細は以下。
(30日本を読んでる方なのでわかりやすい)
http://uchan.hateblo.jp/entry/2019/05/03/220443
●15日目
「*8」の正体
現在動いているタスクの GDT番号x8倍(←ここがインテルの仕様)
http://osjisaku30.g.hatena.ne.jp/bluespear/20060812
https://yuyubu.hatenablog.com/entry/2018/06/07/30%E6%97%A5OS%E8%87%AA%E4%BD%9C%E6%9C%AC16%E6%97%A5%E7%9B%AE
selはGDTの番号のこと
https://kobapan.hatenadiary.org/entry/20090518/1242644719
15日目(おまけ:実機での起動)
USBメモリでブートする実機での起動がどうしてもできず諦めかけていたが、なんとか見つけた。
以下を参照して、ipl10.asmにそのままコピペした。
とても丁寧に解説されていてとてもありがたい。感謝です。
しかし内容は、自分の頭では理解できなかった…そもそもipl10.asmの存在をすっかり忘れていた。
また改めてこの辺りの章を読み直したい。
さっそく自分の環境で別フォルダ(tolset/haribote_jikki)を作成し、そこに現在Haribote OSを作成しているファイルを全部コピーし、ipl10.asmだけは中身を上記の内容にコピペする。
これでいつも通りにimgファイルを作成。
ddコマンドでUSBメモリに書き込む。
ずっとここで引っかかっていたのに気付いていなかった。
USBメモリに書き込みの際の場所が違ってたのと、あとはbsの値とsyncを入れるのが正解だったらしい。
起動可能なUSBメモリを作成できたコマンドは以下の通り。
$ sudo dd bs=4M if=haribote.img of=/dev/sdb && sync
自分のPCのBIOSをレガシーモードにして、USBメモリから起動すればHaribote OSが起動する。
ちなみにUSBメモリの内容をQEMUで起動するときは、
$ sudo qemu-system-x86_64 -m 1024 -hda /dev/sdb
で起動できた。
実機での起動はいろいろ試した結果なので、正直どうしてこれが良かったのかが不明。
なぜimgファイルの書き込み先を、USBメモリのパーティションでなく本体そのものを指定しなければいけなかったのか、syncを付けたのが何故正解だったのか、とか。
(他の起動ディスク作成の時はそんなことはなかった気がする)
それにもしかするとUSBメモリ本体の相性もあるのかと、いくつか別のものを使ってみたりもした。
フォーマットの方法もいじってみた。
だが結局、USBメモリ自体には罪はなかったようだ。
書き換えたipl10.nas自体は全く問題ないので、あとは使うPCに合った方法を模索するしかなさそうだ。
とにかく、これで今後は実機での確認もできるようになる。かなり楽しくなってきた。
今回参照させて頂いたサイト:
https://qiita.com/machine_engineer/items/9b0c74f59aba9c0a2ed1
https://yohgami.hateblo.jp/entry/20171210/1512888735
https://freepc.jp/bootusb
15日目(タスクスイッチとマルチタスク)
ちょうど半分まで来た。
本書によると、OSの開発に最低限必要な知識は13日目辺りまでらしい。
なのでこの辺りに来ると構造がだいぶわかりやすくなってくると思う。
C言語にもだいぶ慣れてきたが、未だになんとなくわかった感じしかしていない。
また、実機で起動してみたくてUSBメモリにimgファイルを書き込んでみたが、どうしてもできないので諦めた。
BIOSの設定を変えれば起動できている人もいるようだが、簡単には行かないような話もよく見るのでよく解らない。
でもせっかくOSを作っているので、これはまたいずれ検討したい。
では続き。
マルチタスクの検証だが、最初は入力を止めたりまた動かしたりする程度でやることは地味。
いつものことだがnasmfanc.nasのsection .txtに追記を忘れて、エラーにかなり悩んだ。
(GLOBAL load_trとGLOBAL taskswitch4)
18行目あたりにいきなり出てくるvoid task_b_main(void)はプロトタイプ宣言だろうか?
だったら最後の行にあるやつはここに持って来れば良いんじゃないだろうか。(でも最後にあったほうがわかりやすいので、結局やってない)
harib12cではbootpack.cの構造体TIMERで*timer_tsの追記に気付いてなかった。
harib12d以降のカウントの数字は、いつものように"%10d"を"%d"に変更。
こうしないと数字が出なかった。
スピードアップのカウントは速すぎて、数字が全然追えなかったので正確にチェックできていない。
とにかく見ていると、速くなったことはなんとなくわかった。
あとはまたファイルが増えたので、mtask.c関連の追記をbootpack.hとMakefileに忘れないように。
ちょっと間が長かったので、忘れていることが多いのもミスの原因。
出来るだけこまめに進めていきたい。