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だけで良いのかな?
とりあえず「mem=128M」だけつけて、なんか騙されてるような気分のままブート。
…ホントか?これで残りの384MBは管理外のメモリとしてDMAとかで荒らしちゃっても良いのか?
なんかすごく不安なので、確認用のハードウェアをつないでみたいと思います。
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とかで荒らしちゃっても良いのか?
なんかすごく不安なので、確認用のハードウェアをつないでみたいと思います。