FPGAでLinuxを実行するHello、World

UPD 09/21/16 BusyBoxが正垞に起動するようになりたした。



画像






著者がMars rover 2 FPGAボヌド䞊のAmber SoCおよびLinuxチップでオヌプンシステムを実行しようずするMars roverプロゞェクト Webサむトの䞀連の蚘事に觊発され、私はTerasic DE2-115ボヌドでこの経隓を繰り返すこずにしたした。 しかし、 巚倧なたわごずず同じくらい叀いレガシヌの叀いバヌゞョンのLinux 2.4.27の代わりに、私は珟時点でLinuxの最新バヌゞョンである4.8.0-rc5を立ち䞊げたす。



アンバヌクリスタルシステム



Amberプロセッサコアは32ビットRISCプロセッサで、アヌキテクチャおよびARM v2aコマンドシステムず完党に互換性があり、GCCを䜿甚しおプログラムをコンパむルできたす。 プロセッサ自䜓に加えお、Amberプロゞェクトでは、UART、タむマヌ、むヌサネットMACなど、オンチップシステムの䞀郚ずしおいく぀かの呚蟺機噚を提䟛しおいたす。 プロセッサコアには2぀のバヌゞョンがありたす。

23色23 アンバヌ25
コンベアベルト 䞉段階 5぀のレベル
キャッシュ 䞀般コヌド+デヌタ 別れる
りィッシュボヌン甚タむダ 32ビット 128ビット
性胜 0.75 DMIPS / MHz 1.05 DMIPS / MHz


ご芧のずおり、プロセッサコアのパフォヌマンスは、ARMv4やARMv5など、ARMアヌキテクチャの新しいバヌゞョンに基づいたコアのパフォヌマンスに匹敵したす。 ARMv2aアヌキテクチャは、特蚱で保護されおおらず、その実装を自由に配垃できるため、Amberプロセッサに実装されおいたす。 ただし、これに関連するいく぀かの問題がありたす。このアヌキテクチャはGCCで廃止されたず芋なされおおり、GCCのサポヌトは埐々に「カットアりト」され、このアヌキテクチャのサポヌトは長い間Linuxカヌネルから削陀されたした。



アヌキテクチャの重芁な機胜は、ARMアヌキテクチャの新しいバヌゞョンずは異なり、プロセッサがTHUMBモヌドをサポヌトせず、CPSR / SPSRレゞスタを持たず、MSR / MRS呜什をサポヌトせず、プロセッサのフラグがPCレゞスタビットのビットに含たれおいるこずです。









このため、プロセッサはPCレゞスタ内の最倧64 MBのメモリ26ビットをアドレス指定できたす。最䜎2぀は垞に0です。 呜什は垞にワヌド境界で敎列されるため、レゞスタの最䞋䜍2ビットは、プロセッサの動䜜モヌドナヌザヌ/特暩、割り蟌みハンドラヌを決定するフラグに䜿甚されたす。 他のレゞスタでは、プロセッサは最倧4 GBのメモリをアドレス指定できたす。 プロセッサコアアヌキテクチャずそれに実装されおいるコマンドセットの詳现に぀いおは、 こちらずこちらをご芧ください 。



ARM Cross Compilerのむンストヌル



残念ながら、プロゞェクトをMarsロヌバヌボヌドに移怍する蚘事の著者が䜿甚したSourcery CodeBench Liteコンパむラはダりンロヌドできなくなりたしたが、これはそれほど倧きな問題ではありたせん。 Gentoo Linuxでcrosstool-NGたたはcrossdev



を䜿甚しおコンパむラをむンストヌルできたす。



crosstool-NGを䜿甚しおむンストヌルするには、「箱から出しおすぐに」利甚可胜なarm-unknown-eabi



を䜿甚したす。



 $ ct-ng arm-unknown-eabi $ ct-ng build
      
      





このコンパむラは、Linuxカヌネルず、ブヌトロヌダヌなどのベアメタルプログラム、およびシリアルポヌトにHello、Worldを出力する単玔なアプリケヌションを構築するために䜿甚されたす。



Hello Worldをコンパむルし、VerilogシミュレヌタヌでVerilatorを実行したす



GitHubからプロゞェクト配垃キットをダりンロヌドしお内郚を芋るプロゞェクトは2぀の郚分に分かれおいたすhw



フォルダヌにはVerilogの「ハヌドりェア」郚分の゜ヌスが含たれ、 sw



フォルダヌにはプロセッサヌで実行されるプログラムの゜ヌスコヌドず、 ELFおよびBINファむル圢匏のアセンブリおよび倉換を、Amberプロゞェクトのザむリンクスツヌルおよびテストスクリプトがサポヌトする圢匏に倉換したす。



sw/hello



フォルダヌに移動しお、 hello-world.c



をコンパむルしたす。



 $ cd sw/hello-world $ export AMBER_CROSSTOOL=arm-unknown-eabi $ make
      
      





その結果、ずりわけhello-world.mem



ファむルが生成されたす-コンパむルされたプログラムの内容を含むテキストファむルで、シミュレヌタヌずプロセッサヌのブヌトROMにロヌドするのに適しおいたす。



私が導かれた元の蚘事の著者は、無料で非垞に人気のあるシミュレヌタであるIcarus Verilogを䜿甚しおプロゞェクトをシミュレヌトしたしたが、問題は動䜜が非垞に遅いこずです-2.6 GHzプロセッサを搭茉したマシンでは、Icarus Verilogでシミュレヌトするずきのアンバヌコアクロックは玄16 kHz、および䞊蚘の䟋の文字列「Hello、World」の各文字が玄0.5秒間衚瀺されたす。 この速床は、ブヌトロヌダヌや同じhello-worldなどの小さなプログラムの実行をデバッグする必芁がある堎合は十分ですが、Linuxカヌネル党䜓のロヌドをデバッグする必芁がある堎合は受け入れられたせん-氞遠に埅たなければなりたせん。



したがっお、C ++でVerilogをコンパむルし、非垞に高速に動䜜するVerilatorシミュレヌタヌを䜿甚したす.Hello Worldは目に芋える遅延なしで即座に印刷され、マシンのクロック呚波数は玄1.5 MHzで、Icarus Verilogよりも100倍高速です ちなみに、Linuxカヌネル起動のデバッグプロセスには玄1週間かかりたした。シミュレヌションモヌドでは、テストベンチコヌドが、アドレスぞの移行や非同期を含むプロセッサによっお実行されるすべおの呜什のアセンブラヌリストをテキストログファむルに曞き蟌むため、゜フトりェア割り蟌みなど Verilogに実装された䞀皮の逆アセンブラ。



公匏サむトの指瀺に埓っおVerilatorをむンストヌルし、修正されたテストベンチがあるhw/de2_115/tb



フォルダヌに移動し、 make



を実行しmake



。 Verilogコンパむラの譊告ストリヌムにもかかわらず、結果ずしおobj_dir



フォルダヌが衚瀺され、システムをシミュレヌトするために実行obj_dir



実行可胜ファむルがobj_dir



たす。



次に、次のコマンドを実行したす。



 $ cp ../../../sw/hello-world/hello-world.mem ./boot-loader.mem $ ./obj_dir/Vtb
      
      





その結果、シミュレヌションが開始され、埅望のHello、Worldが衚瀺されたす。



 Load boot memory from boot-loader.mem Read in 961 lines Hello, World!
      
      





これは、GCCがARM甚にコンパむルしたプログラムをプロセッサが正垞に読み取り、実行したこずを意味したす



必芁に応じお、 Makefile



--trace



スタヌトアップリストにverilator



キヌを远加できたす。テストベンチ操䜜䞭に別のテストファむルout.vcd



が生成されたす。このファむルはout.vcd



で開き、プロセッサヌおよび他のブロック内のさたざたな信号の波圢を確認できたす







Builtrootを䜿甚しおinitramfsをビルドする



Linuxカヌネルをアセンブルする前に、システムのナヌザヌプログラムをコンパむルする環境uClibc-ngに基づくを䜜成し、ビルドプロセス䞭にinitramfsずしおカヌネルに远加されるファむルを生成したす。 これを行うには、ここからダりンロヌドできるBuildrootを䜿甚したす 。



 $ make amber_defconfig $ make
      
      





その結果、。 arm-buildroot-uclinux-uclibcgnueabi



ずファむルシステムむメヌゞが./output/images/rootfs.cpio



たす。 このむメヌゞぞのパスは、カヌネル構成ファむルのパラメヌタヌCONFIG_INITRAMFS_SOURCE



で指定する必芁がありたす。 BusyBoxはファむルシステムむメヌゞに含たれおいたすが、それでも私には起動したせん 珟圚 は起動しお いたすが、この蚘事のフレヌムワヌク内では、プロセス/sbin/init



ずしお単玔な「Hello、World」に制限し/sbin/init



。 これを行うには、BuildRootが各プログラマヌに既知の内容を含むhello.c



ファむルを䜜成するディレクトリで、次のコマンドを実行したす。



 $ ./output/host/usr/bin/arm-buildroot-uclinux-uclibcgnueabi-gcc -o hello hello.c $ mv hello output/target/sbin/init $ rm hello.gdb $ make
      
      





これらのコマンドが正垞に実行されるず、BusyBoxの代わりにアプリケヌションで./output/images/rootfs.cpio



が再構築されたす。 このファむル眮換の方法は、䜕かをすばやくチェックするのに適しおいたす。ビルドプロセス䞭にrootfs



のファむルを完党に远加および眮換するには、構成オプションBR2_ROOTFS_OVERLAY



がありたす。



Verilatorシミュレヌタで実行した䟋ずは異なり、この新しい「Hello、World」はベアメタルアプリケヌションずしおではなく、カスタムLinuxアプリケヌションずしお動䜜しおいたす。テキストは、暙準のuClibcラむブラリを䜿甚しおシリアルポヌトに出力されたす。 write



システムコヌルは、゜フトりェア割り蟌みを介しおカヌネルに制埡を移し、カヌネルは制埡をtty



ドラむバヌに、次にシリアルポヌトドラむバヌに移し、最埌にメッセヌゞが衚瀺されたす。



Linuxカヌネルずブヌトロヌダヌの構築



圓然、最新のカヌネルを起動するために、いく぀かの倉曎を行う必芁がありたした。 このコヌドはアヌキテクチャに䟝存しおいるため、ほずんどの堎合、これらの倉曎は割り蟌み凊理ずプロセッサモヌドの切り替えに関連しおいたす。 次に、むンテグレヌタヌプラットフォヌムサポヌトコヌドmach-integratorを倉曎したした。 2.4カヌネル甚のAmberプロゞェクトの䜜者の元のパッチには、このプラットフォヌムがAmber SoCアヌキテクチャのプロトタむプであるずいうヒントがありたす特に、割り蟌みコントロヌラヌ、タむマヌ、シリアルポヌトなどの呚蟺機噚が、䜿甚されるデバむスドラむバヌず互換性があるこずが刀明したしたこのプラットフォヌム、およびそれに基づいお新しいアンバヌプラットフォヌムを䜜成したした。



幞いなこずに、デバッグクロックは遅れおおり、珟圚では䜜業甚コアの組み立おは手銖を軜く動かすだけで完了しおいたす。 繰り返したい堎合は、゜ヌスを耇補しお次のコマンドを実行できたす。



 $ make ARCH=arm CROSS_BUILD=arm-none-eabi- amber_defconfig $ make -j8 ARCH=arm CROSS_BUILD=arm-none-eabi- Image $ make ARCH=arm CROSS_BUILD=arm-none-eabi- arch/arm/boot/dts/amber-de2115.dts
      
      





カヌネルをアセンブルした埌、 arch/arm/boot/Image



およびarch/arm/boot/dts/amber-de2115.dtb



ファむルが䜜成され、XMODEMプロトコルを䜿甚しおシリアルポヌト経由でブヌトロヌダヌを䜿甚しおボヌドにダりンロヌドできる状態になりたす。



ブヌトロヌダヌをビルドするには、 sw/boot-loader-serial



フォルダヌに移動し、 make



 AMBER_CROSSTOOL



環境AMBER_CROSSTOOL



忘れないでくださいを実行し、 boot-loader-serial.mem



。これは、 mem2mif



ナヌティリティを䜿甚しおアルテラでMIF圢匏に倉換できたすメモリ初期化ファむルずしおのQuartus II。



すべおをたずめる



Terasic DE2-115ボヌドをお持ちの堎合は、 de2_115.qpf



プロゞェクトを開いお合成したす私のプロゞェクトでは、マザヌボヌドにCOMポヌトがないため、シリアルポヌトはボヌドのRS232ではなくEXT_IOコネクタに接続されおいたす 、前の手順boot-loader-serial.mif



受信したboot-loader-serial.mif



メモリファむルde2_115_sram_2048_32_byte_en



ずしお指定し、ビットストリヌムをボヌドにロヌドしたす。 既知の開発者の1人にずっお、Amberプロセッサはリセットロゞックを実装しおいなかったため、ビットストリヌムをリロヌドするこずによっおのみプロセッサを初期状態にリセットできたす。 同時に、プロセス䞭にKEY0ボタンが抌されるず、プロセッサはプログラムがリリヌスされるたでプログラムを開始したせん。 このボタンを䜿甚しお、SignalTapを䜿甚しおVerilogコヌドをデバッグしたした。 しかし、圌女を手攟した堎合、ビットストリヌムを再起動するだけで最初からやり盎すこずができたす。



921600ボヌに蚭定された端末にビットストリヌムをロヌドするず、すぐにboot色のブヌトロヌダヌプロンプトが衚瀺されたす。 次に、 b 80000



コマンドを入力しお、以前にXMODEMを䜿甚しお圢成されたLinuxカヌネルファむル arch/arm/boot/Image



を送信し、次にb 78000



コマンドを再床入力しお、怜玢するデバむスを説明するDTBファむルを送信する必芁がありたす。どのドラむバヌをロヌドするか、システムに搭茉されおいるRAMの量、カヌネルパラメヌタヌずその他の情報を含むコマンドラむン。 ブヌトロヌダヌにパッチを圓お、DTBを探すアドレスずしおアドレス0x78000



をカヌネルに送信するようにしたので、このアドレスでロヌドしたす。







最埌に、䞡方のファむルがRAMSDRAMに読み蟌たれるず、ブヌトロヌダヌコン゜ヌルでj 80000



コマンドを入力できたす。 Linuxはロヌドを開始し、すべおが正しく行われた堎合、結果は次のようになりたす。







「Hello、World」は最初のナヌザヌプロセス /sbin/init



ずしお始たり、暙準ラむブラリずカヌネルを介しお、画面に切望されたフレヌズを衚瀺したした。 すごいですね。



Terasic DE2-115ボヌドたたは十分なサむズのFPGAを搭茉した他のボヌドがない堎合でも、VerilatorシミュレヌタヌでLinuxを実行できたす。 これを行うには、 -DAMBER_LOAD_MAIN_MEM=1



および-DAMBER_LOAD_DTB_MEM=1



をhw/de2_115/tb/Makefile



にVtb



、 Vtb



実行可胜ファむルを再構築したす。 次に、 amber-bin2mem



を䜿甚しお、シミュレヌタ甚のカヌネルファむルずDTBファむルを䜜成したす。



 $ amber-bin2mem arch/arm/boot/Image 80000 > vmlinux.mem $ amber-bin2mem arch/arm/boot/dts/amber-de2115.dtb 78000 > dtb.mem
      
      





さらに、通垞モヌドではナヌザヌからのコマンドを芁求するため、 main



関数の呌び出しをコメント化しお、シミュレヌション甚のブヌトロヌダヌコヌドをわずかに倉曎する必芁がありたす。 その埌、ブヌトロヌダヌはすぐに制埡をLinuxカヌネルに転送したす。 *.mem



ファむルを*.mem



フォルダヌにコピヌし、。/ ./obj_dir/Vtb



/ ./obj_dir/Vtb



を実行しお、Linuxの起動を監芖したす。



制限、実甚的な利点



もちろん、結果ずしお起動したLinuxは、AmberプロセッサコアにMMUメモリ管理ナニットがなく、その結果、仮想メモリサポヌトすべおのメモリがあるため、サヌバヌやワヌクステヌションで䜿甚するLinuxずはたったく異なりたす。物理的、メモリ保護任意のアプリケヌションがカヌネルメモリを損なうか、Wishboneバスを介しおそれをバむパスするデバむスず通信できる、コピヌオンラむトなど。NOMMULinuxは珟圚、通垞の圢匏のELF実行可胜ファむルをサポヌトしおいたせんただし、 FDPIC ELF圢匏をサポヌトする開発がありたすおよび動的なよだれかけ ioteki -代わりに䜿甚bFLT圢匏バむナリフラット -に基づいお、単玔な圢匏a.out



。 そしお、そのようなシステムでアプリケヌションのN個のコピヌを実行するず、たったく同じ数のコピヌがメモリに保存されたす。



行われた䜜業からは実際的な利点がただありたす。Linuxの「剥ぎ取られた」バヌゞョンであっおも、リ゜ヌスが限られおいるマむクロコントロヌラヌをベヌスにした倚くのデバむスで機胜したす。 FPGAプログラミング愛奜家が、FPGA合成プロセッサちなみに、DE2-115では容量の8たたは玄10,000 LEしか占有しないで本栌的なLinuxを詊すこずにより、自分にずっお有益なこずを孊べるこずを願っおいたす。 アルテラたたはザむリンクスに基づいた別のボヌドがある堎合、それぞの移怍は難しくありたせん。 ほずんどの䜜業はすでに完了しおいたす。 もちろん、FPGAず同じチップ䞊に完党なARM-SoCを含むXilinx Zynq、Altera Cyclone V SoCなど、実甚的な芳点から既により興味深い゜リュヌションが既にありたすが、この蚘事で玹介する゜リュヌションにより、シンプルなボヌドの所有者でもLinuxを起動できたすボヌド䞊の非垞に匷力なFPGA。 残りのフリヌロゞックを䜿甚しお、Wishboneバスに掛けお、ドラむバヌを䜿甚しおOSからアクセスできる新しいカスタムペリフェラルを実装できたす。



蚈画



Terasic DE2-115ボヌドは、興味深いプロゞェクトがすでに䜜成されおいるこずに基づいお、最も匷力なデバッグボヌドの1぀です 最も明るい䟋があり、 別の 䟋がありたす。 幅広い呚蟺機噚が搭茉されおいたす。





このすべおの富のうち、このプロゞェクトではこれたでランダムアクセスメモリのみを䜿甚したした。 将来的には、時間があれば、U-Bootをコンパむルしお、内蔵フラッシュメモリ、FPGAのブヌトロヌダヌコヌドに配眮し、U-Bootをロヌドするず、LinuxカヌネルずルヌトファむルシステムがSDメモリカヌドからロヌドされたす。 さらに、ボヌド䞊で利甚可胜な呚蟺機噚むヌサネットなどのサポヌトを実装したいず思いたす。



All Articles