kazubits のすべての投稿

シリアルのパッチとバイナリ

シリアルのパッチとバイナリを作りました。
http://www.h7.dion.ne.jp/~qemu-win/download/qemu-20060311-serial-3.patch
http://www.h7.dion.ne.jp/~qemu-win/download/qemu-20060311-16550a.patch
http://www.h7.dion.ne.jp/~qemu-win/download/qemu-20060311-serial-win2kxp.patch
http://www.h6.dion.ne.jp/~kazuw/qemu-win/qemu-20060311-serial.zip
オプションは、次の通りです。
-serial COM1
COM番号に大文字を使ってください。
ダイアログが出てきますので、通信パラメータを設定してください。
パッチを当てた後、Windowsを起動すると最初に、デバイスがアップデートされたことを検出します。デバイスドライバがインストールされた後、再起動してください。
実際のCOMポートではテストしていません。
ComEmulDrvというWindows 2000/XP用に仮想COMポートのペアを提供するドライバを使って、COM5とCOM6を設定し、Win2kゲストとWinXPホストの間でHyperTerminalで通信できるのを確認しました。
http://mixw.net/related.htm#tncemu
通信パラメータは重要です。テストしたパラメータは次の通りです。
ビット/秒: 9600 bps
データビット: 8 bit
パリティ: なし
ストップビット: 1
フロー制御: なし
ホストとゲストとQEMUで同じパラメータを使う必要があります。
フロー制御をハードウェアにした場合、qemu-20060311-serial-win2kxp.patchを使わないと、Win2kゲストからWinXPホストへデータを送ることができません。
Windbgは、速度が遅すぎるととても使えないことがわかった。名前つきパイプを使えるようにしてみようと思います。
モデムをもってましたら試してみてくださいませ。

OS自作入門1日目

読んだ。
いきなりバイナリエディタ触るんですね。Meadowでやろうと思って、M-x hexl-find-fileでバイナリモードでファイルを開いたりM-x hexl-modeでモードを変えられることは調べたけど、アルファベットしか入力できない。M-x hexl-insert-hex-char(C-M-x)で入力できるけど、いちいち面倒でBz使うことにした。
.nasという拡張子でasm-modeにするにはこんなのを.emacsに書いておくといいです。
(setq auto-mode-alist
(append '(("\.nas$" . asm-mode))
auto-mode-alist))
(add-hook 'asm-mode-hook
'(lambda ()
(progn
(setq tab-width 4)
; (setq tab-stop-list '(4 8 12 16 20 24 28 32 36 40))
)))
tab-stop-listは、入力の最初の位置を決めるのに使えます。コメントにしてありますけど。
asm-modeでのコメントですが、セミコロン;を2つ打ち込まないと行頭に行かないです。2つ打ち込むと3つ入るというおまけまでついていて、なんともおせっかいなと思った。でも、カスタマイズする方法がわからなかった…。

QEMUのシリアルの扱い方

QEMUの中では、次のようにシリアルに関するデータが渡されています。
vl.cで、
serial_hds[i] = qemu_chr_open(serial_devices[i]);
serial_hdsに、CharDriverState *chrが入る。
pc.cで、
serial_init( , , , serial_hds[i]);
で、シリアルに渡され、
serial.cで、
SerialState s->chr = chr;
として保存。
qemu_chr_add_read_handler(chr, serial_can_reveive, serial_receive1, s);
として、割り込みハンドラに渡される。
割り込みハンドラの登録と、データの送受信の関数など作り、とりあえずシリアルは動くようになりました。
ただ、Win2kゲスト/WinXPホストのHyperTerminal同士で通信したとき、通信パラメータのRTS/CTS制御を有効にすると、ゲストからホストに文字が送れないのです。ハードウェア制御がなしならばいいのですが。
QEMUのシリアルのエミュレーションに問題があるのか、使っているComEmulDrvという仮想COMポートに問題があるのかわからない…。
もっと細かく見ないといけないのかな。

30日でできる!OS自作入門

OS自作入門買ってきました。
最初の印象は、デカいでした。OSの解説となるとこれぐらいの分量になるんですかね。
QEMUが使われているんですね。やっぱりOS作るには便利なのか。
これ読んだら、64ビットOSとか作れるようになるんだろうか。ただ、64ビットのプログラムを作ってみたいだけなんですけど。「はじめて読むAMD64/EM64T」みたいな本書いてくれないかな。なければ作るとか。
QEMU専用のOSだったら、作るのもありかなとも思います。VT/Pacificaも使えるようにして。いろいろやろうとすると、Xenと同じになる気がしますけど。
わかった気になるためには、プログラムを打ち込んでみることが大切のような気がします。
とりあえず、少しずつ読んでみることにします。

シリアルのいろいろ

シリアルのメモ
シリアルのパラメータはいろいろあってよくわからない。ダイアログが出せるみたいなので、とりあえず使うことにした。RTS/CTSフロー制御を使うのが一般的なのかな。
ClearCommError()で、cbInQueにたまっているデータの数が入っているので、それでReadFileするとバッファからデータを読むことができる。
WaitCommEvent()でイベント待ちにして、WaitForMultipleObjects()/WaitForSingleObject()でシグナル状態になるのを待って、ReadFileする。
GetOverlappedResult( , FALSE)にすると完了を待たずに、抜ける。TRUEにすると、完了を待つ。
ReadFile/WriteFileは、デバイスドライバの送信/受信バッファに読み書きすること。データが届いたかどうかはわからない。
マルチスレッドにすれば、待ち受け関数をINFINITEで待つことができるけど、データの受け渡しにCriticalSectionを使ったりしないといけなく、バッファの取り扱いが面倒。
まず、マルチスレッドを使わずに動作を確認しようと思った。ReadFile/WriteFileは同期にすると問題があるそうなので、OVERLAPPEDを使った非同期にすることにした。
作ってみたけど、どうもうまく動かない。どうやらWaitForSingleObjectでイベント待ちにしてSleepしたところで何もいわずに落ちてしまう。テストプログラムだと大丈夫なんだけど。仕方ないので、WaitCommEventを使わないことにした。

シリアルの調査

シリアルポートについて調べてみました。
調べてみて、シリアルポートの使い方って歴史が古いなって感じました。なんといっても、Win95やWin3.1のころからあるわけで、現在までの間でCPUは10倍以上速くなっているわけですし。9x系からNT系に変わっているわけだし、プログラムの作り方も変わっていると思ったほうがいい気もします。
見ていると、シリアルのチップによっても癖があるみたいな報告もあって、なかなかどこでも動くプログラムを作るのは難しそうです。
プログラム上の問題は、大別すると2つあって、1つはシリアルポートの設定に関するもの、もう1つはAPIの使い方、スレッド、イベントの使い方になります。ネットワークのときのような定番となる使い方が見つけられないことが難しいところです。
参考にしたサイトは、次のようなところです。データの受け渡しが気になって、マルチスレッドを使ったものを調べてみました。Microsoftのサンプルがあるけど、よくわからなかった。CodeGuruのサンプルのほうが簡単かもしれません。CREATORS BANK, TETRAEDRE, Parsley, Expert Exchangeのサンプルは、MinGW用に少し変更して動かしてみました。貴重な情報に感謝。
CREATORS BANK
http://www.geocities.jp/terukat/_geo_contents_/win/index.html
TETRAEDRE
http://www.tetraedre.com/advanced/
Parsley's Web Resource
http://blog.so-net.ne.jp/SpicyParsley/2005-02-18
How to collect data from monitors
http://www.med.osaka-u.ac.jp/pub/anes/www/software/DataAcquisition.html
Expert Exchange
http://www.experts-exchange.com/Programming/Q_21083345.html
WindowsでRS232Cを使う
http://members.jcom.home.ne.jp/0434383301/vc10.htm
マルチスレッドの通信
http://homepage2.nifty.com/DSS/WinSys/Win/commthread.htm
CodeGuru
http://www.codeguru.com/Cpp/I-N/network/serialcommunications/article.php/c2503
Serial Communications in Win32 (MTTTY)
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnfiles/html/msdn_serial.asp

タイマーの問題

タイマーの問題は前から気になっているのですが、なかなか有効な方法が見つからないのです。特に、KqemuやQvm86を使うと目立つので何とかしたいのですが、メーリングリストに出てくるパッチを試してみても、よくなるどころか悪くなったりして、どうしたものかなという状態です。
やるとすると、QEMU内での時間の進め方を解析したり、WindowsやLinuxの時間の刻み方を確認することが必要な気がするのですが、結構大変そう。
その前に、シリアルポートを使えるようにできないかなと思っています。シリアルポートを使ったWindowsのリモートデバッグをやってみたいなと思います。
それが終わったら、インストールの問題とあわせて見てみようかな。予定は未定ですけど。

液晶の明るさ

Intelは、ViivというブランドでPCに映像を取り込みたいそうですね。でも、自分がパソコンでテレビを見れない大きな理由が、液晶の明るさです。
最近は、300cd/m2みたいに液晶の輝度を上げた製品ばかり見かけますが、僕にとっては眩し過ぎます。店頭で、きれいに見えるからと購入したのですが、とても使えなくて売ってしまったことがあります。液晶パネルの輝度設定で最低にしても明るすぎ、コントラストをいじってもだめ。Windowsのデバイスドライバで輝度を抑えるとやっと見ていられる明るさになったのですが、プログラムをいじったりはできても、とてもテレビを見られる明るさではなくなってしまいました。それ以来、テレビとパソコンは別物だと強く思っています。
考えてみると、パソコンで液晶ディスプレイを見る距離は50cmくらいでしょうか。テレビは、3mくらい離れているでしょうから、単純計算でも1/5くらい明るさが変わらないと同じようには見えないはずなんですよね。1/5は極端かもしれないですけど。雑誌やWebで、明るくて見やすいなんてよく書かれているのをみると、それで長時間本当に作業したことがあるのかって突っ込みたくなります。僕としては、どれくらい暗く調節できるかと、そのときの見やすさがとても気になります。
ワンタッチで、テレビモードとパソコンモードを変えられるといううたい文句のパソコンもありますが、店頭で見た感じでは、パソコンモードが明るすぎてました。
昼と夜で液晶の明るさを変えられるのもいいですよね。夜はとても明るく感じます。
ディスプレイの近くに人がいるかどうかで自動的に液晶の明るさを変えてくれるようなインテリジェンスを持った液晶があったらいいなとも思います。
暗くて見やすい目に優しいディスプレイをどこか作ってくれないかな。

patchの編集

.patchという拡張子のファイルをEmacs/Meadowで開くと編集できないです。なぜかなとずっと思っていたのですが、M-x toggle-read-onlyで編集できるようになったのでした。
これでpatchのごみを掃除できます。
Kqemu使っても-win2k-hackがいる場合があるんですね。やっぱりIDEの問題なのか?