LinkStation-MIPSel NetBSDカーネル移植作業メモ
(このページの最終更新日: 2008-03-12)
# 師曰く 『この移植には技術が感じられない』 orz
現在の状況(2007-09-22更新)
- 全機能を(性能やバグはさておき)実装完了。
- バイナリ&パッチ&スクリプトの公開を開始。
- 実際に動作させるまでの手順が難しいのでお手軽化を検討中。
- いろいろと場当たり的に改善中。
- netbsd-4ブランチでの実験中。
- netbsd-currentでも実験中。
お試し版ダウンロード (2008-03-12更新)
- こちら(プライマリ)、(ミラー)に置いてあります。
- NetBSD4.0サンプルカーネル: 2008-01-21版
- NetBSD3.1サンプルカーネル: 2007-04-28版 (COMPAT_16追加)
- NetBSD3.1サンプルカーネル: 2007-03-18版
- NetBSD3.0サンプルカーネル: 2007-02-03版
- カーネルパッチ(NetBSD 4用): 2008-01-22版
- カーネルパッチ(NetBSD 3.1用): 2007-08-16版 (実験中)
- パッチの例: "bzip2 -dc 20070203.evbmips.diff.bz2 | (cd /usr/src; patch -p0)"
- ブートローダー: 2007-01-27版
- Linux側の環境にインストールします。
- ブートセレクタ: 2007-06-17版
- Linux側の環境にインストールします。
- 電源管理デーモン(ls2_powerd): 2007-01-25版
- NetBSDコンソール切替(ls2_consw): 2007-01-25版
- ユーザランドバイナリ: 2007-02-02版
- sbin/fdisk, sbin/disklabel, sbin/fsck_ext2fsが入っています。
- ユーザランドパッチ: 2007-02-02版
- fsck_ext2fsのコンパイルにはカーネルパッチに入っている修正(BUFFALO_E2FS_MAGIC)が必要になります。
- 簡単に回避するには、/usr/include/ufs/ext2fs/ext2fs.hに "#define BUFFALO_E2FS_MAGIC 0xef54" を追加してください。
- USBメモリイメージ用追加ファイル: 2007-02-03版
- NetBSD/i386等、Little-EndianなNetBSD上でUSBメモリをfdisk&disklabel&newfsします。
- sd0aとして認識できるようにして下さい。
- マウントし、NetBSD/evbmips-el 3.xのbin.tgz etc.tgzを展開後、上記追加ファイルを展開します。
- tarの引数の-p(--preserve-permissions)を忘れずに!
- これで終了です。rootまたはbsduserでログインできるように環境が作られています。
- IPアドレスはいつもどおりDHCPと固定の両対応です。固定は192.168.200.220/24です。
- 手抜きにより、デバイスノードもアーカイブに含んでいます。ご注意下さい。
- NetBSD/i386等、Little-EndianなNetBSD上でUSBメモリをfdisk&disklabel&newfsします。
- USBメモリイメージファイル(NetBSD-4): 2008-02-29版(512MB以上用) 27MBちょっと
- お試しパックは準備中です。
- fdiskとdisklabelはhpcmips-elから取り出しても使えると思います。
(ご試用は自己責任でお願いします。)
大方針
- currentは使わず、NetBSD 3.0ベースで作業する。
- MALTA評価ボード用をベースに改造する。
- 元のコードは気にせず改造する。(あとで分離) 分離完了
- 次のステップを踏む予定。(
一応全て完了
)
- mainbus+com(ポーリング)+時計(ダミー)のみ 完了
- +割り込みまわり整備+タイマ割り込み 完了
- +com(割り込み駆動) 完了
- +PCIバス+デバイスサポート(ATA,USB)
課題を残しつつ完了
やり直すかも
- ここでローカルファイルシステムをサポートする予定
wd0,sd0をサポート
- うまくいけばセルフ開発環境へ移行 完了
- USBまで動けばUSB-NIC経由でネットワーク接続をサポート axe,aueをサポート
- ここでローカルファイルシステムをサポートする予定
wd0,sd0をサポート
- +GPIO+SPI+時計 一応完了
- +DOS MBR, disklabel周辺(カーネル/ユーザランド) 完了
- +内蔵Ethernet 無理やり完了
- +コンソール切り替え機構(com/null) 完了
- 追加作業項目(案)
- ブートローダー
- 4MB超えサポート
- bootstrサポート
- DMA停止コード書き直し
- ブートセレクタ
- ls2_swread
- ブート中表示(LEDインジケータ)
- ls2_swread
- カーネル
- カーネル起動引数
- bootstrサポート
- bootdevサポート 完了
- boothowtoサポート 完了
- ドライバ
- PCIドライバ安定化
- カーネル起動引数
- ユーザランド
- fdisk
- MBRサポート追加 完了
- disklabel
- MBRサポート追加 完了
- fsck_ext2fs
- Special MAGICサポート追加 完了
- ls2_powerd
- stdin/outをcloseする(daemon化時)
- fdisk
- その他
- 各種アーカイブ作成
- USBメモリイメージ作成
- お試しパック作成
- ブートローダー
解決しなければならない問題
- ブート不安定
- PCIデバイスのレジスタの読み込みでハングする。
- 回避コードで回避中(本解決では無い)
- (追記予定)
解決済み
- MALTAの概要も知っておく必要あり。(資料探索中→入手)
- 79RC32434の割り込み機構のコード化 (完了)
- LinkStationはyamonを持っていないのでyamonに依存している部分を書き直す必要あり。(完了)
- LEDディスプレイも無い。削除する必要あり。(完了)
- シリアルドライバは書き直し(完了)
- dbsymが効いていない(完了)
- PCI周りの初期化は?(だいたいOK)
- DMAはどう使う?(PCIバスマスタDMAはOK)
- Ethernetドライバは?(だいたいOK)
- DMA2つと割り込み5つっていうのはまじめにコード書くのは規模大きすぎ。
- 送受信割り込み以外は手を抜くか...(実際手抜き)
- SPIドライバの構造は?
- SPIデバイス(RTC)とSPIコントロールとデバイスアサート(GPIO)を分けると結構な手間がかかる
- ↑結局完全統合型(分離は後回し)
- コンソール切替機構
- 適当に回避
- ユーザランド
- とりあえず電源管理はOKっぽい。
- ルートデバイス選択&ブートフラグ指定をカーネル&ブートローダーに追加する必要あり
- 追加した。(旧方式のみ: 16進で指定)
作業メモランダム
(2006/4月分は移動しました)
(2006/5月分は移動しました)
(2006/6月分は移動しました)
(2006/7月分は移動しました)
(2006/8月~11月分は移動しました)
(2007/1月分は移動しました)
(2007/2月~4月分は移動しました)
(2007/5月~7月分は移動しました)
(2006/5月分は移動しました)
(2006/6月分は移動しました)
(2006/7月分は移動しました)
(2006/8月~11月分は移動しました)
(2007/1月分は移動しました)
(2007/2月~4月分は移動しました)
(2007/5月~7月分は移動しました)
(2007-08-11)
- boehm-gcが動かなかった件。
- ishihara@つなぐねっとさんのモバイルギアでNetBSDの中に、そのものずばりの記述を見つけた。
- 早速実験中...
- boehm-gcのビルドは成功。引き続きw3mをビルド中...
- /etc/mk.confには"PKG_OPTIONS.w3m=w3m-m17n w3m-unicode"を追加している。
- w3mもビルド成功。charsetまわりを設定してUnicodeなページ(slashdot.jpなど)もOK。完璧(^_^)。
- ishiharaさん、伊藤さんに感謝 _o_
(2007-08-14)
- 07-24に書いた件の追加メモ。
- どうも最初から4バイトアラインメントアクセスの手段は用意されていたようだ >> evbmips
- CHIP_ALIGN_STRIDE,
CHIP_ACCESS_SIZECHIP_ACCESSTYPEあたり。- CHIP_ALIGN_STRIDE=2,
CHIP_ACCESS_SIZE=4にすれば良いのかな?
- CHIP_ALIGN_STRIDE=2,
- CHIP_ALIGN_STRIDEを実際に使っているものがevbmips以下には無いのが心配だが。
-
他Archでは、algorが使っているものが非常に良く似ている。(←algorもmips系) - すべてのオフセット値を定義し直しするのと、com_***bus.cを作る必要があるので、作業は後回しになってしまいそう。
- # そもそも全てのものをmainbus直下にしているのがまずいのだ orz
(2007-08-15)
- 上記CHIP_ACCESS_SIZEはcurrent用で、CHIP_ACCESSTYPEがnetbsd-3用。
- 紛らわしい...
- ちょっと試したけれど動かず。もう少し粘ってみる。
- (comはcom_mainbus.cにした)
- ロングワード(uint32_t)アクセスの場合はオフセットはそのままで良いようだ。
(2007-08-16)
- com化、うまくいっていない。
- early consoleからcomへ切り替わるところで固まる。comのアクセスに問題がありそう。
- 次は一気に変更せず、icomのみを改造して試してみることにする。
- com化引き続き。
- CHIP_ACCESSTYPEは使用しないことにした。CHIP_ALIGN_STRIDE=2で使用。
- bus_space_read_[12], bus_space_write_[12]が上記の影響を受ける。
- icomのレジスタオフセットをいじらず、bus_space_read_1をbus_space_read_4に、bus_space_write_1をbus_space_write_4にしてみた。OK。
- 影響を受けないのだからあたりまえ。
- bus_space_write_mult_1はそのまま。icom_data(=0)なのでこれも影響なし。
- icomのレジスタオフセットをいじって0,1,2,... に変更し、元のbus_space_read_1, bus_space_write_1に戻した。OK。
- icom_mainbus.c中のbus_space_mapのlengthは0x44のまま。
- 現在com_is_consoleがtrueな状態なので効果は無いはずだが。
- ここまでうまくいったので、icom_mainbus.cをcom_mainbus.cにして、中身もicomをcomにリネーム。
- files.ls2もcomを使うように修正。
- com_mainbusreg.h中でCOM_FREQを200000000にoverrideするように設定。
- includeの順番もcom_reg.hよりも後にcom_mainbusreg.hを読むように修正。
- 上記でうまくいった。
- 昨日の失敗は...COM_FREQが主原因かな?
- もうちょっと整理が必要かもしれない。特にconsoleとして使わないパターンの場合。
- 現状のコードだと、CHIP_ALIGN_STRIDEはbus_space_mapのlengthに影響しない。
- com.cだとCOM_NPORTS(=8)しか取らない。
- CHIP_ALIGN_STRIDEが2の場合は8<<2で32は必要。このへんの解決方法は不明。
- CHIP_ACCESSTYPEは使用しないことにした。CHIP_ALIGN_STRIDE=2で使用。
(2007-08-17)
- 一応パッチを作成。ダウンロードできます。NetBSD-3.1オリジナルからの差分です。
- サイズが圧縮後で12kBほど小さくなりました。icomを削除できたのが効いてます。
- 通常モード(非デバッグモード;シリアルコンソール無効)のテストはまだしていないのでご注意のほどを。
- ls2_powerdの対応するデバイスの変更も必要なのを特に注意されたし。
(2007-08-20)
- お問い合わせを受けて調べましたが、HD-LANv3もinsmodが出来そうです。
- ソース:buffaloのカーネルソース
- HD-LANv3ではUSBインタフェースが無いので、インストール作業は(1)ディスクを外して行うか、(2)『スーパーお手軽パック for MIPS』(←未作成)のどちらかになると思います。
- # 『スーパーお手軽パック for MIPS』は某Iさん(仮名)が実験されていたような...(^^;)
(2007-08-21)
- 上記に追加。
- HD-LANv3にはUSBが無いので、カーネルソースを少しいじる必要があります。
- ↑PCIデバイスの検出で、ズルをしているためです _o_
- (運が良かったらそのままでも動くはずですが)
- 実験がまとまったら改めて説明する予定です。
- HD-LANv3にはUSBが無いので、カーネルソースを少しいじる必要があります。
(2007-09-16)
- netbsd-4の実験が大体まとまったのでご報告。以下はブートメッセージ。
NetBSD loader module loaded
kernel=/boot/test4.bin
boot device=0xa0000404
boot flags=0x00000000
start address=0x80100000
flushing ide devices: hda
MIPS32/64 params: cpu arch: 32
MIPS32/64 params: TLB entries: 16
MIPS32/64 params: Icache: line = 16, total = 8192, ways = 4
sets = 128
MIPS32/64 params: Dcache: line = 16, total = 8192, ways = 4
sets = 128
picache_stride = 2048
picache_loopcount = 4
pdcache_stride = 2048
pdcache_loopcount = 4
NetBSD 4.0_RC1 (LS2) #0: Sun Sep 16 13:26:52 JST 2007
root@LS2BSD:/mnt/netbsd-4/src/sys/arch/evbmips/compile/LS2
total memory = 65536 KB
avail memory = 60080 KB
timecounter: Timecounters tick every 10.000 msec
mainbus0 (root)
cpu0 at mainbus0: 400.00MHz (hz cycles = 2000000, delay divisor = 200)
cpu0: MIPS 4Kc (0x1800a) Rev. 10 with software emulated floating point
cpu0: 8KB/16B 4-way set-associative L1 Instruction cache, 16 TLB entries
cpu0: 8KB/16B 4-way set-associative write-back L1 Data cache
ipci0 at mainbus0 addr 0x80000
pci0 at ipci0
pci0: i/o space, memory space enabled
iteide0 at pci0 dev 2 function 0
iteide0: Integrated Technology Express IDE controller (rev. 0x13)
iteide0: bus-master DMA support present
iteide0: primary channel wired to native-PCI mode
iteide0: using irq 40 for native-PCI interrupt
atabus0 at iteide0 channel 0
iteide0: secondary channel wired to native-PCI mode
atabus1 at iteide0 channel 1
ohci0 at pci0 dev 4 function 0: NEC USB Host Controller (rev. 0x43)
ohci0: interrupting at irq 42
ohci0: OHCI version 1.0
usb0 at ohci0: USB revision 1.0
uhub0 at usb0
uhub0: NEC OHCI root hub, class 9/0, rev 1.00/1.00, addr 1
uhub0: 3 ports with 3 removable, self powered
ohci1 at pci0 dev 4 function 1: NEC USB Host Controller (rev. 0x43)
ohci1: interrupting at irq 42
ohci1: OHCI version 1.0
usb1 at ohci1: USB revision 1.0
uhub1 at usb1
uhub1: NEC OHCI root hub, class 9/0, rev 1.00/1.00, addr 1
uhub1: 2 ports with 2 removable, self powered
ehci0 at pci0 dev 4 function 2: NEC USB Host Controller (rev. 0x04)
ehci0: interrupting at irq 42
ehci0: BIOS has given up ownership
ehci0: EHCI version 1.0
ehci0: companion controllers, 3 ports each: ohci0 ohci1
usb2 at ehci0: USB revision 2.0
uhub2 at usb2
uhub2: NEC EHCI root hub, class 9/0, rev 2.00/1.00, addr 1
uhub2: 5 ports with 5 removable, self powered
com0 at mainbus0 addr 0x58000 irq 18 : ns16550a, working fifo
com0: console
ieth0 at mainbus0 addr 0x60000 irq 12 : 79RC32434 10/100 Ethernet
ieth0: Ethernet address 00:07:40:**:**:**
ieth0: Rx IRQ = 12, Tx IRQ = 13
ukphy0 at ieth0 phy 12: Generic IEEE 802.3u media interface
ukphy0: RTL8201L 10/100 media interface (OUI 0x000004, model 0x0020), rev. 1
ukphy0: 10baseT, 10baseT-FDX, 100baseTX, 100baseTX-FDX, auto
irtc0 at mainbus0: RICOH RS5C348A/B Real-time Clock
timecounter: Timecounter "clockinterrupt" frequency 100 Hz quality 0
timecounter: Timecounter "mips3_cp0_counter" frequency 200000000 Hz quality 100
wd0 at atabus0 drive 0: <ST3120022A>
wd0: drive supports 16-sector PIO transfers, LBA48 addressing
wd0: 111 GB, 232581 cyl, 16 head, 63 sec, 512 bytes/sect x 234441648 sectors
wd0: 32-bit data port
wd0: drive supports PIO mode 4, DMA mode 2, Ultra-DMA mode 5 (Ultra/100)
wd0(iteide0:0:0): using PIO mode 4, Ultra-DMA mode 5 (Ultra/100) (using DMA)
boot device: wd0
root on wd0e dumps on wd0b
root file system type: ffs
Sun Sep 16 13:29:35 GMT 2007
swapctl: adding /dev/wd0b as swap device at priority 0
Checking for botched superblock upgrades: done.
Starting file system checks:
/dev/rwd0e: file system is clean; not checking
/dev/rwd0g: file system is clean; not checking
/dev/rwd0j: file system is clean; not checking
Setting tty flags.
Setting sysctl variables:
Starting network.
Hostname: LS2BSD
IPv6 mode: host
Configuring network interfaces: ieth0.
add net default: gateway 192.168.11.1
Adding interface aliases:
Building databases...
Setting RTC offset to -540.
Setting date via ntp.
Mounting all filesystems...
Clearing /tmp.
Setting securelevel: kern.securelevel: 0 -> 1
Starting virecover.
Starting local daemons:.
Updating motd.
Starting sshd.
postfix/postfix-script: starting the Postfix mail system
not starting ls2_powerd.
***** LinkStation2 console switcher *****
Setting up serial-console mode.
Starting inetd.
Starting cron.
Sun Sep 16 13:30:01 JST 2007
NetBSD/evbmips (LS2BSD) (console)
login:
- memoのほうにも書いたが、iethのMACアドレスの部分に手抜きが残っている。
- パッチはもう少し整理したら公開します。→ http://kurobsd.ki.nu/download/testing/mipsel/patch-4/ に置きました。
- バイナリは未定...ご本家の4.0 RELEASEの公開時を予定。
(2007-09-22)
- evbmips-current(memo書きから移動)
- ごにょごにょ弄ったら動いた。
NetBSD loader module loaded
kernel=/boot/test_curr.bin
boot device=0xa0000404
boot flags=0x00000000
start address=0x80100000
flushing ide devices: hda
MIPS32/64 params: cpu arch: 32
MIPS32/64 params: TLB entries: 16
MIPS32/64 params: Icache: line = 16, total = 8192, ways = 4
sets = 128
MIPS32/64 params: Dcache: line = 16, total = 8192, ways = 4
sets = 128
picache_stride = 2048
picache_loopcount = 4
pdcache_stride = 2048
pdcache_loopcount = 4
NetBSD 4.99.31 (LS2) #1: Sat Sep 22 20:07:43 JST 2007
root@LS2BSD:/mnt/current/src/sys/arch/evbmips/compile/LS2
total memory = 65536 KB
avail memory = 59988 KB
mainbus0 (root)
cpu0 at mainbus0: 400.00MHz (hz cycles = 2000000, delay divisor = 200)
cpu0: MIPS 4Kc (0x1800a) Rev. 10 with software emulated floating point
cpu0: 8KB/16B 4-way set-associative L1 Instruction cache, 16 TLB entries
cpu0: 8KB/16B 4-way set-associative write-back L1 Data cache
ipci0 at mainbus0 addr 0x80000
pci0 at ipci0
pci0: i/o space, memory space enabled
iteide0 at pci0 dev 2 function 0
iteide0: Integrated Technology Express IDE controller (rev. 0x13)
iteide0: using irq 40 for native-PCI interrupt
atabus0 at iteide0 channel 0
atabus1 at iteide0 channel 1
ohci0 at pci0 dev 4 function 0: NEC USB Host Controller (rev. 0x43)
ohci0: interrupting at irq 42
ohci0: OHCI version 1.0
usb0 at ohci0: USB revision 1.0
uhub0 at usb0
uhub0: NEC OHCI root hub, class 9/0, rev 1.00/1.00, addr 1
uhub0: 3 ports with 3 removable, self powered
ohci1 at pci0 dev 4 function 1: NEC USB Host Controller (rev. 0x43)
ohci1: interrupting at irq 42
ohci1: OHCI version 1.0
usb1 at ohci1: USB revision 1.0
uhub1 at usb1
uhub1: NEC OHCI root hub, class 9/0, rev 1.00/1.00, addr 1
uhub1: 2 ports with 2 removable, self powered
ehci0 at pci0 dev 4 function 2: NEC USB Host Controller (rev. 0x04)
ehci0: interrupting at irq 42
ehci0: companion controllers, 3 ports each: ohci0 ohci1
usb2 at ehci0: USB revision 2.0
uhub2 at usb2
uhub2: NEC EHCI root hub, class 9/0, rev 2.00/1.00, addr 1
uhub2: 5 ports with 5 removable, self powered
com0 at mainbus0 addr 0x58000 irq 18 : ns16550a, working fifo
com0: console
ieth0 at mainbus0 addr 0x60000 irq 12 : 79RC32434 10/100 Ethernet
ieth0: Ethernet address 00:07:40:**:**:**
ieth0: Rx IRQ = 12, Tx IRQ = 13
ukphy0 at ieth0 phy 12: Generic IEEE 802.3u media interface
ukphy0: RTL8201L 10/100 media interface (OUI 0x000004, model 0x0020), rev. 1
ukphy0: 10baseT, 10baseT-FDX, 100baseTX, 100baseTX-FDX, auto
irtc0 at mainbus0: RICOH RS5C348A/B Real-time Clock
wd0 at atabus0 drive 0: <ST3120022A>
wd0: 111 GB, 232581 cyl, 16 head, 63 sec, 512 bytes/sect x 234441648 sectors
boot device: wd0
root on wd0e dumps on wd0b
root file system type: ffs
Sat Sep 22 20:14:03 GMT 2007
swapctl: adding /dev/wd0b as swap device at priority 0
Checking for botched superblock upgrades: done.
Starting file system checks:
/dev/rwd0e: file system is clean; not checking
/dev/rwd0g: file system is clean; not checking
/dev/rwd0j: file system is clean; not checking
Setting tty flags.
Setting sysctl variables:
Starting network.
Hostname: LS2BSD
IPv6 mode: host
Configuring network interfaces: ieth0ieth0: cannot assign link-local address
.
add net default: gateway 192.168.0.1
Adding interface aliases:
Building databases...
Starting syslogd.
Setting RTC offset to -540.
Setting date via ntp.
Mounting all filesystems...
Clearing /tmp.
Setting securelevel: kern.securelevel: 0 -> 1
Starting virecover.
Starting local daemons:.
Updating motd.
Starting sshd.
postfix/postfix-script: starting the Postfix mail system
not starting ls2_powerd.
***** LinkStation2 console switcher *****
Setting up serial-console mode.
Starting inetd.
Starting cron.
Sat Sep 22 20:14:29 JST 2007
NetBSD/evbmips (LS2BSD) (console)
login:
- 一箇所iethでエラーになっているようだ。
- どうせマルチキャストフィルタまわりだろう...(手抜き)
- ↑Linkstation-mipsel/kern/200705-07の2007-05-22に書いてある修正が入っていなかった orz
- ↑netbsd-4のパッチも間違っていた orz
- パッチ作成
- netbsd-4ブランチ: http://kurobsd.ki.nu/download/testing/mipsel/patch-4/
- current: http://kurobsd.ki.nu/download/testing/mipsel/patch-current/
- (netbsd-4ブランチ側のパッチの名前規則を変更しました。ご了承願います。_o_)
(2007-10-31)
- 送信パケット(TCP)のチェックサム問題。
- 当初、iethのバグかと思っていたが、どうも違うようだ。
- aueを使っていても、頻度は低いがTCPチェックサムエラーが発生している。
- 次に怪しいのはメモリ(cache)制御周りか。
(2007-11-02)
- CPU cache周りで怪しいものをピックアップ。ブートログに以下のものが出ている(from cache.c)。
MIPS32/64 params: cpu arch: 32
MIPS32/64 params: TLB entries: 16
MIPS32/64 params: Icache: line = 16, total = 8192, ways = 4
sets = 128
MIPS32/64 params: Dcache: line = 16, total = 8192, ways = 4
sets = 128
- たぶん以下のとおり。
- cpu archはMIPS32なので32で正しい。
- TLB entriesも16で正しい。
- cache lineはLine Sizeだろうから、16bytesで正しい。
- totalはキャッシュサイズだから、8192bytesで正しい。
- Lines per setは4 way set associativeだから4で正しい。
- sets は Number of cache setsだから、マニュアルによると256。ここは誤認している?
- なんだか変だな...。マニュアルが間違っている??
- ここはどうもcache.cのコーディングミスっぽいが...。
- CP0 Register 16の値を直読してみるか...
- なんだか変だな...。マニュアルが間違っている??
(2007-11-03)
- レジスタ直読。
- CFG0は0x80050083。
- CFG1は0x9e5b2d8a。
- 考察。
- CFG0の最下位3ビットはキャッシュタイプ。0x3なのでcacheable, write-back, cohelent, no write allocate.
- これをマニュアル通りwrite-throughとするには0x0となってなければならないはず。
- CFG1のMSBが立っているので、CFG2が有ることを意味するが、マニュアルにはここは0固定と書いてある。
- CFG0の最下位3ビットはキャッシュタイプ。0x3なのでcacheable, write-back, cohelent, no write allocate.
- #なんだかボロボロ orz
- よくわからないが、マニュアルに書いてあることを(自分の都合の良いように)信じてみる。
- cacheの扱いはr4k相当とのこと。
- でも、MIPS32ということで、NetBSDではmips_config_cache_modern()を実行している。
- mips_config_cache_modern()の中身は、主にmipsXX_*という関数ポインタの登録になっている。(r4k_*の登録では無い)
- 各々対応する関数を比較すると、やはり若干異なる。
- とりあえず確認をするため、全てのmipsXX_*をr4k_*に書き換えてみる。
- 上記、ブートはしたのでこのまま様子をみる。
- # cohelentまわりもフラグ指定の実験をする必要があるかも。
(2007-11-04)
- 上記キャッシュ制御の変更、今の所効果が有った模様。
- r4k化によって受信側でのTCP checksumは発生していない。(あくまで今の所)
- もう少し様子を見るつもり。
- # 仮に効果が有ったと仮定しても、現在のフレームワークに取り込んだ形での改造が厳しかったりする場所なのだが...
- 遅くなった?のか、dnetc -benchでチェック。
[Nov 04 13:45:34 UTC] RC5-72: using core #0 (ANSI 4-pipe).
[Nov 04 13:45:54 UTC] RC5-72: Benchmark for core #0 (ANSI 4-pipe)
0.00:00:16.81 [25,698 keys/sec]
[Nov 04 13:45:54 UTC] RC5-72: using core #1 (ANSI 2-pipe).
[Nov 04 13:46:14 UTC] RC5-72: Benchmark for core #1 (ANSI 2-pipe)
0.00:00:16.77 [22,080 keys/sec]
[Nov 04 13:46:14 UTC] RC5-72: using core #2 (ANSI 1-pipe).
[Nov 04 13:46:33 UTC] RC5-72: Benchmark for core #2 (ANSI 1-pipe)
0.00:00:16.39 [136,541 keys/sec]
[Nov 04 13:46:33 UTC] RC5-72: using core #3 (MIPS 2-pipe).
[Nov 04 13:46:51 UTC] RC5-72: Benchmark for core #3 (MIPS 2-pipe)
0.00:00:16.23 [97,330 keys/sec]
[Nov 04 13:47:11 UTC] OGR-P2: Benchmark for core #0 (GARSP 6.0)
0.00:00:16.12 [938,492 nodes/sec]
- 確かに4月に計った値よりも遅いなぁ orz
(2007-11-05)
- 上記キャッシュ制御、忘れてください orz
- 別口の変更が効果が有った可能性があるのですが、r4k_*はダメのようです。
- # 白昼夢でも見ていたのか...
(2007-11-06)
- ベンチマーク取り直し。
[Nov 05 14:05:47 UTC] RC5-72: using core #0 (ANSI 4-pipe).
[Nov 05 14:06:06 UTC] RC5-72: Benchmark for core #0 (ANSI 4-pipe)
0.00:00:16.86 [27,340 keys/sec]
[Nov 05 14:06:06 UTC] RC5-72: using core #1 (ANSI 2-pipe).
[Nov 05 14:06:26 UTC] RC5-72: Benchmark for core #1 (ANSI 2-pipe)
0.00:00:16.60 [23,790 keys/sec]
[Nov 05 14:06:26 UTC] RC5-72: using core #2 (ANSI 1-pipe).
[Nov 05 14:06:45 UTC] RC5-72: Benchmark for core #2 (ANSI 1-pipe)
0.00:00:16.34 [136,943 keys/sec]
[Nov 05 14:06:45 UTC] RC5-72: using core #3 (MIPS 2-pipe).
[Nov 05 14:07:03 UTC] RC5-72: Benchmark for core #3 (MIPS 2-pipe)
0.00:00:16.20 [101,595 keys/sec]
[Nov 05 14:07:23 UTC] OGR-P2: Benchmark for core #0 (GARSP 6.0)
0.00:00:16.10 [938,631 nodes/sec]
- だいぶ速くなった。でも四月の結果には及ばない。
- ブートローダーでのDDRコントローラのレジスタ操作を止めてみたのが上記。
- 併せて、CPUキャッシュを制御できるかもしれないので、CFG0の下位3ビットを0クリアしてみている。
- 次はCFG0の書き換えを止めてみる。
- CFG0の書き換えを止めても全く変わらず。ここに関してはマニュアルが正しいっぽい...。
(2007-11-10)
- 送信パケット(TCP)のチェックサム問題。
- 思いつきを実行してみたら、何と、絶大な効果が!\(^o^)/(←大げさ)
- (請うご期待)
- 続き。
- TCPチェックサムが問題なのだから、TCPチェックサムを計算する関数が問題に一番近いのではないか、という仮説(思いつき)に基づき作業。
- TCP(に限らず)チェックサムは、in_cksum()で計算する。
- in_cksum()は効率面からか、arch毎に作成されている場合が多い。
- たとえばmipsの場合はarch/mips/mips/in_cksum.c, i386の場合はarch/i386/i386/in_cksum.S(アセンブラ)。
- 最初は上記in_cksum.cをオプティマイズ無し(-O0)でコンパイルしてみたが、効果が無かった。
- 次に、確か汎用(arch非依存)のが有ったはず、というのを思い出し、netinet/in_cksum.c(とnetinet/in4_cksum.c)を代わりに組み込んでみた。
- mipsアーキテクチャでarch/mips/mips/in_cksum.cを外すのは通常の方法では厳しいため、configコマンドで生成されたMakefileを直接書き換えた。
- で、今の所かなり順調なわけです。(^_^)
- もう少し(数日?)様子を見てみます。
- パッチが非常に作りづらいのが難点。
- arch/mips/mips/in_cksum.cの「ここがバグ!」っていうのは判れば簡単でしょうが... orz
- パッチ作成。
- 中身は... ブー(AA略)なことになってしまった orz
- (ライトサイドしか知らない良い子は真似しないでね)
- 中身は... ブー(AA略)なことになってしまった orz
- netbsd-3, netbsd-4, currentで動作確認中。
- 一応全部確認。(今のところ)問題無さそう。
- 2~3日cvsyncを動かして負荷をかけてみる。
- ベンチマーク取り直し。
- makeoptions CPUFLAGS="-march=4kc -mtune=4kc"を外していたのを復活させた。
[Nov 10 14:28:58 UTC] RC5-72: using core #0 (ANSI 4-pipe).
[Nov 10 14:29:18 UTC] RC5-72: Benchmark for core #0 (ANSI 4-pipe)
0.00:00:16.86 [27,351 keys/sec]
[Nov 10 14:29:18 UTC] RC5-72: using core #1 (ANSI 2-pipe).
[Nov 10 14:29:37 UTC] RC5-72: Benchmark for core #1 (ANSI 2-pipe)
0.00:00:16.59 [23,808 keys/sec]
[Nov 10 14:29:37 UTC] RC5-72: using core #2 (ANSI 1-pipe).
[Nov 10 14:29:56 UTC] RC5-72: Benchmark for core #2 (ANSI 1-pipe)
0.00:00:16.33 [137,078 keys/sec]
[Nov 10 14:29:56 UTC] RC5-72: using core #3 (MIPS 2-pipe).
[Nov 10 14:30:15 UTC] RC5-72: Benchmark for core #3 (MIPS 2-pipe)
0.00:00:16.26 [101,696 keys/sec]
[Nov 10 14:30:34 UTC] OGR-P2: Benchmark for core #0 (GARSP 6.0)
0.00:00:16.10 [938,631 nodes/sec]
- 若干いい感じ?
(2007-12-20)
- 緊急告知!
- LinkStation2をNFSクライアントとし、他のマシンのディスクをマウントした際、書き込み時にデータが化けるようです。
- その他状況(read等)は完全には把握していませんが、大丈夫なようです。
- ftp等での転送も確認した限り問題ないです。NFSだけのようです。
- netbsd-3ベースでは問題はありません。netbsd-4ベースでは問題が出ています。current(4.99.40)は問題有りません。
- もう少し詳細に追跡したいと思います。とりいそぎ。
(2008-01-26)
- メモ書きのほうに経緯を書いていますが、PR/33152のパッチをnetbsd-4ブランチに当てることでNFSの書き込み問題は解決した模様です。
- 上記PRのパッチを含んだ形のパッチ、およびカーネルをアップロードしました。テストをお願いします。
(なし崩しに続く...)
36400
このwikiの更新情報RSS