はじめに
下記の記事で,device treeのbootargsを編集してLinuxの使用メモリを制限する方法が紹介されていました. 試してみたところKernel panicを起こしてしまいましたので,その対処方法もメモしておきます.
今やってみたいのはZYBOのVGAまたはHDMIからGUIを出力することなのですが,やり方がよくわからず困っています. もっとハードルが低いことからコツコツやった方が早いかも….
DTSのbootargsを編集する
「mem=384M」を加えて,Linuxの使用メモリを384MBに制限してみます. ZYBOはメモリを512MB搭載していますので,アドレス 0x18000000 ~ 0x1fffffff まではLinuxの管理外になるはずです.
1 | console=ttyPS0,115200 mem=384M root=/dev/mmcblk0p2 rw earlyprintk rootfstype=ext4 rootwait devtmpfs.mount=1 |
Kernel panicが発生して起動しませんでした. わからないなりにログを眺めてみると,Kernelの読込み開始直後に落ちているようです.
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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 | 0 Device: zynq_sdhci Manufacturer ID: 74 OEM: 4a45 Name: USD Tran Speed: 50000000 Rd Block Len: 512 SD version 3.0 High Capacity: Yes Capacity: 7.5 GiB Bus Width: 4-bit reading uEnv.txt 117 bytes read in 8 ms (13.7 KiB/s) Loaded environment from uEnv.txt Importing environment from SD ... Running uenvcmd ... reading uImage 3827936 bytes read in 342 ms (10.7 MiB/s) reading devicetree.dtb 10655 bytes read in 16 ms (649.4 KiB/s) ## Booting kernel from Legacy Image at 03000000 ... Image Name: Linux-3.14.0-xilinx-13567-g906a2 Image Type: ARM Linux Kernel Image (uncompressed) Data Size: 3827872 Bytes = 3.7 MiB Load Address: 00008000 Entry Point: 00008000 Verifying Checksum ... OK ## Flattened Device Tree blob at 02a00000 Booting using the fdt blob at 0x2a00000 Loading Kernel Image ... OK Loading Device Tree to 1fb29000, end 1fb2e99e ... OK Starting kernel ... Uncompressing Linux... done, booting the kernel. [ 0.000000] Booting Linux on physical CPU 0x0 [ 0.000000] Linux version 3.14.0-xilinx-13567-g906a2c9 (省略) (gcc version 4.8.3 20140320 (prerelease) (Sourcery CodeBench Lite 2014.05-23) ) #5 SMP PREEMPT Thu Feb 12 21:03:26 JST 2015 [ 0.000000] CPU: ARMv7 Processor [413fc090] revision 0 (ARMv7), cr=18c5387d [ 0.000000] CPU: PIPT / VIPT nonaliasing data cache, VIPT aliasing instruction cache [ 0.000000] Machine model: xlnx,zynq-7000 [ 0.000000] bootconsole [earlycon0] enabled [ 0.000000] cma: CMA: reserved 128 MiB at 10000000 [ 0.000000] Memory policy: Data cache writealloc [ 0.000000] Unable to handle kernel paging request at virtual address dfb29000 [ 0.000000] pgd = c0004000 [ 0.000000] [dfb29000] *pgd=00000000 [ 0.000000] Internal error: Oops: 5 [#1] PREEMPT SMP ARM [ 0.000000] Modules linked in: [ 0.000000] CPU: 0 PID: 0 Comm: swapper Not tainted 3.14.0-xilinx-13567-g906a2c9 #5 [ 0.000000] task: c07296f0 ti: c071e000 task.ti: c071e000 [ 0.000000] PC is at __unflatten_device_tree+0xc4/0x278 [ 0.000000] LR is at unflatten_device_tree+0x1c/0x34 [ 0.000000] pc : [<c03e1764>] lr : [<c0702d7c>] psr: 600000d3 [ 0.000000] sp : c071ff40 ip : c072ad0c fp : cfffff40 [ 0.000000] r10: c07293c0 r9 : c072accc r8 : c07357b0 [ 0.000000] r7 : c06eb7d4 r6 : c076e1c0 r5 : c076ca20 r4 : dfb29000 [ 0.000000] r3 : 00000000 r2 : c06eb7d4 r1 : c0c956b8 r0 : dfb29000 [ 0.000000] Flags: nZCv IRQs off FIQs off Mode SVC_32 ISA ARM Segment kernel [ 0.000000] Control: 18c5387d Table: 0000404a DAC: 00000015 [ 0.000000] Process swapper (pid: 0, stack limit = 0xc071e240) [ 0.000000] Stack: (0xc071ff40 to 0xc0720000) [ 0.000000] ff40: dfb29000 c0c956b8 c06eb7d4 c0c956b8 c06eb7d4 c070c234 c076e1c0 c072accc [ 0.000000] ff60: c07357b0 c0702d7c c07263c8 c06eab28 ffffffff 18c5387d c071e000 c076e080 [ 0.000000] ff80: ffffffff 0000406a c07263c0 00000000 00000000 c04d92cc c0614719 00000001 [ 0.000000] ffa0: c071e000 c076e080 ffffffff 0000406a c07263c0 00000000 00000000 c06e7818 [ 0.000000] ffc0: 00000000 00000000 00000000 00000000 00000000 c070f860 18c5387d c072640c [ 0.000000] ffe0: c070f85c c072adfc 0000406a 413fc090 00000000 00008074 00000000 00000000 [ 0.000000] [<c03e1764>] (__unflatten_device_tree) from [<c0702d7c>] (unflatten_device_tree+0x1c/0x34) [ 0.000000] [<c0702d7c>] (unflatten_device_tree) from [<c06eab28>] (setup_arch+0x5b0/0x884) [ 0.000000] [<c06eab28>] (setup_arch) from [<c06e7818>] (start_kernel+0x88/0x380) [ 0.000000] [<c06e7818>] (start_kernel) from [<00008074>] (0x8074) [ 0.000000] Code: e59f0184 e59f1184 e6bf2f32 ebf8d05a (e5942000) [ 0.000000] ---[ end trace 3406ff24bd97382e ]--- [ 0.000000] Kernel panic - not syncing: Attempted to kill the idle task! |
Kernel panicの対処方法 / uEnv.txtの編集
原因と対処方法を調べてみると,下記Webページが引っかかりました. u-bootがdevice treeをメモリの上限アドレス付近に配置するため,Kernelの使用メモリを制限するとdevice treeが存在するアドレスを参照できない,ということでしょうか. 対処方法は,u-bootがdevice treeを配置する際の上限アドレス(fdt_high)を変更すれば良いようです.
u-bootのソースコード上では, include/configs/zynq-common.h で 0x20000000 に設定されているようです(自信はないです). ソースコードを編集してu-bootをリビルドするのは面倒なので,uEnv.txtでの設定を試してみました. 下記の1行目を追加しました.
1 2 | fdt_high=0x18000000 uenvcmd=fatload mmc 0 0x03000000 uImage && fatload mmc 0 0x02A00000 devicetree.dtb && bootm 0x03000000 - 0x02A00000 |
正常に起動しました. /proc/meminfo を参照すると,使用メモリが384MB程度に制限されていることがわかります.
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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 | 0 Device: zynq_sdhci Manufacturer ID: 74 OEM: 4a45 Name: USD Tran Speed: 50000000 Rd Block Len: 512 SD version 3.0 High Capacity: Yes Capacity: 7.5 GiB Bus Width: 4-bit reading uEnv.txt 137 bytes read in 8 ms (16.6 KiB/s) Loaded environment from uEnv.txt Importing environment from SD ... Running uenvcmd ... reading uImage 3827936 bytes read in 342 ms (10.7 MiB/s) reading devicetree.dtb 10655 bytes read in 16 ms (649.4 KiB/s) ## Booting kernel from Legacy Image at 03000000 ... Image Name: Linux-3.14.0-xilinx-13567-g906a2 Image Type: ARM Linux Kernel Image (uncompressed) Data Size: 3827872 Bytes = 3.7 MiB Load Address: 00008000 Entry Point: 00008000 Verifying Checksum ... OK ## Flattened Device Tree blob at 02a00000 Booting using the fdt blob at 0x2a00000 Loading Kernel Image ... OK Loading Device Tree to 17ffa000, end 17fff99e ... OK Starting kernel ... # 省略 root@linaro-ubuntu-desktop:~# cat /proc/meminfo MemTotal: 376616 kB MemFree: 154656 kB MemAvailable: 187500 kB Buffers: 11000 kB Cached: 65284 kB SwapCached: 0 kB Active: 156280 kB Inactive: 40620 kB Active(anon): 121080 kB Inactive(anon): 5300 kB Active(file): 35200 kB Inactive(file): 35320 kB Unevictable: 0 kB Mlocked: 0 kB HighTotal: 0 kB HighFree: 0 kB LowTotal: 376616 kB LowFree: 154656 kB SwapTotal: 0 kB SwapFree: 0 kB Dirty: 1024 kB Writeback: 0 kB AnonPages: 120824 kB Mapped: 49328 kB Shmem: 5608 kB Slab: 16692 kB SReclaimable: 7080 kB SUnreclaim: 9612 kB KernelStack: 1552 kB PageTables: 3092 kB NFS_Unstable: 0 kB Bounce: 0 kB WritebackTmp: 0 kB CommitLimit: 188308 kB Committed_AS: 1102444 kB VmallocTotal: 630784 kB VmallocUsed: 5652 kB VmallocChunk: 376448 kB |
0 件のコメント:
コメントを投稿