OS自作入門19日目&20日目

アプリケーションとAPIの話でした。
ファイルを見つけると、メモリにロードしてセグメントを設定して実行してしまうという話。特権レベルが変わっていないせいか、ソースコードだけを見ているとOSとアプリケーションの区別がつかない気がした。
アプリケーションからOSの機能を呼び出すのは、ソフトウェア割り込みが一般的なんですかね。そういえばLinuxもint 0x80だし。その他、コールゲートというのがあるのは知っているけれど、他にはあるのかな。

OS自作入門17日目&18日目

コンソールの話でした。
コンソールと一口に言っても、やっていることは結構複雑なんだなと思った。今は、キーボードからしか入力を受け付けていないわけで、そのせいもあるのだろうけど。
harib14eで記号も入力できるようになっていますが、用意されたQEMUでは入力できません。最新のQEMUで試してみるとちゃんと入力できました。-std-vgaというオプションをつけないと、画面が1280x1024になってしまいますけど。アンダースコアとバックスラッシュが入力できないのはなぜかな。
カーソル点滅の制御などは、プロセス間で通信をやらないといけないわけですが、全部FIFOを使ってやっているのですね。これが、OSの特徴といえるのかな。

OS自作入門15日目&16日目

マルチタスクの話だった。
プリエンプティブとノンプリエンプティブの差って、案外小さいんだなと思った。実際、タスクの優先度をつけたりするのは、プリエンプティブでなければできないけれど。
処理する時間で優先度をつけるのは一般的なんですかね。
それに、カーネル内部の関数も1つのタスクとして独立して動かせるってのが新しかった。普通、アプリケーションやサーバを独立したタスクとして動かすことは、想像できるけれど。Linuxで、カーネルのログをとったりするデーモンも、こういう実装になっているんだろうか。起動の最初のほうで、いろいろ立ち上がっていることは気づいていたけれど。調べたことはないけど。
別にカーネルであろうとアプリケーションであろうと、つまり、特権レベルが違っていなくても、ある関数をタイマ割り込みで切り替えているんだから、同じなのか。
逆に、スレッドなどもTSSを1つ使ってGDTに登録してしまうという実装もありなんですね。コストがかかるけれど。
ただ、LinuxもWindowsも、プロセスの管理はx86の機能を利用せずに自前でやっていると聞いたことがある。x86_64になると、互換性のために残っているという感じだと思います。この辺、どうなっているのでしょう。

バイナリを更新

0.8.1のバイナリを更新しました。-vncオプションを使うのに、keymapsが必要なのですが入れ忘れていました。-k jaオプションをつけると日本語キーボードが使えます。
フロッピーは、Win98ゲストではフォーマットできないですね。Win2kゲストでは、2.88MBの項目は出てくるのですが、フォーマットしてみると1.44MBになってしまいます。問題は難しそう。

SpeedStepとPowerNow!

Linuxホストで、時計が正確にならないことがあるそう。どうやら、Mobile Pentium ⅢがTSC(Time Stamp Counter)を動的に変更しているみたいです。よくわからないけど、SpeedStepはソフトウェアの助けがなくても動くんですかね。
これには、ticks_per_secという変数が関係しています。ticks_per_secは、プログラムの起動時にCPUのTSCを読んで、一秒あたりのカウント数として算出しています。でも、途中で変わってしまうと時計の進み方がおかしくなってしまいます。
最近のPentium 4は、CPUのクロックにかかわらずTSCのカウント数が上昇するようになっているそうです。ますますわけわかんなくなってきているような気がする。CPUのモデルによって動作が違うのは対応するソフトウェアとしては悪夢ですね。
ticks_per_secをLinuxホストの/proc/cpuinfoから算出するパッチが出ていたので、改造して動くようにしてみました。Athlon 64 3000+で、cpuspeedサービス(PowerNow!)が動いている状態でも、Window 2000ゲストの時計がちゃんと動くことは確認しました。
Linuxゲストのときは、ゲストの起動時にclock=pitというオプションをつけないといけないです。TSCは変化しますので。
SpeedStepが有効なときでも、ちゃんと動くといいですけど。
http://www.h7.dion.ne.jp/~qemu-win/download/qemu-20060517-tps_from_proc.patch
CPUの状態の変化をキャッチして、ticks_per_secを較正できるといいなと思います。
とか思っていたら、常にTSCを測定したほうがいいといわれた。較正するには、それなりに時間がかかるんだけど。
SpeedStepがOSに因らないということは、WindowsホストでもQueryPerformanceCounterがTSCを使っていた場合は同じ問題が起こりうるということかな。

VLANとTap、みたび

WSAWaitForMultipleEventsは、WSAStartupが必要なことに気づく。なくても、大丈夫なみたいだけれど、WaitForMultipleObjectsの方が、ネットワークのイベントも待てるからいいなと思って、少しだけ変えてパッチを出しておいた。ちなみに、機能的には何も変わらないですけどね。
Linuxのベンチマークは時計が不安定だから動かないとかという話題が出ていたので、max-usr-freqを1024にセットし、cpuspeedサービスを止めれば大丈夫ということを伝えた。すると、Winホストでゲストの時計がおかしくてSolaris10がインストールできないとのこと。たぶん原因は違うところにあると思うけど。
Winホストでは、RTCを使っていないので設定する必要はありません。また、SpeedStep/PowerNow!は、コントロールパネル->電源オプション->電源設定で、最小の電源管理を他の項目に設定すると無効にできます。
でも、ACPIのパソコンなら、設定する必要はないと思います。もし、Win2kゲストでIEを動かしているときに時計が速く進むようならば設定する必要があります。

VLANとTapふたたび

VLANのパッチがうまくないとのこと。なかなかうまくつくれないんですけどね。難しい。
Tapのパッチも、ネットワークのイベントを待てるようにできないかとのこと。WSAWaitForMultipleEventsを使うと、動くのは確認できた。これでいいのかな。
Pollingもやめてと言われたけど、そうするとスレッドを使わないといけないんだよね。使ったことないけど。やってみようとは思うけど、うまく動くかな。データの受け渡しがよくわからないけど。

OS自作入門13日目&14日目

この前使ったタイマのバイナリを使うと、1/1000秒のタイマが作れます。
timer.cのinit_pit()の中で、こんな風に、0x04a9をPITに設定すればいいです。
io_out8(PIT_CNT0, 0xa9);
io_out8(PIT_CNT0, 0x04);
RTCを使ったタイマも作ってみましたが、やっていることはPITと同じなのでした。割り込みの終了をPICに通知するときは、マウスがやっているようにPIC0とPIC1の両方に通知しないといけなかったです。
14日目になって、ダイアログボックスに文字が入力できるようになって少し楽しいと思った。

kqemu-1.3.0pre7

kqemu-1.3.0pre7が出ています。
Linuxホストで、Fedora Core 4は、動くようになりました。RedHat 7.2のエラーは出なくなりましたが、遅くて使う気になれません。Windows 98も同様で、遅いです。Linux 2.6とWindows 2000は動くと思います。
Windowsホストでは動かないです。