microblaze の uclinux
ram で root fs まではかろうじて(とちゅう BUG とわれるが、、、)たちあがる。しかし、Busybox でエラー。
early_printk_console is enabled at 0x50002000 Ramdisk addr 0x00004b7b, Compiled-in FDT at 0x10172a98 Linux version 2.6.34-00671-g91e2c43 (ryos@heavens-door) (gcc version 4.1.2) #18 Wed Sep 15 00:01:21 JST 2010 setup_cpuinfo: initialising setup_cpuinfo: No PVR support. Using static CPU info from FDT cache: wt_msr setup_memory: Main mem: 0x10000000-0x18000000, size 0x08000000 setup_memory: kernel addr=0x10050000-0x101d0000 size=0x00180000 setup_memory: max_mapnr: 0x8000 setup_memory: min_low_pfn: 0x10000 setup_memory: max_low_pfn: 0x18000 On node 0 totalpages: 32768 free_area_init_node: node 0, pgdat 101b191c, node_mem_map 101d1000 Normal zone: 256 pages used for memmap Normal zone: 0 pages reserved Normal zone: 32512 pages, LIFO batch:0 Built 1 zonelists in Zone order, mobility grouping on. Total pages: 32512 Kernel command line: console=ttyUL0 root=/dev/ram PID hash table entries: 512 (order: -1, 2048 bytes) Dentry cache hash table entries: 16384 (order: 4, 65536 bytes) Inode-cache hash table entries: 8192 (order: 3, 32768 bytes) Memory: 128404k/131072k available Hierarchical RCU implementation. RCU-based detection of stalled CPUs is enabled. NR_IRQS:32 xlnx,xps-intc-1.00.a #0 at 0x50003000, num_irq=5, edge=0xc Please enable two timers in HW xlnx,xps-timer-1.00.a #0 at 0x50001000, irq=3 microblaze_timer_set_mode: shutdown microblaze_timer_set_mode: periodic Calibrating delay loop... 38.65 BogoMIPS (lpj=77312) Mount-cache hash table entries: 512 bio: create slab <bio-0> at 0 Switching to clocksource microblaze_clocksource Trying to unpack rootfs image as initramfs... rootfs image is not initramfs (no cpio magic); looks like an initrd BUG: Bad page state in process swapper pfn:10000 page:101d1000 count:0 mapcount:0 mapping:(null) index:0x0 page flags: 0x80000(buddy) Stack: 17815e18 00003fff 10180b68 101d1000 101d1000 10090044 10180cc0 17813f40 00010000 00000000 00000000 00000000 10000000 100900a0 10177bf8 178417a0 178417a0 17400484 100a482c 000459d6 10000000 00000000 100459d6 1780e400 Call Trace: [<10090044>] free_hot_cold_page+0x1a0/0x1ac [<100900a0>] __free_pages+0x50/0x64 [<100a482c>] fput+0x28/0x3c [<100900e0>] free_pages+0x2c/0x40 [<100a07a8>] filp_close+0x6c/0xac [<10056984>] free_initrd_mem+0x98/0xf4 [<100a2064>] sys_close+0x70/0xc8 [<101b6200>] free_initrd+0x28/0x4c [<101b6458>] populate_rootfs+0x234/0x28c [<101b646c>] populate_rootfs+0x248/0x28c [<100500d4>] do_one_initcall+0x34/0x250 [<101b6224>] populate_rootfs+0x0/0x28c [<101b3200>] kernel_init+0xfc/0x1d0 [<101b31a8>] kernel_init+0xa4/0x1d0 [<101b319c>] kernel_init+0x98/0x1d0 [<101bc490>] init_tmpfs+0x8/0x48 [<10051d2c>] kernel_thread_helper+0xc/0x20 [<10051d20>] kernel_thread_helper+0x0/0x20 Disabling lock debugging due to kernel taint BUG: Bad page state in process swapper pfn:10040 page:101d1800 count:0 mapcount:0 mapping:(null) index:0x0 page flags: 0x80000(buddy) Stack: 17815e18 00003fff 10180b68 101d1800 101d1800 10090044 10180cc0 17813f40 00010040 00000000 101d1400 00000000 10040000 100900a0 10177bf8 178417a0 178417a0 17400484 100a482c 000459d6 10040000 00000040 100459d6 1780e400 Call Trace: [<10090044>] free_hot_cold_page+0x1a0/0x1ac [<100900a0>] __free_pages+0x50/0x64 [<100a482c>] fput+0x28/0x3c [<100900e0>] free_pages+0x2c/0x40 [<100a07a8>] filp_close+0x6c/0xac [<10056984>] free_initrd_mem+0x98/0xf4 [<100a2064>] sys_close+0x70/0xc8 [<101b6200>] free_initrd+0x28/0x4c [<101b6458>] populate_rootfs+0x234/0x28c [<101b646c>] populate_rootfs+0x248/0x28c [<100500d4>] do_one_initcall+0x34/0x250 [<101b6224>] populate_rootfs+0x0/0x28c [<101b3200>] kernel_init+0xfc/0x1d0 [<101b31a8>] kernel_init+0xa4/0x1d0 [<101b319c>] kernel_init+0x98/0x1d0 [<101bc490>] init_tmpfs+0x8/0x48 [<10051d2c>] kernel_thread_helper+0xc/0x20 [<10051d20>] kernel_thread_helper+0x0/0x20 Freeing initrd memory: 280k freed ROMFS MTD (C) 2007 Red Hat, Inc. io scheduler noop registered io scheduler deadline registered io scheduler cfq registered (default) 50002000.serial: ttyUL0 at MMIO 0x50002003 (irq = 2) is a uartlite console [ttyUL0] enabled brd: module loaded RAMDISK: gzip image found at block 0 VFS: Mounted root (ext2 filesystem) readonly on device 1:0. Freeing unused kernel memory: 72k freed sh: memory exhausted Kernel panic - not syncing: Attempted to kill init!
どうも microblaze で ram の rootfs はあまり試されていないらしい。dts に
linux,initrd-start = <0x10000000>; linux,initrd-end = <0x100459d6>;
みたいな記述が必要。vmlinux には組み込まれない。(Makefile lds を読むと組み込み手段が用意されていない)
init/initramfs.c には initrd_start がないと ramfs は生成されないようだ。initrd_start があればそこから(cpio でないことを確認する -initramfs でないとき -)gz を展開して /initrd.image とする。のちにそれを ram0 にアサインする。
しかし、initrd_start はちょっとやそっとじゃ設定されない(なんじゃそりゃ)。microblaze では early_init_dt_setup_initrd_arch で設定される。これは drivers/of/fdt.c から呼ばれるが、前述の dts を参照している。powerpc アーキテクチャもそうなっているみたい(未確認。ソースを見ただけ)arm アーキテクチャはどうも kernel の軌道引数で与えるみたい。
以前のようにリンク時に自動判別したほうがスマートな気がするけど、、、
まぁいいか、microblaze の開始位置をちょっとずらして ramfs を配置して、dts に追加して(この辺が手作業だ。前は自動だったのに、、、)
まぁ initrd は使いにくくなりました。initramfs を使えというのだろうか?microblaze にはinitramfs を入れ込む仕組みがないけどね(うそ。あった)。
そっか、どっちにしろ ramfs だからどうしてもデバッグ用なんだ。立ち上がっても、毎回、気を失っているわけだから、、、最終的には rootfs は ram じゃだめなんだ(当たり前か)。だから initramfs を使うのが正解なんだな。