How to use X Window System on NetBSD/alpha?
Best graphic card for NetBSD/alpha to get X running?
I will answer your question below.
The following chipset have been tested.
Tsunami
Alpha Station XP1000(Tsunami chipset) pic.twitter.com/OLez7bS5nG
— Lucky owner/capturer (@nullnilaki) 2016年11月20日
Titan
Alpha Station / Server DS 15(Titan chipset) pic.twitter.com/NAuoV45IZ1
— Lucky owner/capturer (@nullnilaki) 2016年11月20日
DEC Multia UDB May not work :-(
DEC Multia UDB
— Lucky owner/capturer (@nullnilaki) 2016年11月20日
May not work pic.twitter.com/cXgzSU7pif
Just for more information.
AlphaStation - Wikipedia
The following graphic card have been tested.
ATI RADEON 7500(HP genuine parts)
RADEON 7500(HP genuine parts) pic.twitter.com/7MiItYCvvP
— Lucky owner/capturer (@nullnilaki) 2016年11月20日
See:
http://cvsweb.netbsd.org/bsdweb.cgi/src/sys/arch/alpha/conf/GENERIC?rev=1.357&content-type=text/x-cvsweb-markup&only_with_tag=MAIN
http://cvsweb.netbsd.org/bsdweb.cgi/src/sys/dev/pci/radeonfb.c?rev=1.82&content-type=text/x-cvsweb-markup&only_with_tag=MAIN
ELSA GLoria Synergy(Compaq genuine parts)
ELSA,GLoria Synergy(Compaq genuine parts) pic.twitter.com/cmiIKisvdT
— Lucky owner/capturer (@nullnilaki) 2016年11月20日
See:
http://cvsweb.netbsd.org/bsdweb.cgi/src/sys/arch/alpha/conf/GENERIC?rev=1.363&content-type=text/x-cvsweb-markup&only_with_tag=MAIN
http://cvsweb.netbsd.org/bsdweb.cgi/src/sys/dev/pci/pm2fb.c?rev=1.27&content-type=text/x-cvsweb-markup&only_with_tag=MAIN
3DLabs Oxygen VX1(Compaq genuine parts)
Oxygen VX1(Compaq genuine parts) pic.twitter.com/0X5YlDdqyw
— Lucky owner/capturer (@nullnilaki) 2016年11月20日
If your alpha station has Oxygen VX1 graphics card, please try this patch!
Just for more information.
Graphic Card Compatibility List for Alpha Systems
Building the System from Source.
NetBSD-7.0.2/alpha has wrong(vely old) Xfree driver.
Please don't use it.(At least you want to run X)
The reason is because X cannot access /dev/mem in my opinion.
See:
# uname -a NetBSD 7.0.2 NetBSD 7.0.2 (GENERIC-$Revision: 1.358.4.2 $.201610210724Z) alpha # pwd /usr/X11R6/bin # ls -l total 26694 lrwxr-xr-x 1 root wheel 25 Oct 21 08:22 X -> /usr/X11R6/bin/XdecNetBSD -rws--x--x 1 root wheel 2142841 Oct 21 08:22 XalphaNetBSD -r-xr-xr-x 1 root wheel 2210822 Oct 21 08:22 XdecNetBSD -r-xr-xr-x 1 root wheel 2274112 Oct 21 08:22 Xdmx
Please try NetBSD/alpha current branch and building the System from Source.
See:
how to build netbsd-current
The following condition is correct.(At least you want to run X)
See:
# pwd /usr/X11R7/bin # ls -l total 15524 lrwxr-xr-x 1 root wheel 19 Nov 13 2016 X -> /usr/X11R7/bin/Xorg -r-xr-xr-x 1 root wheel 27271 Feb 21 2011 Xmark -r-xr-xr-x 1 root wheel 2449912 Nov 13 2016 Xnest -rws--x--x 1 root wheel 3481376 Nov 13 2016 Xorg -r-xr-xr-x 1 root wheel 2655728 Nov 13 2016 Xvfb -r-xr-xr-x 1 root wheel 14504 Nov 13 2016 appres
System Settings.
NetBSD/alpha current branch has been successfully installed, The system outputted an following dmesg.
ATI RADEON 7500
See:
pci1 at tsp1 bus 0 radeonfb0 at pci1 dev 7 function 0: vendor 1002 product 5157 (rev. 0x00) radeonfb0: 64 MB aperture at 0x40000000, 64 KB registers at 0x01060000 radeonfb0: display 0: initial virtual resolution 640x480 at 32 bpp radeonfb0: using 32 MB per display radeonfb0: port 0: physical 1024x768 60Hz radeonfb0: port 1: physical 1024x768 60Hz wsdisplay1 at radeonfb0 kbdmux 1 drm at radeonfb0 not configured tlp0 at pci1 dev 9 function 0: DECchip 21140A Ethernet, pass 2.0
ELSA GLoria Synergy
See:
usb0 at ohci0: USB revision 1.0 pm2fb0 at pci0 dev 11 function 0: vendor 104c product 3d07 (rev. 0x01) pm2fb0: no width property pm2fb0: no height property pm2fb0: no depth property pm2fb0: 8 MB aperture at 0x01000000 pm2fb0: pm2 using 1280 x 1024 in 8 bit, stride 1280 wsdisplay0 at pm2fb0 kbdmux 1: console (default, vt100 emulation) wsmux1: connecting to wsdisplay0 isa0 at sio0
3Dlabs Oxygen VX1
See:
usb0 at ohci0: USB revision 1.0 pm3fb0 at pci0 dev 11 function 0: vendor 3d3d product 000a (rev. 0x01) pm3fb0: no width property pm3fb0: no height property pm3fb0: no depth property pm3fb0: 16 MB aperture at 0x40000000 pm3fb0: pm3 using 1280 x 1024 in 8 bit, stride 1280 wsdisplay0 at pm3fb0 kbdmux 1: console (default, vt100 emulation) wsmux1: connecting to wsdisplay0 isa0 at sio0
Next, you have to configure X.
See:
Chapter 9. X
Modify the /etc/X11/xorg.conf settings.
radeon or glint driver does not work.
Please use wsfb driver.
See:
ftp://www.x.org/pub/xorg/X11R7.5/doc/man/man4/wsfb.4.html
Section "Device" Identifier "Card0" Driver "wsfb" BusID "PCI:0:7:0" EndSection
Everything is ready!
I hope that a happy X time will come around for you.
Alpha Station XP1000
— Lucky owner/capturer (@nullnilaki) 2016年11月18日
Using pm3fb(oxygen vx1) driver working in NetBSD/alpha pic.twitter.com/BxekZj3lLX
Alpha Station DS15
— Lucky owner/capturer (@nullnilaki) 2016年11月20日
Using radeonfb driver working in NetBSD/alpha pic.twitter.com/kFXo0k1bvi
Alpha Station XP1000
— Lucky owner/capturer (@nullnilaki) 2016年11月20日
Using pm2fb driver working in NetBSD/alpha pic.twitter.com/eOWEHsXnhl
Alpha Station XP1000
— Lucky owner/capturer (@nullnilaki) 2016年11月20日
Using pm3fb driver working in NetBSD/alpha pic.twitter.com/UzGPZgsGCJ
OpenBSD/sgi MPカーネルの性能の話
序論
OpenBSD/sgiのリリース6.0でIP27カーネルを使う一部の機種(TezroやOnyx350やOrigin350)にシングルノード限定ではあるものの、Multiprocessorサポートが入りました。
https://www.openbsd.org/sgi.html
Origin350を始めとしたNUMA機のカーネルのSMP化は@syuu1228さんが過去に挑戦されていた実績があります。
@syuu1228さんはIP30カーネルを使う機種(Octane、Octane2)のカーネルのSMP化を実装された実績があります。
@MiodVallatさんと性能テストをするという約束をしていたのですが、すっぽかしていたので、とても時間が経ってしまいましたが、(半年ほど遅れてしまいましたが)テストを行いました。
@nullnilaki don't forget to send a dmesg to dmesg@ !
— Ghost of Arches Past (@MiodVallat) 2016年5月27日
とりあえずdmesg
SGI Tezro R16000 800 MHz x 4
SGI Tezro - Wikipedia
# dmesg [ using 632960 bytes of bsd ELF symbol table ] Copyright (c) 1982, 1986, 1989, 1991, 1993 The Regents of the University of California. All rights reserved. Copyright (c) 1995-2016 OpenBSD. All rights reserved. http://www.OpenBSD.org OpenBSD 6.0 (GENERIC-IP27.MP) #112: Thu Jul 28 18:21:48 MDT 2016 deraadt@sgi.openbsd.org:/usr/src/sys/arch/sgi/compile/GENERIC-IP27.MP real mem = 4294967296 (4096MB) rsvd mem = 20643840 (20MB) avail mem = 4205133824 (4010MB) warning: no entropy supplied by boot loader mainbus0 at root: Origin 350 cpu0 at mainbus0 nasid 0: R16000 CPU rev 2.2 800 MHz, R16000 FPU rev 2.2 cpu0: cache L1-I 32KB D 32KB 2 way, L2 4096KB 2 way clock0 at mainbus0 nasid 0: int 5 cpu1 at mainbus0 nasid 0: R16000 CPU rev 2.2 800 MHz, R16000 FPU rev 2.2 cpu1: cache L1-I 32KB D 32KB 2 way, L2 4096KB 2 way cpu2 at mainbus0 nasid 0: R16000 CPU rev 2.2 800 MHz, R16000 FPU rev 2.2 cpu2: cache L1-I 32KB D 32KB 2 way, L2 4096KB 2 way cpu3 at mainbus0 nasid 0: R16000 CPU rev 2.2 800 MHz, R16000 FPU rev 2.2 cpu3: cache L1-I 32KB D 32KB 2 way, L2 4096KB 2 way spdmem0 at mainbus0 nasid 0 dimm 0: 1GB DDR SDRAM registered ECC PC2000CL2.5 spdmem1 at mainbus0 nasid 0 dimm 1: 1GB DDR SDRAM registered ECC PC2000CL2.5 spdmem2 at mainbus0 nasid 0 dimm 2: 512MB DDR SDRAM registered ECC PC1600CL2.5 spdmem3 at mainbus0 nasid 0 dimm 3: 512MB DDR SDRAM registered ECC PC1600CL2.5 spdmem4 at mainbus0 nasid 0 dimm 4: 512MB DDR SDRAM registered ECC PC1600CL2.5 spdmem5 at mainbus0 nasid 0 dimm 5: 512MB DDR SDRAM registered ECC PC1600CL2.5 xbow0 at mainbus0 nasid 0: PXBow revision 3 xbridge0 at xbow0 widget 15: PIC revision 3 xbpci0 at xbridge0 bus 0: 66 MHz PCI bus pci0 at xbpci0 bus 0 iof0 at pci0 dev 0 function 0 "SGI IOC4" rev 0x4f: irq 0, xbow irq 62 com0 at iof0 base 0x380: ns16550a, 16 byte fifo com0: console com1 at iof0 base 0x388: ns16550a, 16 byte fifo com2 at iof0 base 0x390: ns16550a, 16 byte fifo com3 at iof0 base 0x398: ns16550a, 16 byte fifo iockbc0 at iof0 base 0x200 dsrtc0 at iof0 base 0x80000: DS1742W ppb0 at pci0 dev 1 function 0 "TI PCI2050" rev 0x01 pci1 at ppb0 bus 1 envy0 at pci1 dev 2 function 0 "IC Ensemble Envy24PT/HT Audio" rev 0x01: irq 1, xbow irq 61 envy0: unknown 1724-based card, 2 inputs, 8 outputs audio0 at envy0 midi at envy0 not configured qlw0 at pci0 dev 2 function 0 "QLogic ISP12160" rev 0x06: irq 2, xbow irq 60 qlw0: nvram corrupt qlw0: firmware rev 10.4.41, attrs 0x0 scsibus0 at qlw0: 16 targets, initiator 0 sd0 at scsibus0 targ 1 lun 0: <SGI, ST373307LC, 2741> SCSI3 0/direct fixed serial.SGI_ST373307LC_3HZ6HQZS00007421QXB8 sd0: 70007MB, 512 bytes/sector, 143374744 sectors scsibus1 at qlw0: 16 targets, initiator 0 bge0 at pci0 dev 3 function 0 "Broadcom BCM5701" rev 0x15, BCM5701 B5 (0x105): irq 3, xbow irq 59, address 08:00:69:13:ea:b8 brgphy0 at bge0 phy 1: BCM5701 10/100/1000baseT PHY, rev. 0 xbpci1 at xbridge0 bus 1: 33 MHz PCI bus pci2 at xbpci1 bus 0 "SGI Rad1" rev 0xd0 at pci2 dev 0 function 0 not configured ioc0 at pci2 dev 1 function 0 "SGI IOC3" rev 0x01 onewire0 at ioc0 owserial0 at onewire0 "16kb EPROM" sn 00000059b2e0 owserial0: "PCI_SIO_UFC" p/n 030-1657-003, serial MNC900 ioc0: superio irq 1, xbow irq 57 com4 at ioc0 base 0x20178: ns16550a, 16 byte fifo com5 at ioc0 base 0x20170: ns16550a, 16 byte fifo qlw1 at pci2 dev 2 function 0 "QLogic ISP1240" rev 0x01: irq 2, xbow irq 56 qlw1: firmware rev 8.15.0, attrs 0x0 scsibus2 at qlw1: 16 targets, initiator 7 scsibus3 at qlw1: 16 targets, initiator 7 xbridge1 at xbow0 widget 11: PIC revision 3 xbpci2 at xbridge1 bus 0: 133 MHz PCIX bus pci3 at xbpci2 bus 0 qla0 at pci3 dev 0 function 0 "QLogic ISP2312" rev 0x02: irq 0, xbow irq 54 firmware load failed qla0: firmware load failed qla1 at pci3 dev 0 function 1 "QLogic ISP2312" rev 0x02: irq 4, xbow irq 54 firmware load failed qla1: firmware load failed xbpci3 at xbridge1 bus 1: 133 MHz PCIX bus pci4 at xbpci3 bus 0 qla2 at pci4 dev 1 function 0 "QLogic ISP2312" rev 0x02: irq 1, xbow irq 53 firmware load failed qla2: firmware load failed qla3 at pci4 dev 1 function 1 "QLogic ISP2312" rev 0x02: irq 5, xbow irq 53 firmware load failed qla3: firmware load failed odyssey0 at xbow0 widget 12: Odyssey device has not been setup by firmware! "Kona" revision 0 at xbow0 widget 13 not configured vscsi0 at root scsibus4 at vscsi0: 256 targets softraid0 at root scsibus5 at softraid0: 256 targets boot device: sd0 root on sd0a (ff91e3200f2e2df7.a) swap on sd0b dump on sd0b cpu3 launched cpu2 launched cpu1 launched #
ちゃんと4CPU認識されています。
ベンチマーク1
せっかくなのでGENERIC-IP27.MPをコンパイルする時間をMPカーネルとUPカーネルで計ってベンチマークをとってみました。
MPカーネルの場合
make -j 4 text data bss dec hex 6399024 123304 740132 7262460 6ed0fc 13m05.77s real 24m17.81s user 2m02.76s system text data bss dec hex 6399024 123304 740132 7262460 6ed0fc 13m00.37s real 24m15.41s user 2m00.92s system text data bss dec hex 6399024 123304 740132 7262460 6ed0fc 13m01.00s real 24m15.54s user 1m59.89s system text data bss dec hex 6399024 123304 740132 7262460 6ed0fc 13m00.40s real 24m15.03s user 1m59.35s system ----------------------------------------------------------------------- make -j 1 text data bss dec hex 6399024 123304 740132 7262460 6ed0fc 28m36.97s real 24m13.87s user 1m22.54s system text data bss dec hex 6399024 123304 740132 7262460 6ed0fc 28m35.14s real 24m13.25s user 1m23.49s system text data bss dec hex 6399024 123304 740132 7262460 6ed0fc 28m36.12s real 24m13.78s user 1m23.73s system text data bss dec hex 6399024 123304 740132 7262460 6ed0fc 28m36.16s real 24m12.82s user 1m23.91s system
UPカーネルの場合
make text data bss dec hex 6399024 123304 740132 7262460 6ed0fc 31m09.58s real 26m12.86s user 1m38.79s system text data bss dec hex 6399024 123304 740132 7262460 6ed0fc 31m01.38s real 26m17.84s user 1m38.67s system text data bss dec hex 6399024 123304 740132 7262460 6ed0fc 31m04.14s real 26m17.53s user 1m40.29s system text data bss dec hex 6399024 123304 740132 7262460 6ed0fc 31m03.50s real 26m14.39s user 1m41.37s system
考察1
★このようにMPカーネルを使った場合、make -j 1とmake -j 4では処理にかかる時間が半分以下になっていることがわかります。
★また意外なことに、UPカーネルでmakeを行った場合とMPカーネルでmake -j 1を行った場合では、MPカーネルのほうが性能が良いことがわかります。(CPUを1個しか使わない場合では、MPカーネル特有のオーバーヘッドがかからないぶん、UPカーネルのほうが性能が良いのでは?と予測していたので意外でした。)
ベンチマーク2
せっかくなので他の機種でもGENERIC-IP27.MPをコンパイルする時間を計ってベンチマークをとってみました。
SGI Fuel R16000 900 MHz x 1
OpenBSD 6.0 (GENERIC-IP27) #721: Thu Jul 28 16:32:25 MDT 2016 deraadt@sgi.openbsd.org:/usr/src/sys/arch/sgi/compile/GENERIC-IP27 real mem = 4294967296 (4096MB) rsvd mem = 20643840 (20MB) avail mem = 4205166592 (4010MB) warning: no entropy supplied by boot loader mainbus0 at root: Fuel cpu0 at mainbus0 nasid 0: R16000 CPU rev 3.0 900 MHz, R16000 FPU rev 3.0 cpu0: cache L1-I 32KB D 32KB 2 way, L2 8192KB 2 way
IP27カーネルを使用 1CPUマシンなのでUPカーネルのみ
make text data bss dec hex 6399024 123304 740132 7262460 6ed0fc 25m48.50s real 20m36.65s user 0m40.77s system
SGI O2+ R5000 300 MHz x 1
OpenBSD 6.0 (GENERIC-IP32) #639: Thu Jul 28 17:34:01 MDT 2016 deraadt@sgi.openbsd.org:/usr/src/sys/arch/sgi/compile/GENERIC-IP32 real mem = 671088640 (640MB) rsvd mem = 7020544 (7MB) avail mem = 632971264 (603MB) warning: no entropy supplied by boot loader mainbus0 at root: O2 cpu0 at mainbus0: PMC-Sierra RM52X0 CPU rev 10.0 300 MHz, RM52X0 FPC rev 10.0 cpu0: cache L1-I 32KB D 32KB 2 way, L2 1024KB direct
IP32カーネルを使用 1CPUマシンなのでUPカーネルのみ
make text data bss dec hex 6399024 123304 740132 7262460 6ed0fc 139m49.04s real 127m17.12s user 10m24.63s system
SGI POWER Indigo2 R8000 75 MHz x 1
SGI Indigo² and Challenge M - Wikipedia
OpenBSD 6.0 (GENERIC-IP26) #239: Thu Jul 28 16:08:43 MDT 2016 deraadt@sgi.openbsd.org:/usr/src/sys/arch/sgi/compile/GENERIC-IP26 real mem = 536870912 (512MB) rsvd mem = 1064960 (2MB) avail mem = 526106624 (501MB) mainbus0 at root: POWER Indigo2 R8000 cpu0 at mainbus0: MIPS R8000 CPU rev 0.0 75 MHz, R8010 FPU rev 0.1 cpu0: cache L1-I 16KB D 16KB direct, L2 2048KB direct
IP26カーネルを使用 1CPUマシンなのでUPカーネルのみ
make text data bss dec hex 6399024 123304 740132 7262460 6ed0fc 240m49.90s real 222m52.90s user 15m03.00s system
考察2
★FuelとTezroは同じIP27カーネルを使ってテストを行ったのですが、Tezroの800Mhに比べてFuelの900Mhzは処理がかなり高速なことがわかります。これはTezroが4MBという2次キャッシュを持っているのに比べ、Fuelが倍の8MBという巨大なキャッシュを持っていることが原因だと思われます。
★75Mhzというクロックの割にPOWER Indigo2 R8000の性能が良いことがわかります。R8000も2MBという巨大なキャッシュを持っているので、キャッシュが性能を発揮しているのかもしれません。
思ったこと
考察2でも述べたようにFuelとTezroは同じIP27カーネルを使うのですが、FuelにOSをインストールする時には、MPカーネルが選択肢に出ないことに気づきました。これについて感想を述べたところ@ao_kenjiさんから以下のようなアドバイスをいただきました。
むむっ...
— Lucky owner/capturer (@nullnilaki) 2016年10月22日
OpenBSD/sgiのインストーラ、SMPマシンだとインストールするカーネルの選択肢にbsd.***とbsd.mp.***が出てきて、UPマシンだとbsd.***しか出ないのか...
賢い?のか?https://t.co/UWgUuyUAaE
@nullnilaki 普通に使うにはUPマシンでMPカーネルを使う必要がないから:-)
— Kenji Aoyama (@ao_kenji) 2016年10月23日
「余分なものは入れない、自動起動しない。必要なものは勉強してから入れたり設定したりしてね。ドキュメント用意しておくから。」っていうスタンスじゃないかと思います。
マルチノードのNUMA機のサポートってどうするんでしょうか?@tsutsuiiさんとこのような話をしたことがありますが、メモリのアクセス速度に差があるという点では一致しているものの、そもそもアーキテクチャがまったく違う次元の話でしょうし... 教えて、偉い人
@nullnilaki 私が最初に見たのは mvme68k で、キャッシュが効かないVMEバス上の増設メモリは優先度したにするというコードでした。あとは atari と x68k でも同様に速いメモリを優先しているはずです。他はちゃんと見ていません
— Izumi Tsutsui (@tsutsuii) 2014年10月26日
ジャンクの価値は?
ジャンクの価値?
N君がある日TLを見ていると、とても興味深いtweetが流れてきました。
ああ、alphaほしいなぁ。今は亡きBSD Magazineの創刊号に、真の64ビットマシンですとか書いてあって憧れてました。当時、リアル中坊だったので、そんなもの買えるはずもなく。ヤフオクに比較的手頃な大きさのが出てるけど、値段ががが…
— ぼんくら物理学者 (@LabDrunker) 2016年10月17日
相場としてどうなんでしょうか > 識者諸兄
— ぼんくら物理学者 (@LabDrunker) 2016年10月17日
Alphaマシンなどは一般的にはジャンク品という扱いになると思います。
ジャンク品 (パーソナルコンピュータ) - Wikipediaではジャンク品(ジャンクひん、junk)とは、本来、「故障品」「不要品」「がらくた」の意味のことである。と解説してありました。
さて、一般的にジャンクと呼ばれるコンピュータの価値はいかほどなのでしょうか?
Nくんの家のジャンク
Nくんの家には足の踏み場もないほどにジャンク品のコンピュータが転がっています。
ちょっとだけ紹介してみます。みなさん、いくつご存知でしょうか?
NEC SX-8i
SX-8i、メモリ16GBのモデルだったか...
— Lucky owner/capturer (@nullnilaki) 2016年3月28日
PCIバスが出ているあたりが、ご愛嬌...
まぁ、ACOSもPCIのFCカード経由でディスク繋ぐし、そんなもんか pic.twitter.com/cFbKleVxsI
S-4/20LとEWS4800 430とAlphaStation DS15
EWS4800がtsutsuii家から我が家にお嫁に来ました。「デカイ」との話でしたが、「WSならこんなもんじゃね?」な大きさでした。Alpha Station DS15と同じくらいの大きさです。S-4/20Lの1.8倍くらいかな? pic.twitter.com/q6KPVeBEhF
— Lucky owner/capturer (@nullnilaki) 2013年4月2日
GENIALstation 737
NetBSD/sparc64 + mlterm-fb + sixel対応版mikutterm という 実は LUNA-II と同じデモをしていた GENIALstation 737の図。 That's NetBSD! とはこのことです pic.twitter.com/pCdXWBuezx
— Izumi Tsutsui (@tsutsuii) 2014年8月3日
Sgi Tezro Fuel O2+ O2 Octane2 Power Indigo2 Indy Indigo
ちょっと前にSGIマシンの虫干しをしたんだった...
— Lucky owner/capturer (@nullnilaki) 2016年8月15日
ちちくらべ的な... pic.twitter.com/0ecy9ZPHgE
Sgi Onyx350
Miod-san.
— Lucky owner/capturer (@nullnilaki) 2013年12月5日
ARIGATO!!
起動方法わかったら、
dmesg貼りますね! pic.twitter.com/UyDEBSI2vv
Sgi Power Indigo2
NBUG展示: Indigo2の起動(?)画面。無駄にかっこいい(ほめ言葉)。 pic.twitter.com/ToGXuxgsfW
— Kenji Aoyama (@ao_kenji) 2016年5月28日
EWS48000 430 EWS4800 530
つついさんから頂いたEWS4800/430の箱あさくってたら、キーボードあった! pic.twitter.com/tjmFE9eaxJ
— Lucky owner/capturer (@nullnilaki) 2014年4月4日
RS/6000 170
rs/6000 model 170でNetBSD/ofppc起動したんで貼っときますね
— Lucky owner/capturer (@nullnilaki) 2014年7月26日
ちなみにココで固まってしまった...https://t.co/8zbZ5kJhSe
Alpha Server DS25
ヽ( ´¬`)ノ Alpha Server DS25を手に入れた! pic.twitter.com/I3KjRapaR3
— Lucky owner/capturer (@nullnilaki) 2014年6月22日
Alpha station XP1000
ちゃんとAlpha station XP1000でも
— Lucky owner/capturer (@nullnilaki) 2013年12月7日
X使えた。 pic.twitter.com/cI4EG8D4MK
VAXstation 4000 Model 96
VAXも遊べるうちに遊んでおかないと... pic.twitter.com/1StHr1vY4q
— Lucky owner/capturer (@nullnilaki) 2016年3月11日
Apple PowerMac9700 Power Express
謎MacことPowerMac9700ことPower Express pic.twitter.com/mL5rV7IBtZ
— Lucky owner/capturer (@nullnilaki) 2014年2月21日
Omron Luna68K
Arrival of luna68k #asiabsdcon #netbsd pic.twitter.com/pgbzFu2nuL
— msaitoh (@gussunoyoyo) 2016年3月12日
A luna68k! #asiabsdcon pic.twitter.com/GqumZZstVv
— (((Brian Callahan))) (@__briancallahan) 2016年3月12日
HP c8000
HP c8000 pic.twitter.com/zKPMS8UPAn
— Lucky owner/capturer (@nullnilaki) 2016年10月17日
AlphaStation 200 4/166
@syuu1228 さんから、AlphaStation 200 4/166を頂きました!
— Lucky owner/capturer (@nullnilaki) 2015年3月22日
ありがとうございます。Digital UNIX V3.2D-1がインストールされてました。https://t.co/48FzlJg9dz pic.twitter.com/gINHhpV45q
ここには写っていませんが、他にもDaystar millenniumとかNextStation Turbo ColorだとかSgiのAltix 350とかAltix 330だとかSun Ultra25とか色々あります。
"コンピュータ OSなければ ただの箱" とはよく言ったもので、OSももちろんあります。
中身。分厚いマニュアル。BSD/OS 4.2はBSDiが出してて、BSD/OS 4.3は(BSDiを買収した)WindRiverが出している。過度期に購入された物のためか書類も含めて、BSDiのロゴとWindRiverのロゴがカオス。 pic.twitter.com/nJmnqVwQRg
— Lucky owner/capturer (@nullnilaki) 2013年3月23日
IRIX
@syuu1228 @kotatsu_mi
— Lucky owner/capturer (@nullnilaki) 2015年4月29日
IRIXもたくさん有るので、新しめの奴お送りします。
こちらはインストール終わったら返してくださいね。(K/VM名古屋の時で良いです) pic.twitter.com/3mIyVkc8m2
AIX HP-UX Tru64 UNIX UX/4800 MacOS X Server SnowLeopard
OSたち
— Lucky owner/capturer (@nullnilaki) 2016年10月17日
AIX HP-UX Tru64 UX/4800 Mac OS X Server SnowLeopard pic.twitter.com/rZ7xgc7Itu
特にUX/4800やTru64 UNIXやBSD/OS、Mac OS X Serverはライセンスを入力しないと動きません...
が、メディアはともかくライセンスを手に入れるのがとても難しいです。(おそらくハードを手に入れるよりも)
また、HP-UXはライセンスが無くても動きますが、OnlineJFSなどで遊ぶにはEnterprise OEのメディアを手に入れないといけません…
どうやって手に入れたのか?
東京大学などではComputer Zooなどで研究室単位?で集めているようですが、私のような個人の力では残念ながらヤフオクなどでコツコツ買い集めるしかありません…
そんな私にもコンピュータを譲ってくださる篤志家がいらっしゃいまして、@tsutsuiiからはEWS4800/430を@syuu1228からはAlphaStation 200 4/166を@impreza_gf8からはAlpha Station XP1000をいただきました。(とてもありがとうございます)
ジャンク=一期一会?
さて本題です。私のコレクション、いくらの価値があるのでしょうか?
これらのコンピューターは一般的にはヤフオクなどでオークションという形で販売されます。相場はあって無いようなものです。
値段は読めません。一期一会の出会いかもしれません。
かって、こんなことがありました...
"NECのEWS4800というコンピューターシリーズの後期のモデルにEWS4800/570EXという機種があります。このマシンはEWS4800の中では最速のマシンです。
以前一度だけオークションに出品され、私は入札したのですが、お金がなくて負けてしまいました。(最終的に7万円くらいだったかな?)
先にも後にも、このマシンをオークションで見たのはその一度だけです… 未だに痛い思い出です。"
46000円で撤退。こんなに突っ込むなんて、どこの物好きだ!
— Lucky owner/capturer (@nullnilaki) 2013年3月27日
EWS 4800/570EX / R14000 450MHz×2 / 128MB 欲しかった。
最初は1円落札余裕と思ってたのに!!
もちろんその逆で、オークションで高値で購入したけれども、その後リースアウトしたものが大量に出回ってたたき売られることもあります…
ジャンク=Priceless?
私の母親など普通の人から見てみれば、これらのコンピューターはただの”粗大ごみ”かもしれません。
ですが、私がこれらのコンピューターを持っていたおかげで、たくさんのひとに出会い、アドバイスを頂き、勉強をし、友達ができ、とても楽しい思い出をたくさん作ることが出来ました!
togetter.com
www.slideshare.net
ですので、@LabDrunkerさんの質問にはこう答えたいと思います。
確かにそのAlphaStationは高いです。ですが、今後その値段で買える保証はどこにもありません。
もしかしたらAlphaStation XP1000などが出品されるかもしれません。
ちなみにAlphaStation DS15は12万円程度しましたが、それ以上のリターンを与えてくれました。
昔の人は言いました...
bokete.jp
でも、お金は大事だよ〜
ジャンクは用法用量を守って正しくお使いください。
それではHappy Hacking!
最後の楽園の開拓を(ちょこっとだけ)手伝った話
相変わらず謎マシンいじりが最近の趣味のN君。
家の中の"積みマシン"の電源を入れてみたところ、
珍しいCPUを積んでいる事が分かりました。
>> hinv System: IP26 Processor: 75 Mhz R8000, with FPU Primary I-cache size: 16 Kbytes Primary D-cache size: 16 Kbytes Secondary cache size: 2 Mbytes Memory size: 512 Mbytes Graphics: GR5-XZ SCSI Disk: scsi(0)disk(1) Audio: Iris Audio Processor: version A2 revision 1.1.0
MIPS R8000というCPUはMIPS系のCPUの中では、かなり変わり者です。
R8000 - Wikipedia
Power Indigo2 (R8000) - Nekochan Net
"命令キャッシュは16KBで、ダイレクトマップ方式、仮想インデックス・仮想タグ方式で、ラインサイズは32バイトである。"
とか
"TLBはデュアルポートで384エントリあり、3ウェイセットアソシアティブ方式になっている。"
とか
"ストリーミングキャッシュは外付けの1MBから16MBのキャッシュで、R8000の二次キャッシュ、R8010の一次データキャッシュとして機能する。"
とか
"マルチチップで構成されている"
とか
変態度が高くて、イカしています。
暇を見つけて以下記事のようにボチボチ遊んでいたのですが、一部問題が有るものの動き始めました。
OpenBSD/sgi、カーネルのクロスコンパイルと起動方法について - nullnilaki’s blog
OpenBSD/sgi、IP26カーネルインストールにまつわるトラブル - nullnilaki’s blog
というわけで前置きが長くなりましたが、
"最後の楽園の開拓を(ちょこっとだけ)手伝った話"と題しまして、
NetBSD Advent Calendar 2015 - Qiita
23目に寄稿させてもらいます。
自分が触り始めた時は、OpenBSDにはR8000対応のソースは入っているものの、
自分でMakefileを修正しないとカーネルは作成されない状態で、
手つかずのまま3年程度眠っていた状態でした。
また、commit logには、
IP26 kernels currently boot single-user, but don't live long; I am suspecting a bug in the tcc cache routines, but am currently not able to find it (come to think of it, my understanding of how this cache works could be wrong, and of course there is no documentation for it but what can be gathered from IRIX'comments and defines).
と書いてある状態でした。
/src/sys/arch/sgi/localbus/tcc.c
— lucky owner (@nullnilaki) August 20, 2015
で、まずはキャッシュが怪しいかなと思って
(特に命令キャッシュはダイレクトマップ、仮想インデックス、仮想タグ方式なので)
いろいろいじってみたのですが、R8000のマニュアルとOpenBSDのキャッシュのフラッシュ方法が同じだったのと、
カーネルのPanicのしかたがキャッシュに起因するものでは無いような気がして、
キャッシュが原因説は保留しました。
/src/sys/arch/mips64/mips64/cache_tfp_subr.S
ふむ... pic.twitter.com/EmgGa8HeZ8
— lucky owner (@nullnilaki) December 21, 2015
さて、よくよく落ち方を観察すると、最終的にPanicはするのですが、
結構良いところまで行く場合が有る事に気付きました。
panic: trap: utlbmod: unmanaged page syncing disks... done tlbもいじる必要が有るか...
— lucky owner (@nullnilaki) August 25, 2015
>> bootp()bsd.rd.IP26 Obtaining bsd.rd.IP26 from server macbook2006 3577592+722344 entry: 0xa800000008010000 ARCS64 Firmware Found SGI-IP26, setting up. ... Bus error (core dumped) starting early daemons: syslogd pflogd. starting RPC daemons:. savecore: /dev/sd0a: Device busy checking quotas: done. kvm_mkdb: can't open /dev/ksyms panic: trap: utlbmod: invalid pte Stopped at 0xa800000008294424: jr ra 0xa800000008294428: move zero,zero RUN AT LEAST 'trace' AND 'ps' AND INCLUDE OUTPUT WHEN REPORTING THIS PANIC! DO NOT EVEN BOTHER REPORTING THIS WITHOUT INCLUDING THAT INFORMATION! ddb>
TLB modified faultについて、調べてみると
@nullnilaki なんとなくclean->dirtyに変化したイベントのようにきこえます
— 鯉江 (@koie) August 25, 2015
@koieさん、ありがとうございます!
どうやら、ユーザーランドTLBミス時の処理が良くないのが原因なような気がします。
そこで、今度はユーザーランドTLBミス時の処理を調べる事にしました。
/src/sys/arch/mips64/mips64/exception_tfp.S
utlb_miss: .set noat .align 4 PRE_MFC0_ADDR_HAZARD DMFC0 k0, COP_0_VADDR MFC0_HAZARD DMTC0 k0, COP_0_WORK0 MTC0_HAZARD PTR_SRL k0, SEGSHIFT sltiu k1, k0, PMAP_SEGTABSIZE beqz k1, _inv_seg NOP DMFC0 k1, COP_0_UBASE # PCB_SEGTAB(CI_CURPROCPADDR(curcpu)) MFC0_HAZARD PTR_SLL k0, LOGREGSZ PTR_ADDU k1, k0 PTR_L k1, 0(k1) # get pointer to page table DMFC0 k0, COP_0_WORK0 # saved COP_0_VADDR MFC0_HAZARD beqz k1, _inv_seg PTR_SRL k0, PAGE_SHIFT - 2 andi k0, ((NPTEPG / 2) - 1) << 2 PTR_ADDU k1, k0 lwu k0, 0(k1) # get pte DMTC0 k0, COP_0_TLB_LO MTC0_HAZARD TLBW ERET
このあたりの処理は、一刻も早く終わらせる為に全部アセンブリ言語で書かれているようです...
ウーン、わからん!呪文みたいだ...
ですが、MIPSの解説本を片手に読み進めていくと、
「なんとなく意味が分かるところ」と「わけがわからないよ」
な部分に分かれて来ました。
上記コードの赤文字の部分が「わけがわからないよ」な部分です。
やたらと"2"で引いたり、割ったり、左シフトしたりしています。
アセンブリ言語で書かれていてコードの意味は解らないし、デバックもやりづらいし、
お手上げです。
そこで思いつきました!
"一刻も早く終わらせる為に全部アセンブリ言語で書かれている"
なら
"同じような処理をCで書いている部分"を探して
参考にしてみれば良いんです。
そして、あっちこっち探して、見つけました!
/src/sys/arch/mips64/include/pmap.h
/* User virtual address to pte page entry */
#define uvtopte(va) (((va) >> PAGE_SHIFT) & (NPTEPG -1))
あれ?
/src/sys/arch/mips64/include/pmap.hに書かれているマクロでは
"2"で引いたり、割ったり、左シフトしたりしていません。
そこで、mips64/exception_tfp.Sを書き直してみました。
utlb_miss: .set noat ... PTR_L k1, 0(k1) # get pointer to page table DMFC0 k0, COP_0_WORK0 # saved COP_0_VADDR MFC0_HAZARD beqz k1, _inv_seg - PTR_SRL k0, PAGE_SHIFT - 2 - andi k0, ((NPTEPG / 2) - 1) << 2 + PTR_SRL k0, PAGE_SHIFT + andi k0, NPTEPG - 1 PTR_ADDU k1, k0 lwu k0, 0(k1) # get pte DMTC0 k0, COP_0_TLB_LO MTC0_HAZARD TLBW ERET
すると...
topが動くのが不思議... pic.twitter.com/mvyoiTJWnb
— lucky owner (@nullnilaki) September 9, 2015
とりあえず、基本panic、運が良ければマルチユーザー移行という段階は 脱して100%マルチユーザー移行出来るようになった が、SIGABRTが頻発してしまう... どこが悪いのだろうか? https://t.co/5s31YspLJ9
— lucky owner (@nullnilaki) September 14, 2015
やったねたえちゃん!
しかし、起動はするものの、SIGABRTが頻発してしまうため、調査を続けることにしました。
そのうち、シルバーウィークがやってきたので、実家に帰る事にしました。
実家ソン! pic.twitter.com/z13ONjDJhL
— lucky owner (@nullnilaki) September 19, 2015
そこで転機がやって来たのです!
そのころには、Miodさん(OpenBSD/sgiのえらい人)とTwitter上でやりとりをしていたので、
メンションもらったついでに、思い切ってパッチを見てもらう事にしました。
この機会を逃すと、また、手元で眠らせてしまう気がしたので...
@MiodVallat This patch will boot up to multi-user mode in exchange for "Abort trap". Crossing fingers, https://t.co/QBqwtooYhn
— lucky owner (@nullnilaki) September 19, 2015
そしたら、あれよあれよという間に...
Thanks to @nullnilaki who spotted my stupid bug, my POWER Indigo 2 system is finally running OpenBSD/sgi multiuser!
— Miod in the Middle (@MiodVallat) September 20, 2015
...and they said R8000 would never get supported by free software. Fools! (-:
— Miod in the Middle (@MiodVallat) September 21, 2015
miod@ modified a couple things: Enable IP26 builds.
— OpenBSD src Changes (@OpenBSD_src) September 20, 2015
OpenBSD/sgiのWebページ、更新されてる... Supported hardwareに IP26 (POWER Indigo2) family: (support completed after the 5.8 release) って書いてある...
— lucky owner (@nullnilaki) September 23, 2015
今まで動かなかった原因は、
が原因でした!
これでOpenBSD/sgiはsgiのマシンに使われていたすべてのMIPS系CPUを制覇した事になります。
何故、自分がこのようなお手伝いを出来たかというと、
R8000が特殊で誰も持っていないという事につきると思います。
実際、Linux/MIPSのページには
"R8000 は現在未サポートです。これはこのプロセッサが一部の SGI の機種のみで使われた
比較的まれなプロセッサで、Linux/MIPS 開発者が誰もこのような機種を持っていない、
ということも理由の一部です。"
と書いてあります。
http://archive.linux.or.jp/JF/JFdocs/MIPS-HOWTO-9.html#ss9.8
また、他のMIPS系のCPUと構成が違うためソースの共有が出来ない部分が多数有り、余計誰も見なかったという事が考えられます。
/src/sys/arch/mips64/mips64/cache_tfp.c
/src/sys/arch/mips64/mips64/cache_tfp_subr.S
/src/sys/arch/mips64/mips64/exception_tfp.S
/src/sys/arch/mips64/mips64/tlb_tfp.S
残念ながら負荷をかけるとSIGBUSやらSIGSEGVやら発生する問題が有るのですが、
おいおい調べていきたいと思います。
@nullnilaki Unfortunately there are still R8000-specific bugs, stressing the system for a few hours causes unexpected SIGBUS or SIGSEGV.
— Miod in the Middle (@MiodVallat) September 26, 2015
まぁ、
@nullnilaki Miodさんが喜んでくれて何よりです (`・ω・´) http://t.co/M2BPfNB836
— lucky owner (@nullnilaki) September 23, 2015
が感想です。(日頃お世話になっているし)
それと、MiodさんにR8000の話を振られた時に、タイミングよくパッチを提出
できた事は大きかったと思います。
タイミング、大事です。
謎の/src/sys/arch/mips64/exception_tfp.Sでやたらと
"2"で引いたり、左シフトしたりしている理由は、
The 2 in the original code is log2(pte size); k0 >> PAGE_SHIFT will be the pte number. But in the page table, it is stored as an array of 32-bit words, so we need to shift it to the left by 2. The original instructions: PTR_SRL k0, PAGE_SHIFT - 2 andi k0, ((NPTEPG / 2) - 1) << 2 are equivalent to: PTR_SRL k0, PAGE_SHIFT andi k0, (NPTEPG / 2) - 1 PTR_SLL k0, 2 and guarantees the address is correctly aligned for the `lwu' instruction later.
だそうでした。
反省点は、10月11月12月とIngressにハマって、まったくマシンいじりを放置していました。
疲れた... pic.twitter.com/GxZ8PudVqw
— lucky owner (@nullnilaki) December 12, 2015
このようなアドバイスを頂いていたのに、@gussunoyoyoさん、すいません...
今日のさいとうさんのL1キャッシュをフラッシュするときにL2キャッシュもフラッシュしているにもかかわらず、SIGBUS or SIGSEGVがおこるならば、コンテキストスイッチするときに、TLBを全部フラッシュして問題の切り分けしてみたら?というアドバイスはためになった
— lucky owner (@nullnilaki) October 3, 2015
よく遊び、よく学べということで!
あしたは、いよいよNetBSD developerのnonakapさんの登場です!
今年もどんな記事を書いてくださるのか、大変楽しみですね!(・∀・)ニヤニヤ
(相変わらず中指を飛ばすコミュニケーション)
おしまい。
えっ
NetBSD Advent Calendarなのに、OpenBSDだって!?
(゚ε゚)キニシナイ!!
それと、R8000関係で最近こんなことがありました。
currentバグッてるぅ (ノシ 'ω')ノシ バンバン https://t.co/pZ4hFHbC4S pic.twitter.com/Dk3XxK55f7
— lucky owner (@nullnilaki) December 18, 2015
どうやら、この変更が原因
'Re: CVS: cvs.openbsd.org: src' - MARC
らしいのですが、
+ * Execution of the `sync' instruction is not supported by the + * T-Bus and raises a machine check exception.
を疑問に思いました。
バスから見てCPUの命令ってどういう風に見えるんでしょうね?
おしえてつついさ〜ん!
参考文献など:
はじめて読む MIPS(リローデッド)
OpenBSD/sgi on octane2 - exception.S・tlbhandler.SにおけるGET_CPU_INFO()とコンテキスト保存、割り込みの話 - かーねる・う゛いえむにっき
謝辞:
いつもtwitterでふぁぼってくださる皆様
なまあたたかい目で見守ってくださるつついさんをはじめとしたNetBSD関係者の方々
追加:
つついさんにきいてみたところ、下記のような回答でした。
@nullnilaki これもMDの話なのでよーわかりませんが、 sync命令 https://t.co/qoCbh9dxUr の仕様上CPUからI/Oに対して何か信号操作をした後Ackを受けるピンがあって、本来ならI/O側が応答するけど、それをサポートしない場合は例外で(文字数
— Izumi Tsutsui (@tsutsuii) 2016, 1月 23
@nullnilaki MIPSだとメモリマップドI/O https://t.co/W5qWUHbjRx なのでCPUからみたらメモリもI/Oも区別はなくて、CPU側に「アクセス完了」の信号入力があって、メモリでもデバイスでもその応答を確認したら次に進む、みたいな感じじゃないかと
— Izumi Tsutsui (@tsutsuii) 2016, 1月 23
OpenBSD/sgi、IP26カーネルインストールにまつわるトラブル
! WARNING !
ここに記述してある事は、100%役に立ちません。
完全に備忘録です。
OpenBSD/sgiでIP26のカーネルは正式サポートされていません。
したがって、外部のサイト(ftp.jaist.ac.jp等)から
カーネルの入ったbase57.tgzをダウンロードしても、
IP26のカーネルは含まれていません。
インストール時に、最後に「カーネル無いよ」と警告が出ます。
Set name(s)? (or 'abort' or 'done') [done] Cannot determine prefetch area. Continue without verification? [no] yes Installing base57.tgz 100% |**************************| 56003 KB 03:49 Extracting etc.tgz 100% |**************************| 110 KB 00:00 Location of sets? (disk http nfs or 'done') [http] done Are you *SURE* your install is complete without 'bsd.IP26'? [no] yes Time appears wrong. Set to 'Sun Sep 6 08:56:36 JST 2015'? [yes] Saving configuration files...done. Making all device nodes...sh(8003) in realloc(): error: chunk info corrupted Abort trap done. Installing boot loader in volume header. Writing file /mnt/usr/mdec/boot-IP26 sgivol: stat /mnt/usr/mdec/boot-IP26: No such file or directory WARNING: Boot install failed. Booting from disk will not be possible
この問題を解決するには、手動でカーネルとブートローダーを設置してやる必要があります。
(NFS BOOTは試していません)
処理を行っているのは、
Super User's BSD Cross Reference: /OpenBSD/distrib/sgi/ramdisk/install.md
ですので、まずはboot-IP26を作ってやらなければなりません。
Super User's BSD Cross Reference: /OpenBSD/sys/arch/sgi/stand/boot64/Makefile
Super User's BSD Cross Reference: /OpenBSD/distrib/sgi/iso/Makefile
Super User's BSD Cross Reference: /OpenBSD/distrib/sets/lists/base/md.sgi
に追記をしてリリースイメージ作成時にboot-IP26を作るようにします。
boot-IP26の書き込み方法ですが、
自分は、"WARNING: Boot install failed. Booting from disk will not be possible"のエラーが出ても無視して処理を続行し、
インストール作業を終了させて#が出た後に、
# /mnt/usr/mdec/sgivol -w boot /mnt/usr/mdec/boot-IP26 sd0 Writing file /mnt/usr/mdec/boot-IP26 File /mnt/usr/mdec/boot-IP26 has 101640 bytes disklabel shows 17783112 sectors with 512 bytes per sector checksum: 00000000 root part: 0 swap part: 1 bootfile: /bsd Volume header files: boot offset 2 blocks, length 101640 bytes (199 blocks) SGI partitions: 0:a blocks 17779977 first 3135 type 4 (BSD4.2) 8:i blocks 3135 first 0 type 0 (Volume Header) 10:k blocks 17783112 first 0 type 6 (Volume) # mv /mnt/usr/mdec/bsd.IP26 /mnt/bsd
で、どーやって肝心のboot-IP26やbsd.IP26を持ってくるか?ですが、
ftpで転送をかけました...
が、OpenBSDのramdisk kernel内で使えるようにするため?か、
このftpは制限がかかっていて、使いづらい事この上ないです...
# ftp usage: ftp [-o output] ftp://[user:password@]host[:port]/file[/] ... ftp [-o output] http://host[:port]/file ... ftp [-o output] file:file ... ftp [-o output] host:/file[/] ...
Super User's BSD Cross Reference: /OpenBSD/usr.bin/ftp/main.c
どうやってもユーザーとパスワードを設定してftpサーバにログインすることができなかったので、
anonymous ftpサーバをたてました。
# ftp -o boot-IP26 192.168.1.22:/pub/boot-IP26 Connected to 192.168.1.22. 220 macbook2006 FTP server (NetBSD-ftpd 20100320) ready. 331 Guest login ok, type your name as password. 230 Guest login ok, access restrictions apply. Remote system type is UNIX. Using binary mode to transfer files. 200 Type set to I. 250 CWD command successful. Retrieving /pub/boot-IP26 local: boot-IP26 remote: boot-IP26 150 Opening BINARY mode data connection for 'boot-IP26' (101640 bytes). 226 Transfer complete. 101640 bytes received in 0.18 seconds (536.81 KB/s) 221- Data traffic for this session was 101640 bytes in 1 file. Total traffic for this session was 102251 bytes in 1 transfer. 221 Thank you for using the FTP service on macbook2006.
ブートローダーとカーネル設置してようやくHDDから起動出来るようになったと思ったら、
>> scsi(0)disk(1)rdisk(0)partition(8)boot 1024+36576+3920+1544+320 entry: 0xa80000002fff4b90 OpenBSD/sgi-IP26 ARCBios boot version 1.6 arg 0: scsi(0)disk(1)rdisk(0)partition(8)boot arg 1: ConsoleIn=serial(0) arg 2: ConsoleOut=serial(0) arg 3: SystemPartition=scsi(0)disk(1)rdisk(0)partition(8) arg 4: OSLoader=sash arg 5: OSLoadPartition=scsi(0)disk(1)rdisk(0)partition(0) arg 6: OSLoadFilename=/bsd Boot: scsi(0)disk(1)rdisk(0)partition(0)/bsd 3577576+722344 [78+201600+120374]=0x468958 ARCS64 Firmware Found SGI-IP26, setting up. Initial setup done, switching console. [ using 322760 bytes of bsd ELF symbol table ] Copyright (c) 1982, 1986, 1989, 1991, 1993 The Regents of the University of California. All rights reserved. Copyright (c) 1995-2015 OpenBSD. All rights reserved. http://www.OpenBSD.org OpenBSD 5.7-stable (GENERIC-IP26) #1: Tue Mar 10 00:34:22 MDT 2015 naruaki@fuel.my.domain:/usr/src/sys/arch/sgi/compile/GENERIC-IP26 real mem = 536870912 (512MB) rsvd mem = 1064960 (2MB) avail mem = 526630912 (502MB) mainbus0 at root: POWER Indigo2 R8000 ... warning: /dev/console does not exist
応答しません。これはIP26カーネルが不安定なため、
Making all device nodes...sh(8003) in realloc(): error: chunk info corrupted Abort trap
インストール時にMAKEDEVが動かないため、/dev/consoleが作られないためです。
しかたがないので、再度ramdisk kernelから起動して、
MAKEDEV stdで/dev/consoleを作ってやります。
Welcome to the OpenBSD/sgi 5.7 installation program. (I)nstall, (U)pgrade, (A)utoinstall or (S)hell? S # mount /dev/sd0a /mnt # cd /mnt/dev # ls MAKEDEV rsd0d rsd0h rsd0l rsd0p sd0d sd0h sd0l sd0p rsd0a rsd0e rsd0i rsd0m sd0a sd0e sd0i sd0m rsd0b rsd0f rsd0j rsd0n sd0b sd0f sd0j sd0n rsd0c rsd0g rsd0k rsd0o sd0c sd0g sd0k sd0o # ./MAKEDEV std # ls MAKEDEV mem rsd0d rsd0i rsd0n sd0c sd0h sd0m stdin console null rsd0e rsd0j rsd0o sd0d sd0i sd0n stdout klog rsd0a rsd0f rsd0k rsd0p sd0e sd0j sd0o tty kmem rsd0b rsd0g rsd0l sd0a sd0f sd0k sd0p zero ksyms rsd0c rsd0h rsd0m sd0b sd0g sd0l stderr
ようやく独り立ち出来るようになりましたが、
System Maintenance Menu 1) Start System 2) Install System Software 3) Run Diagnostics 4) Recover System 5) Enter Command Monitor Option? 5 Command Monitor. Type "exit" to return to the menu. >> scsi(0)disk(1)rdisk(0)partition(8)boot 1024+36576+3920+1544+320 entry: 0xa80000002fff4b90 OpenBSD/sgi-IP26 ARCBios boot version 1.6 arg 0: scsi(0)disk(1)rdisk(0)partition(8)boot arg 1: ConsoleIn=serial(0) arg 2: ConsoleOut=serial(0) arg 3: SystemPartition=scsi(0)disk(1)rdisk(0)partition(8) arg 4: OSLoader=sash arg 5: OSLoadPartition=scsi(0)disk(1)rdisk(0)partition(0) arg 6: OSLoadFilename=/bsd Boot: scsi(0)disk(1)rdisk(0)partition(0)/bsd 3577576+722344 [78+201600+120374]=0x468958 ARCS64 Firmware Found SGI-IP26, setting up. Initial setup done, switching console. [ using 322760 bytes of bsd ELF symbol table ] Copyright (c) 1982, 1986, 1989, 1991, 1993 The Regents of the University of California. All rights reserved. Copyright (c) 1995-2015 OpenBSD. All rights reserved. http://www.OpenBSD.org OpenBSD 5.7-stable (GENERIC-IP26) #1: Tue Mar 10 00:34:22 MDT 2015 naruaki@fuel.my.domain:/usr/src/sys/arch/sgi/compile/GENERIC-IP26 real mem = 536870912 (512MB) rsvd mem = 1064960 (2MB) avail mem = 526630912 (502MB) mainbus0 at root: POWER Indigo2 R8000 cpu0 at mainbus0: MIPS R8000 CPU rev 0.0 75 MHz, R8010 FPU rev 0.1 cpu0: cache L1-I 16KB D 16KB direct, L2 2048KB direct int0 at mainbus0 addr 0x1fbd9000 tcc0 at mainbus0: streaming cache revision 0 imc0 at mainbus0: revision 5 gio0 at imc0 grtwo0 at gio0 addr 0x1f000000: GR5-XZ grtwo0: device has not been setup by firmware! hpc0 at gio0 addr 0x1fb80000: SGI HPC3 (onboard) zs0 at hpc0 offset 0x00059830 irq 29: 85230 zstty0 at zs0 channel 1: console zstty1 at zs0 channel 0 pckbc0 at hpc0 offset 0x00059840 irq 28 sq0 at hpc0 offset 0x00054000 irq 3: Seeq 80c03, address 08:00:69:08:a8:e8 wdsc0 at hpc0 offset 0x00044000 irq 1: WD33C93B, 20.0 MHz, burst DMA wdsc0: microcode revision 0x0d, fast SCSI scsibus0 at wdsc0: 8 targets, initiator 0 sd0 at scsibus0 targ 1 lun 0: <SEAGATE, ST19171N, 0023> SCSI2 0/direct fixed serial.SEAGATE_ST19171N_LA718859 sd0: 8683MB, 512 bytes/sector, 17783112 sectors wdsc1 at hpc0 offset 0x0004c000 irq 2: WD33C93B, 20.0 MHz, burst DMA wdsc1: microcode revision 0x0d, fast SCSI scsibus1 at wdsc1: 8 targets, initiator 0 haltwo at hpc0 offset 0x00058000 irq 12 not configured pione at hpc0 offset 0x00059800 irq 5 not configured panel0 at hpc0 offset 0x00059850 irq 9: power button dsclock0 at hpc0 offset 0x00060000 eisa0 at imc0 irq 27 vscsi0 at root scsibus2 at vscsi0: 256 targets softraid0 at root scsibus3 at softraid0: 256 targets boot device: sd0 root on sd0a (7a66b1019d03f648.a) swap on sd0b dump on sd0b WARNING: / was not properly unmounted Automatic boot in progress: starting file system checks. Can't open 7a66b1019d03f648.a: No such file or directory CAN'T CHECK FILE SYSTEM. 7a66b1019d03f648.a: UNEXPECTED INCONSISTENCY; RUN fsck_ffs MANUALLY. Automatic file system check failed; help! Enter pathname of shell or RETURN for sh: # fsck -y Can't open 7a66b1019d03f648.a: No such file or directory # exit WARNING: R/W mount of / denied. Filesystem is not clean - run fsck mount_ffs: 7a66b1019d03f648.a on /: filesystem must be mounted read-only; you may need to run fscWARNING: R/W mount of / denied. Filesystem is not clean - run fsck k mount_ffs: 7a66b1019d03f648.a on /: filesystem must be mounted read-only; you may need to run fsck setting tty flags pfctl: /dev/pf: No such file or directory pfctl: /dev/pf: No such file or directory starting network /etc/rc[362]: cannot create /dev/random: Read-only file system pfctl: /dev/pf: No such file or directory dd: /dev/random: Read-only file system chmod: /var/db/host.random: Read-only file system dd: /var/db/host.random: Read-only file system dd: /etc/random.seed: Read-only file system chmod: /etc/random.seed: Read-only file system rm: dmesg.boot: Read-only file system rm: utmp: Read-only file system install: utmp: Read-only file system rm: *: Read-only file system /etc/rc[385]: cannot create /var/run/dmesg.boot: Read-only file system starting early daemons: syslogd pflogd(failed). starting RPC daemons:. WARNING: R/W mount of / denied. Filesystem is not clean - run fsck mount_ffs: 7a66b1019d03f648.a on /: filesystem must be mounted read-only; you may need to run fsck savecore: no core dump checking quotas: done. kvm_mkdb: can't dbopen /var/db/kvm_bsd.tmp: Read-only file system kvm_mkdb: will try again using /bsd instead kvm_mkdb: can't dbopen /var/db/kvm_bsd.tmp: Read-only file system dev_mkdb: /var/run/dev.tmp: Read-only file system chmod: /dev/tty[pqrstuvwxyzPQRST]*: No such file or directory chown: /dev/tty[pqrstuvwxyzPQRST]*: No such file or directory clearing /tmp rm: [a-km-pr-uw-zA-Z]*: Read-only file system kern.securelevel: 0 -> 1 mktemp: cannot make temp file /tmp/_motd.NdqG9uwqJa: Read-only file system creating runtime link editor directory cache. ldconfig: /var/run/ld.so.hints.VEtMUTQhpl: Read-only file system preserving editor files. Bus error starting network daemons: smtpdpanic: trap: utlbmod: invalid pte Stopped at Debugger+0x4: jr ra Debugger+0x8: move zero,zero RUN AT LEAST 'trace' AND 'ps' AND INCLUDE OUTPUT WHEN REPORTING THIS PANIC! DO NOT EVEN BOTHER REPORTING THIS WITHOUT INCLUDING THAT INFORMATION!
起動して5秒でpanic!
どっかのシリーズもののAVみたいなオチがつきましたが、現状そんな感じです。
OpenBSD/sgi、カーネルのクロスコンパイルと起動方法について
この記事はOpenBSD Advent Calendar 2015 247 日目目の記事です。
もう2015年も247日過ぎてしまったんですね(白目)。
最近、(また)OpenBSD/sgiをいじっています。
MIPS R8000という変態MIPSで遊ぶためです。
"命令キャッシュは16KBで、ダイレクトマップ方式、仮想インデックス・仮想タグ方式で、ラインサイズは32バイトである。"
とか
"TLBはデュアルポートで384エントリあり、3ウェイセットアソシアティブ方式になっている。"
とか
"ストリーミングキャッシュは外付けの1MBから16MBのキャッシュで、R8000の二次キャッシュ、R8010の一次データキャッシュとして機能する。"
が変態度が高くて良い感じです。
Pointer to Kernel Private PTE table
という謎な概念に付いて pic.twitter.com/EOpG96yoDK
— lucky owner (@nullnilaki) August 28, 2015
とかもMIPSっぽく無い感じ。
こうやってnopで命令キャッシュ潰すのね... pic.twitter.com/hqj7QcIfxD
— lucky owner (@nullnilaki) September 4, 2015
イカスぜ!
現在のところR8000が完全に動くOSはIRIXだけです。
キャッシュハンドリング、基板(メモリ)のファーストモード、スローモードの設定、TLBの設定を正しく実装すれば
OpenBSDでも起動するはず...
一年計画で動けば良いなぁ...
んで、OpenBSD/sgiをいじるにあたり、基本的な事を備忘録としてまとめておきました。
カーネルのクロスコンパイルについて
MIPSは(現代のCPUに比べて)とっても遅いので、←重要
実機でカーネルのコンパイルをしまくるような場合はとっても時間がかかって大変です。
そこで、クロスコンパイル環境を構築してカーネルのコンパイルをします。
ビバ、INTEL!
やりかたは、
しゅううさんの記事
に書いてあるのですが、
make obj
TARGET=sgi make cross-tools
cd /usr/src/sys/arch/sgi/conf;config コンフィグ名
cd ../compile/コンフィグ名
make CC=/usr/cross/sgi/usr/mips64-unknown-openbsd4.5/bin/mips64-unknown-openbsd4.5-cc LD=/usr/cross/sgi/usr/mips64-unknown-openbsd4.5/bin/mips64-unknown-openbsd4.5-ld depend
make CC=/usr/cross/sgi/usr/mips64-unknown-openbsd4.5/bin/mips64-unknown-openbsd4.5-cc LD=/usr/cross/sgi/usr/mips64-unknown-openbsd4.5/bin/mips64-unknown-openbsd4.5-ld
エラーが出ずにコンパイルが終了すればOK
http://d.hatena.ne.jp/syuu1228/20090805
でOKです。
カーネルの起動方法について(サーバ編)
カーネルをコンパイルしたら、コンパイルしたカーネルをネットブートで起動させましょう。
まずはサーバ編です。
サーバOSはNetBSDを選択しました。
やりかたは
Setting up the tftpd server, Diskless NetBSD HOW-TOの記事
Setting up the tftpd server, Diskless NetBSD HOW-TO
に書いてあるのですが、
/etc/inetd.confを編集して、
$ ls /tftpboot/ bsd.rd.IP26 hack.bsd.rd.IP26 kernel_5_3 kernel_5_7
/etc/bootptabにネットブートさせる為の記述をします。
iris:\ :ht=ether:\ :hn:\ :bs=auto:\ :bf=bsd.rd.IP26:\ :ip=192.168.1.11:\ :sm=255.255.255.0:\ :rp=/tftpboot/:\ :ha=080069********:
Running power-on diagnostics... Initialized tod clock. System Maintenance Menu 1) Start System 2) Install System Software 3) Run Diagnostics 4) Recover System 5) Enter Command Monitor Option? 5 Command Monitor. Type "exit" to return to the menu. >> hinv System: IP26 Processor: 75 Mhz R8000, with FPU Primary I-cache size: 16 Kbytes Primary D-cache size: 16 Kbytes Secondary cache size: 2 Mbytes Memory size: 512 Mbytes Graphics: GR5-XZ SCSI Disk: scsi(0)disk(1) Audio: Iris Audio Processor: version A2 revision 1.1.0 >> printenv AutoLoad=Yes rbaud=9600 TimeZone=PST8PDT console=g diskless=0 dbaud=ÿÿÿÿÿ volume=80 sgilogo=y autopower=y netaddr=192.168.2.13 eaddr=08:00:69:**:**:** boottune=1 cpufreq=75 SystemPartition=scsi(0)disk(1)rdisk(0)partition(8) OSLoadPartition=scsi(0)disk(1)rdisk(0)partition(0) OSLoadFilename=/unix OSLoader=sash NoAutoLoad=CONSOLE OPEN FAILED. ConsoleOut=serial(0) ConsoleIn=serial(0)
で確認します。
自分の環境だけ?かもしれませんが、
/tftpbootにカーネルを置いても
>> bootp()bsd.rd.IP26 TFTP error: Access violation (code 2) Unable to execute bootp()bsd.rd.IP26: invalid argument
といって起動しない事がありました。
そう言う場合は、/tftpbootに置くカーネルのパーミッションをchmod 755などで変更したら、うまく起動しました。
カーネルの起動方法について(クライアント編)
クライアント編です。
やりかたは
に書いてありますが、
The PROM, by default, will configure itself to use the IP address set in
the `netaddr' environment variable. To force the PROM to always get an
address from a bootp or dhcp server, clear the variable (`unsetenv netaddr')
before attempting to boot from the network. Alternatively, you may want to
make sure the value of this variable is correct.Note that, if the `netaddr' variable is unset, the PROM will initialize it
http://ftp.openbsd.org/pub/OpenBSD/snapshots/sgi/INSTALL.sgi
to the address obtained from the bootp or dhcp server.
が注意点で
unsetenv netaddrをしないと
>> bootp()bsdr.d.IP26 Warning: 'netaddr' is set to the default address 192.0.2.1. Use 'setenv' to reset it to an Internet address on your network. No server for bsdr.d.IP26. Your netaddr environment variable may be set incorrectly, or the net may be too busy for a connection to be made. Unable to execute bootp()bsdr.d.IP26: could not connect to server
とダダをこねます。
OSをインストールしたら、
Option? 5 Command Monitor. Type "exit" to return to the menu. >> setenv OSLoadFilename /bsd >> setenv SystemPartition dksc(0,3,8) >> setenv OSLoadPartition dksc(0,3,0) >> dksc(0,3,8)boot 1024+36576+3920+1544+320 entry: 0xa8000000012f4000 OpenBSD/sgi-IP27 ARCBios boot version 1.6 arg 0: dksc(0,3,8)boot arg 1: ConsoleIn=/dev/tty/ioc30 arg 2: ConsoleOut=/dev/tty/ioc30 arg 3: SystemPartition=dksc(0,3,8) arg 4: OSLoader=sash arg 5: OSLoadPartition=dksc(0,3,0) arg 6: OSLoadFilename=/bsd arg 7: OSLoadOptions= Boot: dksc(0,3,0)/bsd cannot open dksc(0,3,0)/etc/random.seed: Unknown error: code 20 6495848+726200 [78+328872+204365]=0x765928 ARCS64 Firmware Found SGI-IP35, setting up.
な感じで起動させましょう
カーネルのリリースイメージの作成について
OpenBSDではクロスコンパイル環境でリリースイメージ or インストールカーネルを作る事ができません。
(自分が不勉強なだけ?ご存知のかたがいらっしゃったら教えてください)
時間がかかりますけど、実機でリリースイメージをつくります。
cpu0 at mainbus0 nasid 0: R16000 CPU rev 3.0 900 MHz, R16000 FPU rev 3.0
cpu0: cache L1-I 32KB D 32KB 2 way, L2 8192KB 2 way
快適?
— lucky owner (@nullnilaki) August 23, 2015
はっやーい!
やりかたは
OpenBSDのサイトの記事
に書いてありますが、
素の状態だと、/usr/rel以下にはR8000を起動させる為に必要なIP26のカーネルは作成されません。
また、不要なsgiの機種のカーネルがもりもり作成されます。
/usr/rel $ ls INSTALL.sgi boot64 bsd.IP28 bsd.rd.IP22 bsd.rd.IP30 game57.tgz SHA256 bootecoff bsd.IP30 bsd.rd.IP27 man57.tgz base57.tgz bsd.IP22 bsd.IP32 bsd.rd.IP28 cd57.iso boot32 bsd.IP27 bsd.mp.IP30 bsd.rd.IP32 comp57.tgz
不要なsgiの機種のカーネルを作る時間はもったいないので、
OpenBSDのソースを"ALLIP"で検索して
Super User's BSD Cross Reference: /OpenBSD/etc/etc.sgi/Makefile.inc
Super User's BSD Cross Reference: /OpenBSD/distrib/sgi/ramdisk/Makefile
機種を追加したり、削ったりして、必要な機種のカーネルのみコンパイルするように設定しましょう。
@nullnilaki IP26 kernels are not enabled in the build because they don't run stably yet /-:
— Miod in the Middle (@MiodVallat) August 28, 2015
ありがたいコメントを頂きました。
また、カーネルをコンパイルするマシンの時間がずれていると、コンパイルにコケルので
OpenBSD 5.7ユーザーランドコンパイルしていたら、
ずっこけた
currentでもないのに、何故だ? pic.twitter.com/gKbnhelroo
— lucky owner (@nullnilaki) August 23, 2015
@nullnilaki OpenBSDを使っていてネットワークが適切に設定されているなら、/etc/rc.conf.local に
--
ntpd_flags="-s"
--
と書いておくと、起動時にNTPで時刻あわせを強制できますよ。
— Kenji Aoyama (@ao_kenji) August 23, 2015
@nullnilaki OpenBSDではNTPサービス用のプログラム群を独自に開発しているので、http://t.co/Oa8HoiBPc0のものとは作法が異なります。(ちなみに他OSでも動くようにしています → http://t.co/RklBvGUuZr )
— Kenji Aoyama (@ao_kenji) August 24, 2015
@nullnilaki また、5.7(?)以降は、時刻のずれが大きいと"-s"フラグでも時刻あわせを行わないようです。ずれが大きくても強制的にあわせるには、/etc/ntpd.conf の
--
constraints from
--
の行のコメントアウトが必要と思います。
— Kenji Aoyama (@ao_kenji) August 24, 2015
で時刻をあわせましょう。
@tokudahiroshiさん、@ao_kenjiさん、ありがとうございます!
i386のアドレス変換の話
この記事はNetBSD Advent Calendar 2015 112日目の記事です(嘘)。
mi_switchに
apcb_ptbrやpcb_cr3をprintfさせる細工を入れて、
動いているプロセスのページテーブルがどうなっているか
観察してみたいんだけれど...
http://t.co/Zl4tO59VRu
http://t.co/YaAwvV1OgL
— lucky owner (@nullnilaki) April 20, 2015
で外部からの観察ができたので、まとめておきます。
まずmi_switch(9)に以下のような細工をすることで、
CR3レジスタの内容を出力させました。
mi_switch(9) - NetBSD Manual Pages
#include <machine/pcb.h> if(strcmp(curproc->p_comm,"hoge") == 0) { struct pcb *pcb = lwp_getpcb(l); printf("cr3 = %x\n", pcb->pcb_cr3); }
を
http://nxr.netbsd.org/xref/src/sys/kern/kern_synch.c#780
あたりに追記します。
カーネルをコンパイルし、mi_switchに細工をしたカーネルで再起動します。
とりあえず何かの仮想アドレスを取得したいので、
#include <stdio.h> char foo [] = "WELCOME TO NETBSD!"; int main(void){ printf("address foo = %d\n", foo); for(;;) {} }
というプログラムを書き、
gcc -o hoge xxxx.c
でコンパイルします。
また、物理アドレスのダンプを取りたいので、
デバイスドライバに頼らないハードウェア操作
を参考に、
int main(int argc,char **argv) { char buff[1024]; int fd; unsigned int st,len; int r; st=strtol(argv[1],NULL,16); len=strtol(argv[2],NULL,16); fd=open("/dev/mem",O_RDONLY); if(fd<0) { fprintf(stderr,"cannot open\n"); return 1; } lseek(fd,st,SEEK_SET); while(len) { r=read(fd,buff,len>1024?1024:len); if(r<1) break; write(1,buff,r); len-=r; } close(fd); return 0; }
のようなコードを書き(コピペ)、
gcc -o physdump xxxx.c
でコンパイルしました。
僕はあまりプログラムを書いた事が無いので、
物理アドレスとサイズを指定すると、その範囲のメモリのダンプをとれるコマンドって無いかなぁ?
— lucky owner (@nullnilaki) April 20, 2015
とつぶやいたところ、
@nullnilaki /dev/memとかgdbでtarget kvmとかという話?
— oshimaya (@oshimyja) April 20, 2015
とoshimayaさんに教えてもらいました!
1.mi_switchに細工をしてhogeというプログラムを実行すると、
hogeプロセスのCR3レジスタの内容を出力するカーネル
2.仮想アドレスを取得するプログラム(プログラム名はhoge)
3./dev/mem経由で物理アドレスをダンプするプログラム(プログラム名はphysdump)
の3点セットが揃ったので、動かしてみます。
はじめに、仮想アドレスとCR3レジスタの内容を取得します。
hogeを実行すると
$ ./hoge address foo = 134519060
とfooの仮想アドレスを表示し、ループに入ります。
すると、コンソールには
cr3 = 5f215000 cr3 = 5f215000 cr3 = 5f215000 cr3 = 5f215000 cr3 = 5f215000 cr3 = 5f215000
という表示が延々出力されるはずです。
これで、
fooの仮想アドレス(134519060)
と
CR3レジスタに格納されている物理アドレス(0x5f215000)が取得出来ました。
では仮想アドレス->物理アドレスの変換をやってみます!
まず、取得できた仮想アドレス134519060を2進数に変換します。
134519060 -> 0000.1000.0000.0100.1001.1001.0001.0100
CR3レジスタに格納されている物理アドレスはPD(ページディレクトリ)の開始物理アドレスです。
仮想アドレスの上位10ビットはPDのインデックスです。
PDのインデックスの値を2ビット左にシフトしたものと
CR3レジスタに格納されている物理アドレス(PDの開始物理アドレス=0x5f215000)を加算すると、
PDEが格納されている物理アドレスが得られます。
まず、仮想アドレス134519060のPDのインデックスは
0000.1000.00 -> 0000.1000.0000 -> 80
になります。
次に、取得したCR3に格納されている物理アドレス(PDの開始物理アドレス)を指定してダンプしてみます。
# ./physdump 5f215000 100 | hexdump -C
00000000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
...
00000080 67 20 75 5e 00 00 00 00 00 00 00 00 00 00 00 00 |g u^............|
00000090 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
...
00000100
80の所には、67 20 75 5eが格納されていました。
i386はリトルエンディアンなので、逆転させて、
5e 75 20 67がPDEに格納されている内容になります。
5e 75 20 67のうち、下位12ビットはアクセス権やら、キャッシュやらの設定なので、オフします。
したがって、
0x5e752000がPT(ページテーブル)の開始物理アドレスになります。
さらに、PTEに格納されている内容を調べます。
仮想アドレスの中10ビットはPTのインデックスです。
PTのインデックスの値を2ビット左にシフトしたものと
PDEに格納されている物理アドレス(PTの開始物理アドレス=0x5e752000)を加算すると、
PTEが格納されている物理アドレスが得られます。
まず、仮想アドレス134519060のPTのインデックスは
00.0100.1001 -> 01.0010.0100 -> 124
になります。
次に、取得したPDEに格納されている物理アドレス(PTの開始物理アドレス)を指定してダンプしてみます。
# ./physdump 5e752000 200 | hexdump -C
00000000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
...
00000120 25 0c 2e 5e 67 94 68 5e 00 00 00 00 00 00 00 00 |%..^g.h^........|
00000130 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
...
00000200
124の所には、67 94 68 5eが格納されていました。
i386はリトルエンディアンなので、逆転させて、
5e 68 94 67がPTEに格納されている内容になります。
5e 68 94 67のうち、下位12ビットはアクセス権やら、キャッシュやらの設定なので、オフします。
したがって、
0x5e689000がページフレームの開始物理アドレスになります。
最後に、仮想アドレスの下位12ビットはページ内のオフセットアドレスになります。
1001.0001.0100 -> 914
ページフレームの開始物理アドレス(0x5e689000)にオフセットアドレス(0x914)を加算して
ダンプを取ってみると...
# ./physdump 5e689914 30 | hexdump -C 00000000 57 45 4c 43 4f 4d 45 20 54 4f 20 4e 45 54 42 53 |WELCOME TO NETBS| 00000010 44 21 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |D!..............| 00000020 00 00 00 00 00 00 00 00 00 00 00 00 f0 ff bf bf |................|
となっています。
これはfooの中身ですね。
これで仮想アドレス->物理アドレスのマッピングが勉強出来ました!
参考サイトに以下をあげておきます。softwaretechnique.jp