2015/02/12

Zynq Linuxの使用メモリを制限する

はじめに

下記の記事で,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 件のコメント:

コメントを投稿