目次: Linux
自作ARMエミュレータでLinux 3.12.26をブートし、Busyboxのashのプロンプト表示まで到達しました。
現時点での動作イメージです。実際は最初の方にエミュレータのデバッグメッセージが大量に出ますが、意味ないので叩き切ってます。
Connected to the target VM, address: '127.0.0.1:49281', transport: 'socket' Exception: Reset by 'Init.'. [ 0.000000] Booting Linux on physical CPU 0x0 [ 0.000000] Linux version 3.12.26+ (katsuhiro@falcon) (gcc version 4.9.1 20140710 (prerelease) (crosstool-NG linaro-1.13.1-4.9-2014.07 - Linaro GCC 4.9-2014.07) ) #1 Thu Aug 14 02:42:16 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 c03ac754, node_mem_map c03c9000 [ 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/ram init=/bin/sh 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: 59960K/65536K available (2742K kernel code, 155K rwdata, 712K rodata, 114K init, 111K bss, 5576K 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 - 0xc0367c14 (3456 kB) [ 0.000000] .init : 0xc0368000 - 0xc03849fc ( 115 kB) [ 0.000000] .data : 0xc0386000 - 0xc03ace80 ( 156 kB) [ 0.000000] .bss : 0xc03ace80 - 0xc03c8d64 ( 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.823423] Calibrating delay loop... 0.51 BogoMIPS (lpj=2559) [ 2.008160] pid_max: default: 32768 minimum: 301 [ 2.051389] Mount-cache hash table entries: 512 [ 2.282632] CPU: Testing write buffer coherency: ok [ 2.336914] Setting up static identity map for 0xc029c520 - 0xc029c578 [ 3.015733] VFP support v0.3: no double precision support [ 3.115064] NET: Registered protocol family 16 [ 3.402544] DMA: preallocated 256 KiB pool for atomic coherent allocations [ 4.241363] Serial: AMBA PL011 UART driver [ 4.264723] dev:f1: ttyAMA0 at MMIO 0x101f1000 (irq = 44, base_baud = 0) is a PL011 rev1 [ 4.657293] console [ttyAMA0] enabled [ 4.748693] dev:f2: ttyAMA1 at MMIO 0x101f2000 (irq = 45, base_baud = 0) is a PL011 rev1 [ 4.827661] dev:f3: ttyAMA2 at MMIO 0x101f3000 (irq = 46, base_baud = 0) is a PL011 rev1 [ 4.958784] fpga:09: ttyAMA3 at MMIO 0x10009000 (irq = 70, base_baud = 0) is a PL011 rev1 [ 6.984675] bio: create slab <bio-0> at 0 [ 7.563484] Switched to clocksource timer3 [ 10.489897] NET: Registered protocol family 2 [ 10.731930] TCP established hash table entries: 512 (order: 0, 4096 bytes) [ 10.761376] TCP bind hash table entries: 512 (order: -1, 2048 bytes) [ 10.781356] TCP: Hash tables configured (established 512 bind 512) [ 10.810155] TCP: reno registered [ 10.817472] UDP hash table entries: 256 (order: 0, 4096 bytes) [ 10.833676] UDP-Lite hash table entries: 256 (order: 0, 4096 bytes) [ 10.936594] NET: Registered protocol family 1 [ 11.031626] RPC: Registered named UNIX socket transport module. [ 11.039086] RPC: Registered udp transport module. [ 11.045485] RPC: Registered tcp transport module. [ 11.050589] RPC: Registered tcp NFSv4.1 backchannel transport module. [ 11.116524] Trying to unpack rootfs image as initramfs... [ 107.483588] Freeing initrd memory: 1084K (c0800000 - c090f000) [ 107.546930] NetWinder Floating Point Emulator V0.97 (double precision) [ 107.961293] Installing knfsd (copyright (C) 1996 okir@monad.swb.de). [ 108.022282] jffs2: version 2.2. (NAND) © 2001-2006 Red Hat, Inc. [ 108.128699] ROMFS MTD (C) 2007 Red Hat, Inc. [ 108.143263] msgmni has been set to 119 [ 108.269578] Block layer SCSI generic (bsg) driver version 0.4 loaded (major 254) [ 108.280765] io scheduler noop registered [ 108.289606] io scheduler deadline registered [ 108.308715] io scheduler cfq registered (default) [ 108.386028] clcd-pl11x dev:20: PL110 rev0 at 0x10120000 SYS_CLCD: read 0x00001f00 LCDControl: 0x00000000 [ 109.004790] clcd-pl11x dev:20: Versatile hardware, VGA display SYS_CLCD: read 0x00001f00 SYS_CLCD: 0x00001f00 LCDIMSC: read 0x00000000 LCDTiming0: 0x27175f9c LCDTiming1: 0x200b05df LCDTiming2: 0x067f3800 LCDTiming3: 0x00000000 LCDUPBASE: 0x83000000 LCDLPBASE: 0x8304b000 SYS_OSC4: read 0x00000000 SYS_LOCK: 0x0000a05f SYS_OSC4: 0x0001c863 SYS_LOCK: 0x00000000 LCDIMSC: 0x00001029 LCDIMSC: 0x00001829 SYS_CLCD: read 0x00001f00 SYS_CLCD: 0x00001f03 SYS_CLCD: 0x00001f17 [ 113.628628] Console: switching to colour frame buffer device 80x60 [ 122.764467] brd: module loaded [ 122.953158] physmap platform flash device: 04000000 at 34000000 [ 123.244156] physmap-flash physmap-flash.0: map_probe failed [ 123.531512] smc91x: not found (-19). [ 123.686616] mousedev: PS/2 mouse device common for all mice [ 124.249155] TCP: cubic registered [ 124.257574] NET: Registered protocol family 17 UARTIFLS: 0x00000012 UARTFBRD: 0x00000000 UARTIBRD: 0x00000001 UARTLCR_H: 0x00000000 UARTFBRD: 0x00000004 UARTIBRD: 0x00000027 UARTLCR_H: 0x00000070 [ 124.810528] Freeing unused kernel memory: 112K (c0368000 - c0384000) ----- ls -la total 4 drwxr-xr-x 11 1000 1003 0 Aug 14 2014[1;34m.[0m drwxr-xr-x 11 1000 1003 0 Aug 14 2014[1;34m..[0m drwxr-xr-x 2 1000 1003 0 Aug 13 2014[1;34mbin[0m drwxr-xr-x 2 1000 1003 0 Aug 13 2014[1;34mdev[0m drwxr-xr-x 2 1000 1003 0 Aug 8 2014[1;34metc[0m -rwxr-xr-x 1 1000 1003 129 Aug 14 2014[1;32minit[0m drwxr-xr-x 2 1000 1003 0 Aug 8 2014[1;34mlib[0m drwxr-xr-x 2 1000 1003 0 Aug 8 2014[1;34mproc[0m drwx------ 2 0 0 0 Aug 13 2014[1;34mroot[0m drwxr-xr-x 2 1000 1003 0 Aug 8 2014[1;34mrun[0m drwxr-xr-x 2 1000 1003 0 Aug 8 2014[1;34msbin[0m drwxr-xr-x 2 1000 1003 0 Aug 8 2014[1;34msys[0m /bin/sh: can't access tty; job control turned off UARTFBRD: 0x00000004 UARTIBRD: 0x00000027 UARTLCR_H: 0x00000070 / # Disconnected from the target VM, address: '127.0.0.1:49281', transport: 'socket' Process finished with exit code -1 (メモ: コマンドラインから実行) $ java -cp out/production/semu net.katsuster.semu.Main ~/share/arm_cross/linux-3.12.26/arch/arm/boot/Image ~/share/arm_cross/work/initramfs.gz
エミュレータの出しているデバッグメッセージがなかったら、普通の起動ログとあまり変わりませんね。って、そりゃ当たり前か。
珍しいものは使っていません。ぶっちゃけPC本体さえあれば、他は全部タダで行けます。
エミュレータのコードはこのサイトに置いています(リンク)。マニュアルなどはないので、使い方が意味不明だと思いますし、見ても面白くないと思いますが…。
最初のコミットが6/4なので、開発期間は約2か月半です。日曜大工というか日曜プログラミングなので、割と長期間の取り組みになっています。とはいえ、フルタイムでやったとしても、実装方式などを悩む時間は変わらないので、開発期間はそんなに変わらないように思います。
前に書いたもの以外のハマりポイントをご紹介。
改良の余地はいくらでもあります。
しばらくは楽しいオモチャになりそうです。
Linux 3.12は起動するのに、Linux 3.14だとなぜか途中でハングします、なんでだろ?未だに良くわかりません。
この記事にコメントする
目次: Linux
ARMのldm命令には変わった機能が付いています。レジスタリストの後ろに付ける ^ なのですが、実は ^ には意味が2通りあります。そのためアセンブラで記述するときすこぶるわかりづらくなっています。
具体例を挙げると、下記の2つのldm命令は、同じようなレジスタリストを指定していて、同じような ^ が付いていますが、命令の意味は全く違います。
ldmdb sp, {r0, r1, r2, pc}^
ldmdb sp, {r0, r1, r2, lr}^
1つ目のldm命令は、sp - 16の指すアドレスからr0, r1, r2, pcにデータをロードして、cpsrレジスタに現在の動作モードのspsrレジスタをコピーせよ、という意味になります。
2つ目ldm命令は、sp - 16の指すアドレスから「ユーザモードの」r0, r1, r2, lrにデータをロードせよ、という意味になります。
何?意味がわからない?恐らく誰でもそうでしょう。私も最初に見たとき意味がわからなくて、目が点になりました。
なぜこんなことになるかというと、ARMのldm命令の ^ の意味が、レジスタリストに依存して変わるからです。具体的に言えば、
レジスタリストにpcレジスタが入っていたら、
「pcをロードするldm命令で、カレントモードのspsrをcpsrにコピーすることを示す」
レジスタリストにpcレジスタが入っていなかったら、
「pcをロードしないldm命令で、ユーザモードレジスタをロードすることを示す」
のようにARMの仕様で定義されているからです。
なんだその仕様は!と思われるでしょうが、この機能は、一般的なプログラムでは全く使われません。使われるのは、割り込みハンドラからの復帰、もしくは特権モードが絡む部分くらいで、いずれもOSの内部です。
そのためARMの初学者が使う可能性はほぼありません。いわゆる「わかってる」人しか使わない通の機能です。
少数のわかっている人しか使わないので、多少可読性が低くてもあまり問題が出ないのでしょう。たぶん。
と、擁護した直後に言うのは憚られますが、正直なところそこまで ^ を酷使せず、せめてどちらかを ^ じゃない別の記号にすれば良かったのにと思わんでもないです。いきなり変えたら大混乱が起きるので、今さらどうしようもありませんけど。
仕様を切るとき、特に将来も下位互換性が求められそうな仕様、オープンな仕様では、記号の一文字取っても、細心の注意が必要だよなーと、強く感じた一件でした。
この記事にコメントする
目次: Linux
自作ARMエミュレータ、Linux起動してinitramfs上の /initをexecveするところで必ず失敗するので調べてたら、
do_execve_common() → load_elf_binary() → padzero() → clear_user() → access_ok() → __range_ok()
ときて失敗し、結果的にEFAULTが返っていました。
range_okは常に失敗するわけでもないのが不思議で、さらに調べたらsbc, rsc命令のキャリーフラグ(Cフラグ)のエミュレーションが間違っていて、本来は成功なのに失敗を返す場合があることがわかりました。
うーん、パッと見ではわからん…。けど、これで2日間も悩んでいた俺って一体…。
メモ: 技術系?の話はFacebookから転記しておくことにした。
この記事にコメントする
IntelliJ IDEAのConsoleウインドウのコピー処理でハマりました。
Null文字をprintすると(例えばSystem.out.printf("%c", (char)0); など)、Ctrl+A, Ctrl+Cとキーを押して Consoleの出力結果を全コピーしようとしても、Null文字以降がコピーされません。何これ…困るわ。
バグ?仕様??
メモ: 技術系?の話はFacebookから転記しておくことにした。
この記事にコメントする
目次: GCC
組み込み系CPU向けクロスコンパイラの定番といえばCodeSourceryですが、ダウンロードのページに行くためにはユーザー登録が必要で、面倒くさいよー、という方も居ると思います。
ARM向けに限りますが、別の選択肢としてLinaroが公開しているクロスコンパイラという手があります。CodeSourcery同様にお手軽に使えるPrebuild版も用意してくれていますので、使い方には困らないと思います。
# 取得する wget https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.14.15.tar.xz wget http://releases.linaro.org/14.07/components/toolchain/binaries/gcc-linaro-arm-linux-gnueabihf-4.9-2014.07_linux.tar.xz # 展開する tar xJvf linux-3.14.15.tar.xz tar xJvf gcc-linaro-arm-linux-gnueabihf-4.9-2014.07_linux.tar.xz # ビルドする export ARCH=arm export CROSS_COMPILE=/home/katsuhiro/share/arm_cross/gcc-linaro-arm-linux-gnueabihf-4.9-2014.07_linux/bin/arm-linux-gnueabihf- cd linux-3.14.15 make KBUILD_DEFCONFIG=versatile_defconfig defconfig make -j4
ビルド成功したようなので、自作ARMv5エミュレータに放り込んでみました。
Connected to the target VM, address: '127.0.0.1:49748', transport: 'socket' Exception: Reset by 'Init.'. [ 0.000000] Booting Linux on physical CPU 0x0 [ 0.000000] Linux version 3.14.15 (katsuhiro@falcon) (gcc version 4.9.1 20140710 (prerelease) (crosstool-NG linaro-1.13.1-4.9-2014.07 - Linaro GCC 4.9-2014.07) ) #1 Fri Aug 8 15:38:54 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: Data cache writeback [ 0.000000] On node 0 totalpages: 16384 [ 0.000000] free_area_init_node: node 0, pgdat c03c4ce8, node_mem_map c3f7a000 [ 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.003317] sched_clock: 32 bits at 24MHz, resolution 41ns, wraps every 178956969942ns [ 0.029105] pcpu-alloc: s0 r0 d32768 u32768 alloc=1*32768 [ 0.031450] pcpu-alloc: [0] 0 [ 0.042642] Built 1 zonelists in Zone order, mobility grouping on. Total pages: 16256 [ 0.045733] Kernel command line: console=ttyAMA0 mem=64M lpj=0 root=/dev/nfs debug printk.time=1 [ 0.093627] PID hash table entries: 256 (order: -2, 1024 bytes) [ 0.109772] Dentry cache hash table entries: 8192 (order: 3, 32768 bytes) [ 0.173519] Inode-cache hash table entries: 4096 (order: 2, 16384 bytes) [ 0.734098] Memory: 60952K/65536K available (2817K kernel code, 157K rwdata, 732K rodata, 115K init, 116K bss, 4584K reserved) [ 0.754145] Virtual kernel memory layout: [ 0.754145] vector : 0xffff0000 - 0xffff1000 ( 4 kB) [ 0.754145] fixmap : 0xfff00000 - 0xfffe0000 ( 896 kB) [ 0.754145] vmalloc : 0xc4800000 - 0xff000000 ( 936 MB) [ 0.754145] lowmem : 0xc0000000 - 0xc4000000 ( 64 MB) [ 0.754145] modules : 0xbf000000 - 0xc0000000 ( 16 MB) [ 0.754145] .text : 0xc0008000 - 0xc037f900 (3551 kB) [ 0.754145] .init : 0xc0380000 - 0xc039ccd4 ( 116 kB) [ 0.754145] .data : 0xc039e000 - 0xc03c5420 ( 158 kB) [ 0.754145] .bss : 0xc03c5420 - 0xc03e2774 ( 117 kB) [ 0.835624] NR_IRQS:224 [ 1.433660] VIC @f1140000: id 0x00041190, vendor 0x41 [ 1.480147] FPGA IRQ chip 0 "SIC" @ f1003000, 13 irqs, parent IRQ: 63 [ 1.600891] Console: colour dummy device 80x30 [ 1.608749] Calibrating delay loop... 6.52 BogoMIPS (lpj=32640) [ 2.220671] pid_max: default: 32768 minimum: 301 [ 2.257974] Mount-cache hash table entries: 1024 (order: 0, 4096 bytes) [ 2.263175] Mountpoint-cache hash table entries: 1024 (order: 0, 4096 bytes) [ 2.424212] CPU: Testing write buffer coherency: ok [ 2.471352] Setting up static identity map for 0x802ae5b8 - 0x802ae610 [ 3.001781] VFP support v0.3: no double precision support [ 3.085927] NET: Registered protocol family 16 [ 3.237579] DMA: preallocated 256 KiB pool for atomic coherent allocations [ 3.885257] Serial: AMBA PL011 UART driver [ 3.909160] dev:f1: ttyAMA0 at MMIO 0x101f1000 (irq = 44, base_baud = 0) is a PL011 rev1 [ 4.214325] console [ttyAMA0] enabled UARTIMSC: 0x00000000 UARTICR: 0x0000ffff [ 4.292449] dev:f2: ttyAMA1 at MMIO 0x101f2000 (irq = 45, base_baud = 0) is a PL011 rev1 UARTIMSC: 0x00000000 UARTICR: 0x0000ffff [ 4.371940] dev:f3: ttyAMA2 at MMIO 0x101f3000 (irq = 46, base_baud = 0) is a PL011 rev1 UARTIMSC: 0x00000000 UARTICR: 0x0000ffff [ 4.454404] fpga:09: ttyAMA3 at MMIO 0x10009000 (irq = 70, base_baud = 0) is a PL011 rev1 [ 5.788310] bio: create slab <bio-0> at 0 SYS_LED: 0x000000ff SYS_LED: read 0x00000000 SYS_LED: read 0x00000000 SYS_LED: read 0x00000000 SYS_LED: read 0x00000000 SYS_LED: read 0x00000000 SYS_LED: read 0x00000000 SYS_LED: read 0x00000000 SYS_LED: read 0x00000000 [ 6.329351] Switched to clocksource timer3 [ 8.419343] NET: Registered protocol family 2 [ 8.592061] TCP established hash table entries: 1024 (order: 0, 4096 bytes) [ 8.613714] TCP bind hash table entries: 1024 (order: 0, 4096 bytes) [ 8.632315] TCP: Hash tables configured (established 1024 bind 1024) [ 8.652642] TCP: reno registered [ 8.659583] UDP hash table entries: 256 (order: 0, 4096 bytes) [ 8.675257] UDP-Lite hash table entries: 256 (order: 0, 4096 bytes) [ 8.750198] NET: Registered protocol family 1 [ 8.820467] RPC: Registered named UNIX socket transport module. [ 8.827386] RPC: Registered udp transport module. [ 8.833482] RPC: Registered tcp transport module. [ 8.839809] RPC: Registered tcp NFSv4.1 backchannel transport module. [ 8.932090] NetWinder Floating Point Emulator V0.97 (double precision) [ 9.113116] futex hash table entries: 256 (order: -1, 3072 bytes) Exception: Data abort by 'MMU trans sec, paL1:0x80004000, entryL1:0x00000000, va:0x00000000, dom:0, inst:dat, priv:user, read:rd.'. [ 9.275864] Installing knfsd (copyright (C) 1996 okir@monad.swb.de). [ 9.309731] jffs2: version 2.2. (NAND) Ac 2001-2006 Red Hat, Inc. [ 9.368658] ROMFS MTD (C) 2007 Red Hat, Inc. [ 9.378358] msgmni has been set to 119 [ 9.461972] Block layer SCSI generic (bsg) driver version 0.4 loaded (major 254) [ 9.469946] io scheduler noop registered [ 9.475694] io scheduler deadline registered [ 9.485652] io scheduler cfq registered (default) Exception in thread "main" java.lang.IllegalArgumentException: Illegal address 0x00000410. at net.katsuster.semu.Controller64Reg32.isValidReg(Controller64Reg32.java:57) at net.katsuster.semu.GPIO.tryAccess(GPIO.java:79) at net.katsuster.semu.GPIO.tryWrite(GPIO.java:69) at net.katsuster.semu.Bus64.tryWrite(Bus64.java:168) at net.katsuster.semu.MasterCore64.tryWrite(MasterCore64.java:96) at net.katsuster.semu.ARMv5.executeStrb(ARMv5.java:3303) at net.katsuster.semu.ARMv5.executeSubLdrStr(ARMv5.java:4492) at net.katsuster.semu.ARMv5.executeInst(ARMv5.java:4074) at net.katsuster.semu.ARMv5.execute(ARMv5.java:4055) at net.katsuster.semu.ARMv5.step(ARMv5.java:5201) at net.katsuster.semu.CPU.run(CPU.java:158) at net.katsuster.semu.Main.main(Main.java:252) java.lang.IllegalArgumentException: Illegal address 0x00000410. pc:c0179db4 Disconnected from the target VM, address: '127.0.0.1:49748', transport: 'socket' Process finished with exit code 1
GPIOデバイスにアクセスに行くらしく途中で怒られました。GPIOなんて何に使っているんでしょう?他にもボードのLEDを光らせるみたいですが、何したいんだろう…これ。
この記事にコメントする
目次: 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が取り上げるとしたら、このゲームを何と言って紹介するのだろうか??
この記事にコメントする
| < | 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月6日
25年10月6日
25年9月29日
25年9月29日
20年8月24日
20年8月24日
16年2月14日
16年2月14日
25年7月20日
25年7月20日
25年7月20日
25年7月20日
25年7月20日
25年7月20日
20年8月16日
20年8月16日
20年8月16日
20年8月16日
24年6月17日
24年6月17日
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年
過去日記について
アクセス統計
サーバ一覧
サイトの情報合計:
本日: