NetBSD お遊び日記 (2002年8月)。
$Id: diary-200208.html,v 1.31 2002/09/15 04:21:48 isaki Exp $
≪ 2002年7月 | 2002年9月 ≫

2002/08/02

[MI/etc] カーネルの中には DELAY()delay() という関数かマクロがあって、 両者は同じもの (というか片方は単なる define だったような) なので 同じなら同じでどっちかに統一してほしいところだったが、 そういう議論が出てきたらしい。 FreeBSD は DELAY() に統一したらしいけど。

[MI/dmover(9)] でぃーえむおーばーと読んでしまった(笑)。

[MI/dmover(9)] というのはさておき、 ハードウェアでメモリをごにょごにょするものらしい?(わけわか)


2002/08/03

[MI/pppoe0] 電話の発着がある度に PPPoE のコネクションが 切れるので、sys/net/if_spppsubr.c の中の MAXALIVECNT を増やしてみたところ切れなくなった。めでたしめでたし?? [続き]

[MI/build] x68k/-current は wtmp 周りで distrib/x68k/floppies あたりでとまるし。 x68k/1.6_BETA5 は openssl 周りの pull up で ファイルの一貫性チェックか何かでとまるし。 i386/-current は相変わらず read only fs 問題でとまるし。 ということで今週の snapshot 作りは全滅。 お前も commiter なら直せよって感じだが。


2002/08/04

[x68k/slhci] なんか SL811HS/T の場合デバイス用への 割り込み転送はソフトウェアで自前で回さないといけないらしい。 以前 BSD-USB ML あたりである方にそういう雰囲気のことを教わって 分かったようなつもりになっていたが、やっと意味が分かった。 たぶん今まで外付け HUB が動いてたっぽいのもたぶん root hub の 作り方を間違えてたのが偶然そのように影響してたせいじゃないかと思う。 というかそういうことにしておこう。

[x68k/slhci] ということでデバイスへの割り込み転送作成中。

[x68k/commit] で、カーネルに DIAGNOSTIC つけたら sys/arch/x68k/dev/intio_dmac.c でまた printf 問題で コンパイルこけたので直して commit。 相変わらずこの程度のことしか出来なくてごめんなさいって感じで。

[MI/kernel] カーネルが panic するような時は ddb 入りカーネルを作ればいいらしい。 カーネルに

options		DDB
options		DDB_HISTORY_SIZE=100
options		DDB_ONPANIC=1
makeoptions	DEBUG="-g"
とか書いて make し、出来たカーネルの strip 前の方 (netbsd.gdb) で起動すればよい。 でも ddb の使いかたがいまいち分からなひ(泣)。

[x68k/clock] 熱いうちに。 以前修正した sys/arch/x68k/x68k/clock.c の解説。

cpu_initclocks はカーネル内でタイマー処理の基準となる 周波数を設定するための MD パートであり、 カーネル起動時のデバイス列挙が終ったあたりで MI 部分から 呼び出される。 cpu_initclocks() の実際の役割はグローバル変数(?) hz で示されている割り込み周期(周波数) で割り込みを 起こすようハードウェアを設定することである。 hz には最初カーネルコンフィグで設定する HZ が 入っている。NetBSD だと alpha では 1000、それ以外は全部デフォルトで 100 になっているあれである。

x68k の場合この割り込みには Timer-C を用いているので MFP を設定することになる。 MFP には 4MHz のクロックが注入されており、 そのクロックを TCDCR レジスタで指定しただけ分周する。 そうして出来たクロックをさらに TCDR レジスタで指定した 回数だけカウントするごとに Timer-C 割り込みが上がるのである。 ここは正確にはクロックごとに TCDR を減算していき 0 になれば (とは Inside には書いてないがまあ近似して) TCDR をまた指定の 値に戻してから Timer-C を発行するような感じ。

たいぎくなってきたので続きはまた気のむいた時に...。

[x68k/slhci] なんか DIAGNOSTIC をつけると slhci が root hub の初期化に失敗するらしい。何故じゃー。

[x68k/slhci] デバイスへの割り込み転送を作ってみた。 なんで callout で呼ばれた関数が tsleep すると死ぬんだろう。 とりあえずポーリングして誤魔化す。どうせ数マイクロ秒程度だし(ぉ?)。 [続き]


2002/08/05

[x68k/slhci] デバイス抜いた時の後始末部分 (device_intr_abort()) をまだ作ってなくて、 デバイス抜くとそのまま遠い世界へ逝ってしまわれてたので、 そのあたりを作ってみる。デバイス抜いても大丈夫になった。万歳。 これで一応デバイスへの割り込み転送は完成したんじゃないかしら。 って tsleep が刺さる問題は残ってるなあ...。 やっぱり先は長い...。 もうすぐ SL811HS/T と格闘を始めてから1年になるし。


2002/08/06

[x68k/Nereid-bank] Nereid には最大 16MB もの (メインメモリよりも大きい!) バンクメモリが載っている。 メインメモリとして使わなかった部分をバンクメモリとして 使えるというほうが少し正確だけど。 この広大なメモリをなんとかして NetBSD からも使いたかったのだが、 まさか UNIX の仮想記憶を一部の実メモリだけバンクメモリに対応させる だなんてそんな大それたことは (...思いついたけど) とても実現の可能性は (少なくとも私には) なかった。

ところが一昨日、ふいに 散々考えた挙げ句に思いついた。

ブロックデバイスとして実装すればいいのか。
思いついてみればなんてことはないが、要するにラムディスク そのものだし、なんと UNIX 伝統の mfs よりも構造的に美しい気がする。 だってちゃんとしたブロックデバイスなんだもーん(本当だろうか)。 さーて、ブロックデバイスの勉強でもしよう...。

[x68k/TODO] ということで現在の私の主なキュー。(順不同)

あと5〜6年くらいはたっぷり遊べそう(泣)。 x68k の寿命がもつかな(笑)。

[x68k/Nereid] なんか X68030 にさして普段 slhci の実験に 使ってる Nereid がおかしい。時々 17000 バイトのパケット受け取った? とかいうし、ne0: device timeout とか ne0: remote transmit DMA failed to complete とかいうカーネルメッセージも出るようになった。 これって NE2000 がお亡くなりになった時の症状だよね。ガーソ。

こうなるとネットワークがまったく使えなくて (= NFS してるので ほとんど即死に近い) 再起動する羽目になるんだけど、再起動したら 今度は ne0 も slhci0 も認識されなかった。 ん、ボード自体 (つーかロジック部分かな) がお亡くなり気味ってことかしら。 もしかして bus powered な外づけ USB HUB にいろんなもん 繋げて遊んでたから、電気的にまずかったのかしら。 Nereid ってば (というか X68000 の外部スロットが) USB で規定されている最低電流を流せないからね。

とりあえず shutdown。明日また様子見よう。 [続き]


2002/08/07

[x68k/slhci] [元ネタ] 通勤電車の中で FreeBSD カーネル入門の本を読んでたら、 callout の中で tsleep しちゃだめよって書いてあった...。 なぜだめなのかはまだ詳しく読んでないけど。 いやそんな予感も多少はしてたんだけど、やっぱりそういうことか。 じゃ、やっぱポーリングでいいんでしょう。

[MI/pppoe0] [元ネタ] NetBSD ML に書いてたら itohy さんから返事をもらった。 さすがにめでたい解じゃなかったみたい。 確かに保安器はだめっぽい。

[x68k/Nereid] [元ネタ] 今日は大丈夫だった。恐いので外付け USB HUB をセルフパワードに した (バスパワードでもセルフパワードでも使える HUB だったので)。 とりあえずこれでしばらく遊んでみよう。


2002/08/08

[x68k/Nereid-bank] また無謀にも書きはじめる。 これは比較的簡単だよね。デバイスの制御部分がレジスタ1つだけで 非常にリニアなので、完全にデバイスドライバの構造のお勉強って感じ。


2002/08/10

[x68k/slhci] そろそろ手がつきて煮詰まってきたので tech-kern に話を持ち掛けてみる。(ぉ

[x68k/Nereid-bank 改め bmd] Bank Memory Disk で bmd。 最初は Nereid Disk で nd0 にしようと 思ってたんだけどローデバイスが rnd0 になって読みだすたびに 違うもの返してきそうなので不採用。 Bank Disk で bd0 で書きはじめてたんだけどカーネル内に bdwrite っていうルーチンが存在しているので bdev_decl(bd) ってやると衝突してしまうので、不採用。 仕方なく Bank Memory Disk にしてみた。どうもいまいち格好悪い。


2002/08/11

[x68k/bmd] それはさておき、作り始める。普通のブロックデバイスは 入出力のリクエストを strategy が内部のキューにつないでおいて、 転送開始するかその要求を出す。他の人(割り込み?)がそのキューの 先頭のリクエストを処理して biodone を呼ぶ、らしい。 けど bmd はターゲットがバンクメモリなので入出力の終了で割り込みは 上がらない (DMA転送使えば上がるけどね) 。そこで手抜きをして strategy が受け取ったリクエストを自分でさばくようにしてみた。 キャラクタデバイスに関してはうまくいってるっぽい。 ブロックデバイスは再現性がないもののどこかで必ず uvm_fault が発生する。 これって hdc の時の症状と似てないかな。あれもローデバイスは動いてて ブロックデバイスが動かない。

[x68k/slhci] 昨日 tech-kern で、slhci 作ったんだけどどうよ って書いたら、USB 付近の人から、ええんちゃう(推定)という返事が来た。 で、なんで安いプリンタ買ってバルク転送作らへんの?とも聞かれた。 そんなこと言われてもなあ。 こっちゃただでさえこのボード買うのに1麻衣3万払ってんのよ。 と言う訳でもないが単に面倒だから調べてなかっただけなんだけどね(ぉ。

[x68k/slhci] というわけで急きょ commit する。 まだ全然動いてないけど、とりあえず *BSD 初の ScanLogic SL811HS/T ホストコントローラをサポートってか。

NetBSD の中では 4番目のホストコントローラ。 x68k port は NetBSD の 53 port 中 7番目の USB サポート機種。


2002/08/12

[x68k/slhci] とか思ってたらマニュアルページを Makefile と distrib のリストに追加するのを忘れていて、ガイジンさんにサクッと直された。 今回は (まだ) wiz さんには直されてないな。ふふっ(わけわか)。


2002/08/17

[x68k/sysinst] 1.6 系の sysinst.fs が メモリ 4MB (最小構成) で動作しないらしい。 うちの X68030 はメモリ最大まで専用スロットに積んでるから どうやってテストしようとか思ってたけど SRAM のスイッチ変更する だけでいけるのね。ということでテストしてみる。 うむ、確かに。out of swap とか言われて sysinst が起動できない。 いろいろ削ってみたけど難しいねえ..。

[x68k/bmd] つーか sys/dev/md.c みたら やっぱ strategy 内で memcpy してるのね。 ちゃんと周りのもの研究しろよ > 自分

[x68k/sysinst] なんか sysinst がとってきた tgz を展開中に げろ吐いてお亡くなりになるんすけど...。しかも2回も。 とりあえず 1.6_RC1 作ってもう一度試してみよう。

[x68k/bmd] ということで sys/dev/md.c の strategy 参考に書き直す。で、strategy に要求される時は 512 バイト単位なのか そうでないのかが結局分からないが、まあいいか。 そんな関係で初めて NetBSD の physio とか minphy の中身 (sys/kern/kern_physio.c) を見てみた。 最近会社の行き帰りの電車で Lions' Commentary on UNIX を読んでるので なんとなくだけど意味は分かった。つーかほとんど同じじゃんって気がする。 UNIX ってすごーい。

[x68k/sysinst] 1.6_RC1 でインストールしてみたが 今度はうまく行った。うーん、よく分からん。


2002/08/18

[x68k/sysinst] kern.fs はカーネルを圧縮すると起動できた。 なんなんだろ。でも inst.fs が読みこめない。

[x68k/sysinst] あきらめて INSTALL.* を書き直すために 読んでたら最小構成はメモリ 4MB だけど、メモリ 5MB 以下なら sysinst.fs の 代わりに kern.fs と inst.fs の2麻衣組使ってね、と書いてあった。 あ、ちょっと助かったかも。

[x68k/sysinst] kern.fs を圧縮するのを commit して pull up request 出しておく。 その前に lukem さんに確認のメール出してみたりして。 このくらいの英語ならなんとかだましだまし書けるようだ。:-)


2002/08/19

[x68k/sysinst] 無事 kern.fs が起動できたが、inst.fs の フロッピー入れてねと言われてフロッピー入れると読みとりエラーみたいなの が出てしまい inst.fs で起動できない問題が残っている。 1.5.3 のイメージを持ってきて試してみたり、フロッピーを一旦 Human68k で format /5 してみたりしたけど、手がかり得られず。


2002/08/20

[i386/WakeOnLan] BIOS メニューなんかによく Wake On LAN とか いうのがあって、Intel の NIC だと専用のケーブルがついてきたりしている。 何するものだかさっぱり意味が分からなかったのだが、今日、仕事で まったく別の調べ物をしてるときに検索でひっかかったページに載っていたので 分かった。同一 LAN 上からパケット投げてそのマシンの電源入れるものらしい。 こりゃ便利だっていうことでさっそく会社のマシンで試したりクライアントを 会社のサーバに入れておいたりした。今週末会社の入ってるビルが停電に なるからまさにタイムリーで嬉しい。

うちは常時稼働のサーバ (NetBSD/i386) と、生活用のクライアント (NetBSD/i386) とがいたりして、クライアントは普段電源切ってるので Wake On LAN があれば会社からおうちサーバにログインしてそっから クライアント PC の電源を入れることが出来て嬉しそうなので、うちでも さっそくやってみる。と思ったらクライアントは 3Com の NIC なので サポートしてないのね。こういうこともあろうかと思って サーバとクライアントでわざと 3Com と Intel という風に別の NIC を 買っておいてよかったかも。最初 3Com 3c905C をサーバ用に買ったんだけど 905C は NetBSD/1.5 じゃサポートしてなくてサーバのインストールで ハマったのでその時に ex と fxp を交換していた。もうすぐ 1.6 も 出ることだし、もうこの問題でハマることもないでしょう。ということで 夜中に NIC の付け替え。


2002/08/25

[x68k/installboot(8)] ちょっと前に installboot(8) に x68k の処理を 追加したのはいいけど、どうやら Human68k が同居するハードディスクなる ものがあるらしく、そっちにも対応しないといけないらしい。 つーかそんなこと出来るって知らなかったよ。


2002/08/26

[x68k/etc] NetBSD/x68k のブート部分にコメントつけながら 読んでいってて、SRAM のメインメモリ量を正しく設定してないと 起動しない理由が分かった。つーかこれインストールドキュメントに 書いといた方がええんちゃうかな。Human68k だとみんな 12MB (最大) に してるよね。


2002/08/30

[Linux/OpenBlockSS] なぜか Linux の話題(笑)。 NetBSD/x68k で Nereid 2麻衣差しな ADSL + NAT ルータが ボトルネックになってスループットが出ないのが気になり始めたのと x68k が1台使えなくて面倒なのと、NetBSD/openblockss で将来的に 遊びたいのとで、OpenBlockSS を買ってみたり。 とりあえずは Linux として ADSL ルータやらせておく。 って ADSL ルータやらせてる間は NetBSD で遊べねーじゃん(笑)。

それはともかく、最近仕事でも使ってるけど iptables って便利ねー。 誰か pkgsrc/net/iptables とか作ってくんないかしら。 おうち NAT の設定なんか2分で終るもんね。 以下 NAT (IP マスカレード) して、外からの ssh と http だけ抜く設定。

# iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
# iptables -t nat -A PREROUTING -p tcp --dport 22 -i ppp0 -j DNAT --to 192.168.X.XX
# iptables -t nat -A PREROUTING -p tcp --dport XXXX -i ppp0 -j DNAT --to 192.168.X.XX:80
ちなみに NetBSD の ipf では次のようにする。
# cat /etc/ipnat.conf
map pppoe0 192.168.X.0/24 -> 0.0.0.0/32 proxy port ftp ftp/tcp
map pppoe0 192.168.X.0/24 -> 0.0.0.0/32 portmap tcp/udp 40000:60000 mssclamp 1452
map pppoe0 192.168.X.0/24 -> 0.0.0.0/32 mssclamp 1452

rdr pppoe0 0/0 port 22 -> 192.168.X.XX port 22 tcp
rdr pppoe0 0/0 port XXXX -> 192.168.X.XX port 80 tcp
# ipnat -C -f /etc/ipnat.conf
NetBSD ではカーネルモード PPPoE 使ってるから MSSCLAMP は ipf で一緒に やってて、OpenBlockSS/Linux では rp-pppoe 使ってるからそっちに MSSCLAMP させてるため完全に1対1に対応はしてないけどね。


2002/08/31

[MI/1.6G] RAS (Restartable Atomic Sequences) ってなんじゃらほい。

[MI/etc] /bin と /sbin をダイナミックリンク化することについて 議論大爆発。あとそれに付随して PAM ってどうよとか、locale サポートについて そんなことしなくてもちゃんと使えてるぜっていうお約束の勘違い ISO-8859 連中 と話題が広がってて読むのが大変。ってかどっちみちあんまり読めてないんだけど。


≪ 2002年7月 | 2002年9月 ≫
井崎のホームページへ戻る
isaki@NetBSD.org / isaki@x68k.net