SSブログ

ZedBoard Linux (4) [FPGA]

ちょっと空きましたが、続き。
ZynqのFPGA部分が空っぽになったところで、改めて使い方を考えてみます。

私がZynqを使うときは大体、
・DDRメモリに直接のデータを出し入れするペリフェラルを作る。画像とかパケットとか音声とか色々。
・CPUはその管理。ちょっとデータ処理も行う。
というパターンがほとんどです。

一方、LinuxなどOSを使いたい理由は
・ネットワークアプリが作りやすい
・リモート管理がやりたい
・ファイルシステムが便利
などなどで、実はデータ処理にはあまり関連しません。

FPGA側のメモリの使い方を見てると、いったん確保したら電源切るまで二度と開放しない事もあります。Linuxのダイナミックなメモリ管理の機能はFPGAのロジックには必要なかったりします。逆に複雑なメモリ管理機構は邪魔になりかねません。
※PCのGPGPUでも似た問題が起きますよね。こちらはがんばってGPUがCPUのメモリ空間に合わせようとしています。コヒーレンシーの採れた共通アドレス空間が使えるようなシステムに向かってる感じでしょうか。

そう考えると、DDRメモリはできるだけFPGA側に開放して、Linuxはできるだけ小さくまとまってくれてた方が便利です。物理的に別のメモリになってくれてるとより良いんですけどね。terasicのSoCKitはHPSとFPGA個別にDDRメモリが付いてて良さげです。
解放されたメモリ領域はLinuxの管理外領域として、単なるI/Oとして認識してくれればOKです。FPGAを使うときはLinuxは主役ではありません。※Linuxが主役なら多分FPGA内部のCPUは使いません。
例えば、ZedBoardのZynqが管理している512MBのメモリのうち、384MBを確保してDMAが使える連続空間にマップする、しかも電源切るまで確保しっぱなし、なんて使い方なら、最初からLinuxが使う空間を下位128MBに切っておいて、残りは管理外とした方がスマートだと思います。

それをやるオプションは…devicetreeにあるbootargsだけで良いのかな?
bootargs = "mem=128M console=ttyPS0,115200 root=/dev/ram rw initrd=0x800000,8M earlyprintk rootwait devtmpfs.mount=1";
「mem=128M」が追加オプション。…え?ホント?これだけで良いの?
ps7_ddr_0: memory@0 {
	device_type = "memory";
	reg = < 0x0 0x20000000 >;
};
それともこっち?

とりあえず「mem=128M」だけつけて、なんか騙されてるような気分のままブート。
[    0.000000] Kernel command line: mem=128M console=ttyPS0,115200 root=/dev/ram rw initrd=0x800000,8M earlyprintk rootwait devtmpfs.mount=1
[    0.000000] PID hash table entries: 512 (order: -1, 2048 bytes)
[    0.000000] Dentry cache hash table entries: 16384 (order: 4, 65536 bytes)
[    0.000000] Inode-cache hash table entries: 8192 (order: 3, 32768 bytes)
[    0.000000] Memory: 128MB = 128MB total
[    0.000000] Memory: 116588k/116588k available, 14484k reserved, 0K highmem
…
zynq> cat /proc/meminfo
MemTotal:         124928 kB
MemFree:          105980 kB
Buffers:             284 kB
Cached:             3496 kB
SwapCached:            0 kB
Active:             2720 kB
Inactive:           2388 kB
Active(anon):       1336 kB
Inactive(anon):       56 kB
Active(file):       1384 kB
Inactive(file):     2332 kB
Unevictable:           0 kB
Mlocked:               0 kB
HighTotal:             0 kB
HighFree:              0 kB
LowTotal:         124928 kB
LowFree:          105980 kB
SwapTotal:             0 kB
SwapFree:              0 kB
Dirty:                 0 kB
Writeback:             0 kB
AnonPages:          1344 kB
Mapped:             1344 kB
Shmem:                64 kB
Slab:               4236 kB
SReclaimable:       1912 kB
SUnreclaim:         2324 kB
KernelStack:         336 kB
PageTables:          204 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:       62464 kB
Committed_AS:       4812 kB
VmallocTotal:     860160 kB
VmallocUsed:         376 kB
VmallocChunk:     777856 kB
なったっぽい。
…ホントか?これで残りの384MBは管理外のメモリとしてDMAとかで荒らしちゃっても良いのか?

なんかすごく不安なので、確認用のハードウェアをつないでみたいと思います。

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。