目次: Linux
せっかく組み込み屋さんやってるんだから、何か一つ組み込みっぽいことでもしようと思い立ち、ARMのエミュレータを書き始めて、はや2ヶ月が経ちました。
Connected to the target VM, address: '127.0.0.1:52615', transport: 'socket' Exception: Reset by 'Init.'. I&D-cache: all invalidated. I&D-TLB : all invalidated. TTBR0 : 0x80004000. base : 0x20001. SCTLR : 0x3137. V : true. R : false. S : true. A : true. M : true. D-TLB : all invalidated. I-TLB : all invalidated. VICITCR: 0x00000000 VICVECTCNTL[0]: 0x00000020 VICVECTCNTL[1]: 0x00000021 VICVECTCNTL[2]: 0x00000022 VICVECTCNTL[3]: 0x00000023 VICVECTCNTL[4]: 0x00000024 VICVECTCNTL[5]: 0x00000025 VICVECTCNTL[6]: 0x00000026 VICVECTCNTL[7]: 0x00000027 VICVECTCNTL[8]: 0x00000028 VICVECTCNTL[9]: 0x00000029 VICVECTCNTL[10]: 0x0000002a VICVECTCNTL[11]: 0x0000002b VICVECTCNTL[12]: 0x0000002c VICVECTCNTL[13]: 0x0000002d VICVECTCNTL[14]: 0x0000002e VICVECTCNTL[15]: 0x0000002f VICDEFVECTADDR: 0x00000020 SIC_ENCLR: 0xffffffff SIC_PICENSET: 0xffd00000 Timer1Control: 0x00000000 Timer2Control: 0x00000000 Timer1Control: 0x00000000 Timer2Control: 0x00000000 Timer2Control: 0x00000000 Timer2Load: 0xffffffff Timer2Value: 0xffffffff Timer2Control: 0x000000c2 Timer1Control: 0x00000000 Timer1Control: 0x00000022 Timer1Control: 0x00000022 Timer1Control: 0x00000022 Timer1Load: 0x00002710 Timer1Control: 0x000000e2 UARTIMSC: 0x00000000 UARTICR: 0x0000ffff UARTFBRD: 0x00000004 UARTIBRD: 0x00000027 UARTLCR_H: 0x00000070 [ 0.000000] Booting Linux on physical CPU 0x0 [ 0.000000] Linux version 3.12.20 (katsuhiro@falcon) (gcc version 4.8.1 (Sourcery CodeBench Lite 2013.11-33) ) #1 Sun Jun 1 00:39:50 JST 2014 [ 0.000000] CPU: ARM926EJ-S [41069260] revision 0 (ARMv5TEJ), cr=00003137 [ 0.000000] CPU: VIVT data cache, VIVT instruction cache [ 0.000000] Machine: ARM-Versatile PB [ 0.000000] Ignoring unrecognised tag 0x00000000 [ 0.000000] Memory policy: ECC disabled, Data cache writeback [ 0.000000] On node 0 totalpages: 16384 [ 0.000000] free_area_init_node: node 0, pgdat c03a801c, node_mem_map c03c5000 [ 0.000000] Normal zone: 128 pages used for memmap [ 0.000000] Normal zone: 0 pages reserved [ 0.000000] Normal zone: 16384 pages, LIFO batch:3 [ 0.000000] sched_clock: 32 bits at 24MHz, resolution 41ns, wraps every 178956ms [ 0.000000] pcpu-alloc: s0 r0 d32768 u32768 alloc=1*32768 [ 0.000000] pcpu-alloc: [0] 0 [ 0.000000] Built 1 zonelists in Zone order, mobility grouping on. Total pages: 16256 [ 0.000000] Kernel command line: console=ttyAMA0 mem=64M lpj=0 root=/dev/nfs debug printk.time=1 [ 0.000000] PID hash table entries: 256 (order: -2, 1024 bytes) [ 0.000000] Dentry cache hash table entries: 8192 (order: 3, 32768 bytes) [ 0.000000] Inode-cache hash table entries: 4096 (order: 2, 16384 bytes) [ 0.000000] Memory: 61064K/65536K available (2732K kernel code, 153K rwdata, 708K rodata, 114K init, 111K bss, 4472K reserved) [ 0.000000] Virtual kernel memory layout: [ 0.000000] vector : 0xffff0000 - 0xffff1000 ( 4 kB) [ 0.000000] fixmap : 0xfff00000 - 0xfffe0000 ( 896 kB) [ 0.000000] vmalloc : 0xc4800000 - 0xff000000 ( 936 MB) [ 0.000000] lowmem : 0xc0000000 - 0xc4000000 ( 64 MB) [ 0.000000] modules : 0xbf000000 - 0xc0000000 ( 16 MB) [ 0.000000] .text : 0xc0008000 - 0xc03647b8 (3442 kB) [ 0.000000] .init : 0xc0365000 - 0xc03819dc ( 115 kB) [ 0.000000] .data : 0xc0382000 - 0xc03a8740 ( 154 kB) [ 0.000000] .bss : 0xc03a8740 - 0xc03c4624 ( 112 kB) [ 0.000000] NR_IRQS:224 [ 0.000000] VIC @f1140000: id 0x00041190, vendor 0x41 [ 0.000000] FPGA IRQ chip 0 "SIC" @ f1003000, 13 irqs [ 0.000000] Console: colour dummy device 80x30 [ 1.562791] Calibrating delay loop... 6.52 BogoMIPS (lpj=32640) [ 2.099243] pid_max: default: 32768 minimum: 301 [ 2.130496] Mount-cache hash table entries: 512 [ 2.273627] CPU: Testing write buffer coherency: ok [ 2.315394] Setting up static identity map for 0xc0299720 - 0xc0299778 [ 2.672739] VFP support v0.3: no double precision support [ 2.734862] NET: Registered protocol family 16 [ 2.873316] DMA: preallocated 256 KiB pool for atomic coherent allocations [ 3.345429] Serial: AMBA PL011 UART driver [ 3.362809] dev:f1: ttyAMA0 at MMIO 0x101f1000 (irq = 44, base_baud = 0) is a PL011 rev1 [ 3.628990] console [ttyAMA0] enabled UARTIMSC: 0x00000000 UARTICR: 0x0000ffff [ 3.681619] dev:f2: ttyAMA1 at MMIO 0x101f2000 (irq = 45, base_baud = 0) is a PL011 rev1 UARTIMSC: 0x00000000 UARTICR: 0x0000ffff [ 3.735775] dev:f3: ttyAMA2 at MMIO 0x101f3000 (irq = 46, base_baud = 0) is a PL011 rev1 UARTIMSC: 0x00000000 UARTICR: 0x0000ffff [ 3.796222] fpga:09: ttyAMA3 at MMIO 0x10009000 (irq = 70, base_baud = 0) is a PL011 rev1 [ 4.796654] bio: create slab <bio-0> at 0 [ 5.084143] Switched to clocksource timer3 [ 6.655203] NET: Registered protocol family 2 [ 6.825171] TCP established hash table entries: 512 (order: 0, 4096 bytes) [ 6.840762] TCP bind hash table entries: 512 (order: -1, 2048 bytes) [ 6.853819] TCP: Hash tables configured (established 512 bind 512) [ 6.871232] TCP: reno registered [ 6.877328] UDP hash table entries: 256 (order: 0, 4096 bytes) [ 6.891042] UDP-Lite hash table entries: 256 (order: 0, 4096 bytes) [ 6.958240] NET: Registered protocol family 1 [ 7.029488] RPC: Registered named UNIX socket transport module. [ 7.035967] RPC: Registered udp transport module. [ 7.041442] RPC: Registered tcp transport module. [ 7.047158] RPC: Registered tcp NFSv4.1 backchannel transport module. java.lang.IllegalArgumentException: Sorry, not implemented. pc:c016ed88 Disconnected from the target VM, address: '127.0.0.1:52615', transport: 'socket' Exception in thread "main" java.lang.IllegalArgumentException: Sorry, not implemented. at net.katsuster.semu.ARMv5.executeLdrbt(ARMv5.java:2625) at net.katsuster.semu.ARMv5.executeSubLdrStr(ARMv5.java:4227) at net.katsuster.semu.ARMv5.executeInst(ARMv5.java:3833) at net.katsuster.semu.ARMv5.execute(ARMv5.java:3814) at net.katsuster.semu.ARMv5.step(ARMv5.java:4961) at net.katsuster.semu.CPU.run(CPU.java:158) at net.katsuster.semu.Main.main(Main.java:222) Process finished with exit code 1
空き時間でチマチマ実装して、ようやくLinuxブートの途中でクラッシュする、微妙な何かが動くところまで辿り着きました。
この先に進むにはldrt命令が要るようなので、いよいよサボっていたMMUを実装するときが来たようです。しかしまあCPUもMMUも周辺コアもスタブだらけでほぼ実装していないのに、よくここまで動きますね。Linuxってすごいのか適当なのか…。
きっと古いCPUの方が単純だろうという単純な考えで、CPUはARM9(アーキテクチャで言うとARMv5)、ボードはARM Versatile-AB/PBという開発ボードをエミュレーションのターゲットにしました。ボードの実物見たこと無いですが、実物が要る機会なんてそうそう無いでしょう…。
なんとCPU、周辺機器、ボードの仕様書、マニュアルは、ARMのサイトからタダでダウンロードできてしまいます。アカウントの登録は要りますけど、タダなのが素晴らしいです。
よっしゃ、俺も作ったるわ!という変な人はまず居ないと思いますが、もし作るならCPUの作り込みは程々にして、周辺機器、特にタイマー、UART辺りと繋がる方法を先に考えることをオススメします。
Linuxのブートメッセージを拝むにはCPUだけではダメで、UARTを作らないとメッセージが出力できませんし、タイマー割り込みが入らないとBogoMIPSの測定が終わらず、ブートメッセージが出る前にカーネルがハング(※)してしまうからです。
なぜブートメッセージにこだわるかというと、趣味のやる気を維持するには「進んでる、楽しい!」という感覚を繰り返すことが大事でして、エミュレータならLinuxのブートメッセージがどこまで出たか?という指標が、作業の手応えとして結構良いからです。
動くのか動かないのかさっぱりわからないまま、延々と実装する方が楽しいという方は、どこから作り始めても問題ないです。が、大抵の方にとってそれは「苦行」以外の何者でもないですよね。
(※)コマンドラインにlpj=1000とか0以外の数字を与えてBogoMIPSの測定をスキップする、という手もあります。
この記事にコメントする
友人とリアル脱出ゲーム(主催社SCRAPのサイト)に行きました。参加したのは「DEATH NOTE×リアル脱出ゲーム 新世界の神からの脱出」です。友人にチケットを取ってもらい、一人3,100円でした。
「脱出ゲーム」の名から、部屋をうろうろしてヒントを探し回るゲームかな?と思っていましたが、部屋を探し回ることはほぼなく、机でクイズを解き続けるタイプのゲームでした。
制限時間は1時間で残念ながらクリアはならず。最後に答えを教えてくれますが、解けるのかこんなの?って難易度でした。レイトン教授シリーズが得意な人は、向いているかも知れません。
調べていて、へえーと思ったのが「リアル脱出ゲーム」がSCRAPの登録商標になっていることでした。この単語はおいそれと使えないようです。
このゲームを説明できる単語は無いような気がします。もしNHKが取り上げるとしたら、このゲームを何と言って紹介するのだろうか??
この記事にコメントする
すげえ数売れて超儲かるお花畑計画が承認され、多額の予算と人材が投入され、不発に終わり超絶赤字を叩き出す、までがテンプレになっている。
でも一度も「今回は失敗だった、何故か考えよう」という会議を見たことがありません。
実はやっていたとしても、こう何度も同じ失敗ばかりでは、何も学べていないも同然なので根底を変えるべきでしょうし、失敗は恥ずかしいからと、誤魔化したり、自然消滅させているならさらに悪いでしょう。学習能力ゼロです。
組織も生き物も、学習能力のないやつは早々に死にます。ヤバいわこれ…。
メモ: 技術系の話はFacebookから転記しておくことにした。
この記事にコメントする
目次: Java
Javaの修飾子(Modifiers)は、どの順で書くのが正解あるいは推奨なのでしょうか?Javaの修飾子は適当な順に書いてもエラーにならないため、私は今まで何も気にせずに書いていたのですが、不思議なことに一度気にし始めたら気になって仕方ありません。
ググって見るとabstract publicと書く人が多い(デー - public、abstract、static、finalなど修飾子の順番 (3)より)そうです。自身の今まで書いたコードを見直しても、abstract publicと書くことが多かったため、特に意識せず書くとこんな順になるんだろうか、と思ったりしていたのですが…。
Java言語仕様3版を見るとpublic abstractが例として出ているではありませんか。どうやら仕様策定した人としてはpublic abstractと書いて欲しいようです。
なお、コード例は8.4.3.1 abstract Methodsにあります。
この記事にコメントする
「軍事的な抑止力」なんて時代遅れ、憲法9条こそが抑止力だと思います(1)を読んで。
私は、病気になるかも知れないから保険に入ろう、そのためのコストは払おうと思うけど、
このサイトの筆者さんのように、病気にならないように過ごせば保険は不要、自分のやりたいことに使おう、という考えもあるんだなあ。
でも病気になったら諦める以外ないから、ギャンブラーですよね。いずれにせよハイリスクハイリターン志向ですね。
メモ: 技術系の話はFacebookから転記しておくことにした。
この記事にコメントする
| < | 2014 | > | ||||
| << | < | 08 | > | >> | ||
| 日 | 月 | 火 | 水 | 木 | 金 | 土 |
| - | - | - | - | - | 1 | 2 |
| 3 | 4 | 5 | 6 | 7 | 8 | 9 |
| 10 | 11 | 12 | 13 | 14 | 15 | 16 |
| 17 | 18 | 19 | 20 | 21 | 22 | 23 |
| 24 | 25 | 26 | 27 | 28 | 29 | 30 |
| 31 | - | - | - | - | - | - |
25年10月15日
25年10月18日
22年5月5日
25年10月19日
23年4月11日
06年4月22日
25年10月17日
25年10月6日
25年10月13日
20年10月23日
25年10月12日
20年8月29日
19年1月13日
18年10月13日
18年9月3日
18年8月20日
18年7月23日
18年7月22日
18年10月14日
18年11月10日
wiki
Linux JM
Java API
2002年
2003年
2004年
2005年
2006年
2007年
2008年
2009年
2010年
2011年
2012年
2013年
2014年
2015年
2016年
2017年
2018年
2019年
2020年
2021年
2022年
2023年
2024年
2025年
過去日記について
アクセス統計
サーバ一覧
サイトの情報合計:
本日: