Armadilloフォーラム

ユーザーランド領域の分割

s-hosoda

2016年8月25日 13時55分

お世話になります。

開発中のソフトウェアの出力ログを不揮発エリアに書き込むという要件を満たすため,
フラッシュメモリの未使用エリアを利用したいと思っています。
ありがたいことに,以下のブログにまさにやりたい手順が示されているので,参考に
させてもらい,ファイル名などを840に読み替えてトライしてみました。

    Armadillo-810: ユーザーランド領域を分割してみる
    https://users.atmark-techno.com/blog/750/2142

しかし残念ながら,make した kernel では起動してくれませんでした。

    #メモリマップの違いさえ気を付ければ同じ方法でArmadillo-840でも実現できると思います。

と示して頂いているのですが,ソース編集の場面で特に違いを意識するようなところが,
思い当たらず,ブログの手順と同じ内容で更新しました。
「3.1 カーネルのコンフィギュレーションを実行」は linux-3.x に移動して実行しました。

以下2点教えて頂けないでしょうか。
①メモリマップの違いをどのように反映されば良いでしょうか。
②起動時に何がまずいのかを,確認する方法はあるでしょうか。

以上,宜しくお願い致します。

コメント

at_takashi.sasayama

2016年8月25日 15時35分

笹山です。

> 以下2点教えて頂けないでしょうか。
> ①メモリマップの違いをどのように反映されば良いでしょうか。

Armadillo-810 と, Armadillo-840ではフラッシュメモリのサイズが異なります。
Armadillo-810 は 64MB, Armadillo-840 は 128MB です。

今回ご参照されている、ブログの内容においては、userland のサイズ指定時に考慮する必要があります。

例として、ブログの内容通り application を 5.25MB のサイズで作成する場合は、
以下の様なメモリマップになります。(userland以降のサイズが異なります)

bootloader    256kByte  0x00000000 -> 0x0003FFFF
config        256kByte  0x00040000 -> 0x0007FFFF
license       256kByte  0x00080000 -> 0x000BFFFF
firmware        4MByte  0x000C0000 -> 0x004BFFFF
kernel          4MByte  0x004C0000 -> 0x008BFFFF
userland      114Mbyte  0x008C0000 -> 0x07ABFFFF   ★サイズ縮小
application  5.25Mbyte  0x07AC0000 -> 0x07FFFFFF   ★新規追加

> ②起動時に何がまずいのかを,確認する方法はあるでしょうか。

ブログの内容通りに試してみましたが、Armadillo-840でも正常にカーネルが起動しました。
エラーログを拝見させていただきたいのですが、添付していただくことは可能でしょうか?
何かわかることがあるかもしれません。

また、以下の点をチェックしてみてください。

1. ブートローダーのコンフィグはArmadillo-840用でしょうか?

ブログ内容では、以下の様にコンフィグ、ビルドを行っていますが、

atmark@atde5:~/hermit-at-3.8.0$ make armadillo810_nor_defconfig
atmark@atde5:~/hermit-at-3.8.0$ make

Armadillo-840用には、以下の様に読み替える必要があります。

atmark@atde5:~/hermit-at-3.8.0$ make armadillo840_nor_defconfig ★Armadillo-840
atmark@atde5:~/hermit-at-3.8.0$ make

2. 間違えて、Armadillo-810用のカーネルイメージを書き込んでいないでしょうか?

その際は、以下の様なエラーログが出力されます。

RAMDISK: image too big! (106128KiB/65536KiB)
FAT-fs (ram0): utf8 is not a recommended IO charset for FAT filesystems, filesystem will be case sensitive!
List of all partitions:
1f00             256 mtdblock0  (driver?)
1f01             256 mtdblock1  (driver?)
1f02             256 mtdblock2  (driver?)
1f03            4096 mtdblock3  (driver?)
1f04            4096 mtdblock4  (driver?)
1f05           56576 mtdblock5  (driver?)
No filesystem could mount root, tried:  ext3 ext2 ext4 squashfs vfat
Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(1,0)
Backtrace:
[<c0011108>] (dump_backtrace+0x0/0x110) from [<c039b334>] (dump_stack+0x18/0x1c)
 r6:00008000 r5:d1d2a01d r4:d1d2a01d r3:00000001
[<c039b31c>] (dump_stack+0x0/0x1c) from [<c039b688>] (panic+0x84/0x1c4)
[<c039b604>] (panic+0x0/0x1c4) from [<c04b8dbc>] (mount_block_root+0x240/0x288)
 r3:d1c37f0c r2:00000020 r1:d1c37f38 r0:c0454952
 r7:c04d66b8
[<c04b8b7c>] (mount_block_root+0x0/0x288) from [<c04b8f44>] (mount_root+0x58/0x68)
[<c04b8eec>] (mount_root+0x0/0x68) from [<c04b90bc>] (prepare_namespace+0x168/0x1bc)
 r5:c04d66b0 r4:c0512ae0
[<c04b8f54>] (prepare_namespace+0x0/0x1bc) from [<c04b89e4>] (kernel_init+0x1c4/0x204)
 r5:c04d66b0 r4:00000007
[<c04b8820>] (kernel_init+0x0/0x204) from [<c0020f64>] (do_exit+0x0/0x75c)
rebooted by watchdog timedout.
Hermit-At v3.8.0-dirty (Armadillo-840/nor) compiled at 14:53:16, Aug 25 2016
hermit>

笹山様

お世話になります。

メモリマップについて,ブログのような2つのファイルの編集内容で,約70MB弱のエリアを
確保することを想定していました。

起動失敗について,
make armadillo840_nor_defconfig に読み替えて実行しました。
示して頂いたようなログの出力にはいたらず,watchdog timedoutで解凍を
繰り返し続けています。

Hermit-At v3.7.0 (Armadillo-840/mmcsd) compiled at 22:04:14, Sep 28 2015        
Uncompressing  kernel...........................................................
................................................................................
................................done.                                           
Uncompressing ramdisk...........................................................
................................................................................
................................................................................
(省略)
................................................................................
................................................................................
..........................................................done.                 
rebooted by watchdog timedout.                                                  
Hermit-At v3.7.0 (Armadillo-840/mmcsd) compiled at 22:04:14, Sep 28 2015        
Uncompressing  kernel...........................................................
................................................................................
................................done.                                           
Uncompressing ramdisk...........................................................
................................................................................
(以下省略)

ソースダウンロードからの一連の手順をもう一度試して見ましたが,
症状に変化はありませんでした。

以上,宜しくお願い致します。

at_takashi.sasayama

2016年8月25日 17時29分

笹山です。

> Hermit-At v3.7.0 (Armadillo-840/mmcsd) compiled at 22:04:14, Sep 28 2015

Armadillo-840 の JP2 が ショートしている為、SDカードのブートローダーから起動するようになっていますが、
これは意図通りでしょうか?
JP2にジャンパなどが接続されていましたら、それを外すことで改善されないかお試しいただけないでしょうか?

笹山様

お世話になっております。

> Armadillo-840 の JP2 が ショートしている為、SDカードのブートローダーから起動するようになっていますが、
> これは意図通りでしょうか?
> JP2にジャンパなどが接続されていましたら、それを外すことで改善されないかお試しいただけないでしょうか?

JP2 を ショートさせたままで,setenvコマンドにてフラッシュメモリ起動とSDカード起動を切り替えることができたため,
常にショートさせたままにしていました。
はずしてみましたが,状況に変化はありませんでした。

二度のmake menuconfigを行って,ただしソースの修正をしないで make したカーネルでは,起動させることが出来ました。
ブログに示して頂いている手順では,カーネルの make の際,以下のようなエラーが出てコンパイルが出来ませんでした。

・・・・
  AS      arch/arm/mach-shmobile/entry-intc.o
  CC      arch/arm/mach-shmobile/pm-rmobile.o
  CC      arch/arm/mach-shmobile/pm-r8a7740.o
  CC      arch/arm/mach-shmobile/board-armadillo840.o
arch/arm/mach-shmobile/board-armadillo840.c:2188:2: error: ‘SZ_50M’ undeclared here (not in a function)
make[2]: *** [arch/arm/mach-shmobile/board-armadillo840.o] エラー 1
make[1]: *** [arch/arm/mach-shmobile] エラー 2
make[1]: ディレクトリ `/home/atmark/part/linux-3.4-at17' から出ます
make: *** [linux] エラー 1
atmark@atde5:~/part/atmark-dist$ 

しかし,linux-3.xに移動してmake menuconfigを実行して make するといろいろ聞いてくるようになるので,
全てそのままデフォルトでリターンして,make をしていました。
よく確かめると,修正したソースのコンパイルはされていないので,make が通るようになっただけの様子です。

笹山様が確認された際は,上記のコンパイルエラーは発生しなかったでしょうか。

以上,よろしくお願い致します。

at_takashi.sasayama

2016年8月26日 9時30分

笹山です。

> arch/arm/mach-shmobile/board-armadillo840.c:2188:2: error: ‘SZ_50M’ undeclared here (not in a function)

上記コンパイルエラーですが、当方の環境でも発生しました。
これは SZ_50M という定義が存在しないというエラーでしたので、定義が存在する SZ_64M などに読み替えていました。
SZ_50M 相当に設定されたい場合は、 0x03200000 と記述してください。

> しかし,linux-3.xに移動してmake menuconfigを実行して make するといろいろ聞いてくるようになるので,
> 全てそのままデフォルトでリターンして,make をしていました。

当初は atmark-dist 配下ではなく、atmark-dist/linux-3.x 配下で make を実行されていたという意味でしょうか?
その場合ですと、 コンフィギュレーションと、ARCH 環境変数を適切に設定しないと、Armadillo で起動可能なイメージが作成されません。
マニュアルに記載されています atmark-dist 配下での make をお勧めします。

Armadillo-840 製品マニュアル: 11.1. Linuxカーネル/ユーザーランドをビルドする
http://manual.atmark-techno.com/armadillo-840/armadillo-840_product_man…

at_takuya.sasaki

2016年8月26日 21時54分

ブログを書いた佐々木です。

> arch/arm/mach-shmobile/board-armadillo840.c:2188:2: error: ‘SZ_50M’ undeclared here (not in a function)

こちらの件、大変失礼しました。
ご指摘の通り、SZ_50Mの定義をヘッダファイルに追加する手順が漏れていたので、コンパイルエラーになります。
回避策としては、linux-3.4-at17/include/asm-generic/sizes.h にSZ_50Mを追加するか、先のレスのように
以下のようにサイズを直接指定する必要があります。

        MTD_PART("userland",    MTDPART_OFS_APPEND,     0x3200000),

ブログは、上記の直接サイズ指定に直しておきました。
大変失礼をいたしました。

以上です。

佐々木様
笹山様

お世話になります。

ブログに示して頂いた手順で,Armadillo-840 でもユーザーランド領域を分割する
ことが出来ることが確認できました。

またユーザランドの /etc/init.d/mount や /etc/fstab に手を加えることで,分割した
領域を起動時にマウントする手順を確立できました。

これによって,SDカードを利用しなくてもソフトウェアの出力(実績)ログを,端末
の再起動で揮発させることなく利用できることがわかりました。

大変貴重な情報をありがとう御座います。

本当に,助かりました。