Linuxカーネルを作る
このディレクトリ以下は書きかけです。内容については保障できません。平成26年7月22日
準備
XILINXの開発環境が入ったLinuxマシンでシェルを立ち上げたら、下の2行を実行してください。
export CROSS_COMPILE=microblazeel-xilinx-linux-gnu- source /opt/Xilinx/SDK/2013.2/settings32.sh
U-Bootのmkimageツールの作成
U-BootからLinuxを起動するときには、mkimageというツールを使ってカーネルにヘッダを付けなければなりません。mkimageは、u-boot-xlnx/toolsの中にソースがあるものの、ビルドはされていません。どうやら、u-boot-xlnxのディレクトリでmake toolsとやるとmkimageなどのツールが生成されるようです。
つまり、
cd u-boot-xlnx make tools
とやって、u-boot-xlnxの中にmkimageの実行ファイルを作っておいて、
cd u-boot-xlnx/tools export PATH=`pwd`:$PATH
を行うことでパスを通しておくことでmkimageが使用できるようになるようです。
このようにして自分でビルドしてもよいのですが、ubuntuなどのディストリビューションではsudo apt-get install u-boot-toolsでもインストールできます。
Linuxのソースを取得する
githubのXILINXのレポジトリからLinuxのソース一式を取得します。結構時間がかかります。
git clone git://github.com/Xilinx/linux-xlnx.git
コンフィグを初期状態にする
以下のコマンドでコンフィグを初期状態にします。
cd linux-xlnx/ make ARCH=microblaze mmu_defconfig
メニューコンフィグを行う
以下のコマンドを入力して、メニューコンフィグを出します。
make ARCH=microblaze menuconfig
最初に設定すべき個所は、Platform optionsの中にある
の部分。
Physical address where Linux Kernel is を0xb0000000に設定します。
USE_MSR_INSTRとUSE_PCMP_INSTRは両方とも1にします。(デフォルトのまま)
それ以外をどのような値に設定すればよいかは、fpgaのプロジェクトディレクトリの、\fpga_withmmu\cpu\cpu.mhsの内容を読んで決めます。具体的には、特電Artix-7 MicroBlazeプロジェクトで使用したcpu.mhsは、
BEGIN microblaze ・・・ PARAMETER C_USE_BARREL = 1 PARAMETER C_USE_HW_MUL = 2 PARAMETER C_USE_DIV = 1 PARAMETER C_USE_FPU = 2 ・・・(中略)・・・ END ・・・(中略)・・・ BEGIN axi_7series_ddrx ・・・ PARAMETER C_S_AXI_BASEADDR = 0xb0000000 PARAMETER C_S_AXI_HIGHADDR = 0xbfffffff ・・・ END
となっているので、
- USE_BARREL=1
- USE_DIV=1
- USE_HW_MUL=2
- USE_FPU=2
とします。(デフォルトのまま)
結局、設定するのは1か所です。
次にESCを押して1段戻った後、General setupの中にあるInitial RAM filesystemの設定。
Initial RAM filesystemを有効にして、
Initramfs source fileesを選択し、ファイル名を${ROOTDIR}/images/rootfs.cpioに設定します。
これで最低限のコンフィグができました。ESCを何回か押して、メニューコンフィグを抜けます。
カーネルをビルドする
以下のコマンドを入力し、カーネルをビルドします。10分くらいかかります。
make ARCH=microblaze UIMAGE_LOADADDR=0xb0000000 linux.bin.ub
できあがったイメージファイルは、u-boot-xlnx/arch/microblaze/boot/linux.bin.ubに格納されています。
もし、上記ディレクトリにlinux.bin.ubがなくてlinux.binしかない場合は、mkimageへのパスが通っていないので、本章の最初の部分を見てmkimageを使えるようにしておいてください。
いろいろなエラー
Initramfsの指定をしていない場合
xilinx_spi 40a40000.spi: at 0x40A40000 mapped to 0xf0080000, irq=3
xilinx_emaclite 40e00000.ethernet: Device Tree Probing
libphy: Xilinx Emaclite MDIO: probed
xilinx_emaclite 40e00000.ethernet: MAC address is now 02:00:00:00:10:64
xilinx_emaclite 40e00000.ethernet: Xilinx EmacLite at 0x40E00000 mapped to 0xF00A0000, irq=1
Xilinx Watchdog 41a00000.axi-timebase-wdt: Xilinx Watchdog Timer at f00c0000 with timeout 20s
TCP: cubic registered
NET: Registered protocol family 17
Key type encrypted registered
VFS: Cannot open root device "(null)" or unknown-block(0,0): error -6
Please append a correct "root=" boot option; here are the available partitions:
Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)