読者です 読者をやめる 読者になる 読者になる

HoppeSoft

やわらかコーディング

OS自作入門のその後(シリアル通信編)

てぃーてつです。

川合秀実先生の名著『30日でできる!OS自作入門』、
この入門をめでたく果たした後、「さて次は何を実装しよう」と考えるだけで
とても楽しいですね。きっと読破・自作を行った方々は皆そう感じることでしょう。

ただ、我々はまだまだ入門したばかりですから、難しいことはわかりません。
大学などでオペレーティングシステム概論、のような話を聞いたことがある方、
コンピュータアーキテクチャについてある程度の知識がある方などはもしかしたら
次の一手が見えているかもしれません。が、我々OS素人にはちんぷんかんぷんです。


次に何をしようか、ぼくなりに調査も交えながら考えた結果、
「シリアル通信」をやってみようかなと。

というのも、下に示すような大変興味深いサイトを発見したからで
Expanded Main Page - OSDev Wiki

大変すばらしいですね。美味しそうな蜜がそこかしこに……といった感じ。
ずらーっと並んだ項を眺めていくと
Serial Ports - OSDev Wiki

ありました。シリアル通信です。RS232をメインに書かれているようですね。
概要やポートの在り処、設定すべき値なんかも見られますね。


RS232といえば、いまでこそ外部機器との通信はUSB一強といった風ですが、
PCに標準でコネクタが装備されていたりして活躍をみせました。
RS232にまつわる思い出が個人的にありまして、ちょっとしたロボットのセンサの
値をTera Termに突っ込むとか、ボーレートミスってなんじゃこりゃ!とか
……ここまで書いてて思ったんですが、もしかして現代っ子ってあのコネクタ
見たことないんじゃ。。。

さておき、リンクのExample Codeの節を参照して試しにbootpack.cにでも
コピペしてもらえればサクッと……inb, outb関数が未定義でしたね。。。
今後も使えると思うのでインラインアセンブラを用いてしまいましょう。
I/Oポートの読み書きをする関数を書いてみます。
(2017/03/26追記)
inb, outbではなく、はりぼてOSで使用しているio_in8, io_out8でも
実質同じことができるので、以下はインラインアセンブラでもできるんだ~
くらいの気持ちで読むといいと思います。


はりぼてOSを本のまま作成していればGASで吐いてから
諸々やっていたはずですから、Intel記法ではなくAT&Tが無難かも。

unsigned char inb(unsigned short port) {
	/* バイト(8bit)サイズでI/Oポートから値を得る
	** ここではインラインアセンブラ(AT&T記法)を用いた
	*/
	unsigned char val;
  __asm__ __volatile__ (
		"inb %1, %0\n\t" : "=a" (val) : "d" (port)
	);
	return val;
}

void outb(unsigned short port, unsigned char val) {
	/* バイト(8bit)サイズでI/Oポートに値を出力	*/
  __asm__ __volatile__ (
		"outb %1, %0" : : "d" (port), "a" (val)
	);
}

慣れないことはするものじゃないですね…たどたどしいながら組んでみました。
さてinit_serial関数の後にis_transmit_empty→write_serialしてCOM1に一文字飛ばしてみます。
カーネルのメイン関数のどこかに組み込むなりすれば動作確認はすぐできるでしょう。

ちなみにぼくは自作OSをVirtualBoxで走らせて、設定でゲストCOM1 & ホストCOM3→Tera Term(COM4)とセッティングして受信させました。
f:id:titets38:20170318022325j:plain

そして案の定PCにRS232Cなんぞ挿せなかったので(笑)、仮想でシリアルポートを設定しました。
sourceforge.net
それがCOM3とCOM4のペアということですね。

(2017/04/27追記)
ぼくの勉強不足で申し訳ないんですが別ソフト使わなくてもVirtualBoxで直に仮想ポート作れるそうです

qiita.com



Tera Termで受ける際の設定はググればいくらでも出ます。
ボーレートはinit_serial関数で設定した値ですね。

f:id:titets38:20170318021451p:plain

これでホストPCや外部機器とコミュニケーションを図れます。
デバッグに使ってもいいかもしれませんね。

次は何をしましょうか。わくわくです。

(2017/03/20追記)
※記事の内容で誤りや疑問があったらぼくにコメント等で質問してください
決して川合先生のところにご迷惑をかけないように!!