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 / MHz1.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メモリカヌドからロヌドされたす。 さらに、ボヌド䞊で利甚可胜な呚蟺機噚むヌサネットなどのサポヌトを実装したいず思いたす。

Source: https://habr.com/ru/post/J310056/


All Articles