OS

『作りながら学ぶOSカーネル』 Chapter 06を読んでのつぶやき

OS

この章は細かなところで誤りが多いです。。 p169 セグメント領域の大きさを0に指定してもいいし、0xFFFFFにしても指定できる。 Limitはオフセットとして取り得る最大値なので、大きさ=(Limit+1)という関係があるはず。以下同様の表現がたくさん。。 図6-1…

OS作成(11) jmpによるタスク切り替え

OS

jmp+TSSによるタスク切り替え実装。 コーディングミスでたびたび例外が発生したので、int 0x0dなどが発生したときのため、int 0x00-0x13まではISRで要因を表示した後そこから抜けないように変更。#UDとか出るようになって、多少は原因特定が楽になったかも…

『作りながら学ぶOSカーネル』 Capter 05を読んでのつぶやき

OS

p137 Intel Core2以上のCPUが装着されているパソコンでは実行されません。CPU依存的なタスクスイッチング・コードなので、CPUが勝手に複数のコアにタスクを振り分けてしまうことに原因があります。 TSS経由のjumpとかがうまくいかないということだろうか。 …

OS(10) キーボードのスキャンコード

OS

VMwareでIBMのキーボードを使って確認したもの。転記ミスとかあるかも知れない。 CSSをいじれば綺麗な表ができるのだろうか。。 ESC 01 TAB 0f Shift(左) 2a Insert e0 52 F1 3b q 10 z 2c Home e0 47 F2 3c w 11 x 2d PageUp e0 49 F3 3d e 12 c 2e Delete…

OS(9) キーボード割り込みの処理追加

OS

ひとまず完成 作りながら学ぶOSカーネル―保護モードプログラミングの基本と実践 では単にキー入力があっただけしか分からないのが面白くなかったので 入力した文字を画面に表示する Enterキーに対応して改行する 画面が一杯になったら、スクロール などと欲…

『作りながら学ぶOSカーネル』 Chapter 04を読んでのつぶやき

OS

ソース4-2 cli mov al, 0xFF out 0xA1, al これだとスレーブだけ。もっとも cli を実行しているので割り込みが入らないのは同じ。 ソース4-2 isr_ignore: (中略) pushfd 割り込み発生時は、eflagsレジスタもスタックに詰まれ、iret時で復帰するので不要だ…

OS(8) PIC初期化、タイマ割り込み、ゼロ除算フォルト

OS

PIC初期化 PICを触るのは久しぶり。PC98/IBM-PCのMS-DOS用シリアルドライバを書いて以来。 PC-9800シリーズテクニカルデータブック (HARDWARE編) を持ち出して内容確認。 タイマ割り込み 10ms毎ということで早すぎるので、ソフトカウンタを仕込んで10回に1回…

OS(7) ソフトウェア割り込みを発生させてみる

OS

ISRとIDTが作成できたので、ソフトウェア割り込みが実行されることを確認する。 実行結果 ipl.asmの修正 kernel.binが大きくなってきたので、ロードサイズを2から16へ増やす。変更部分は次の箇所。 mov ax, 0x0210 ; 16セクタ読み出し kernel.asmの修正 変更…

OS(6) ISRとIDTを nasm のマクロでまとめて作成

OS

個々の割り込み番号毎に割り込みハンドラを定義するのにnasmのマクロを使用しようとしてはまる。 マクロ定義と繰り返し nasm では %macro 〜 %endmacro でマクロ定義が可能なので、次のようなマクロを記載する。 これは IRS_: というラベル定義と、eaxに番号…

OS(5) プロテクトモードへ移行

OS

次の内容で作成してみる。 フラットモデルとする IPLの動作は呼び出すプログラムを2セクタ分とする以外同じ 最初のセクタは(setup)、IPLから直接呼ばれ、GDTの設定とプロテクトモードへの移行を行うプログラムを入れる 次のセクタ(kernel)はプロテクトモード…

『作りながら学ぶOSカーネル』 Chapter 03を読んでのつぶやき

OS

いよいよプロテクトモード突入。 ソース3-1 ssは設定されているけれど、spが設定されてない。 プロテクトモード以降後のjmpでオペランドプレフィックスとアドレスプレフィックスの両方が必要なのだろうか? プロテクトモード以降後、ssを設定しているが、や…

OS(4) リアルモードのカーネルを呼び出してみる

OS

Chapter 02に倣ってIPLの次のセクタに配置されているプログラムをカーネルと見立ててロードしてみる。 ipl.asm スタックをIPLの直前へ明示的に設定 画面を青色で埋める プログラムを 1000:0000 へロードする FDが読めなかったときは int 0x18 を呼び出し、後…

OS(3) IPL開始時のスタックはどこ?

OS

この前は IPL 開始時点での cs:ip を確認したが、ss:sp はどうなんだろ?と思って作ったIPLがこれ。 実行例はVirtualPC2004のもの。これだとIPLより下位側のメモリにあるので、IPLがつぶされることはないですね。 IPLソース ; 開始時点の cs:ip, ss:sp 表示 …

『作りながら学ぶOSカーネル』 Chapter 02を読んでのつぶやき

OS

ソース2-1 0x***, ***h のどちらかに統一するほうが綺麗だと思う。 ソース2-2 ss は設定してあるけれど、spは? ss, sp を設定するときは、割り込み禁止にするのが良いと思う。 p31

OS(2) IBM-PCのVRAMの属性について動作確認してみた

OS

BM-PCのVRAMの属性について動作確認してみた。 画面の左側が背景色の変化、右側が文字色の変化となる。 ; ; VRAMの属性バイトの確認 ; [org 0x7c00] start: mov ax, 0xb800 ; VRAMセグメント mov es, ax xor di, di mov ax, 0x0741 ; 黒背景, 白文字, 'A' mo…

『作りながら学ぶOSカーネル』 Chapter 01を読んでのつぶやき

OS

IBM-PCのVRAMの属性について動作確認してみた。 ; ; VRAMの属性バイトの確認 ; [org 0x7c00] start: mov ax, 0xb800 ; VRAMセグメント mov es, ax xor di, di mov ax, 0x0741 ; 黒背景, 白文字, 'A' mov dx, 0x0041 ; 黒背景, 黒文字, 'A' mov cx, 16 ; 16回…

OS(1) IBM-PCのブートシーケンス

OS

IPLがロードされるメモリアドレス 周知のとおり、IBM-PCの場合BIOSの初期が完了後、BIOSの設定に従って検索された起動デバイスの先頭先頭セクタがメモリに読み込まれて実行開始するわけですが、物理アドレスで言うと0x7c00になります。 ただCPUはリアルモー…

このところ

OS

仕事では、とあるx86で動作する組み込みOSのMBR, IPLの解析とか、BIOSコールのバグ回避のためMBR, IPLを改造するだとか、いっそBIOSコールの代替ルーチンをMBR実行時にメモリに仕込むだとかやってたので、ここらでToy OSを書いてみようかと思う。 参考にする…