z-turn/linux kernel のビルド のバックアップ差分(No.2)

更新


  • 追加された行はこの色です。
  • 削除された行はこの色です。
[[公開メモ]]
[[電気回路]]

#contents

* VirtualBox に Debian8 を新規インストール [#v69e44c4]

** VirtualBox の作成 [#z343f177]

必要なパッケージなどを洗い出すため、まっさらから始めてみます。

ビルドに linux の開発環境が必要なので、Windows 10 64bit 上の
Oracle VM VirtualBox に Debian8 (Jessie) をインストールします。

VirtualBox マネージャの [新規] から、Debian8new という VM を作成します。
どうやら Zynq 用の arm バイナリをコンパイルするには 32 ビットライブラリが必要なので、
コンパイル環境も 32 ビットのほうが都合が良いようです。

VirtualBox マネージャの [新規] から、Debian8new という 32bit Debian の VM を作成します。

&ref(virtualbox-new.png,,66%);

- メモリ4G
- VDI形式の仮想ハードディスク可変型20G

としました。

** インストールディスクのダウンロード&マウント [#xf5ca6f2]

https://www.debian.org/CD/netinst/

の amd64 というリンクから、debian-8.7.1-amd64-netinst.iso をダウンロード。
の i386 というリンクから、debian-8.7.1-i386-netinst.iso をダウンロード。

VirtualBox "Debian8new" を右クリックし、[設定] から [ストレージ] の
[光学ディスクファイルを選択...] で上記 .iso ファイルをマウント

&ref(virtualbox-mount-iso.png,,66%);

** 起動 [#d9fe58e5]
** ネットワークの設定 [#b377b8bf]

ホスト PC の Windows10 と、VirtualBox 内の Debian8 との間のネットワーク通信のための
ネットワークアダプタを追加します。

&ref(virtualbox-hostonly-adapter.png,,66%);

** 起動&インストール [#d9fe58e5]

&ref(virtualbox-run.png,,66%);

+ [Install]
+ Select Language => [Japanese]
+ 場所の選択 => [日本]
+ キーボードの設定 => [日本語]
+ [CD の検出とマウント]
+ ネットワークの設定
+ ネットワークの設定 
-- プライマリアダプタ => [eth0] (NATアダプタ)
-- ホスト名 => [debian8new]
-- ドメイン名 => []
+ root のパスワード => [********]
+ 新しいユーザー
-- 本名 => [Osamu Takeuchi]
-- ユーザ名 => [osamu]
-- パスワード => [********]
+ パーティショニング => [ディスク全体を使う] - [return] x 3 - [YES]
+ パーティショニング => [ディスク全体を使う] - [return] x 3 - [はい]
+ アーカイブミラー => [日本]-[ftp.tsukuba.wide.ad.jp]-[]
+ パッケージ利用調査に参加しますか => [はい]
+ ソフトウェアの選択 => [SSHサーバ + 標準システムユーティリティ]
+ GRUB ブートローダのインストール => [はい]-[/dev/sda]
+ インストールの完了

デスクトップ環境は入れませんでした。

インストールディスクがアンマウントされていることを確認して続行すると再起動されます。

&ref(virtualbox-confirm-unmounted.png,,66%);

** ログイン&必須パッケージのインストール [#m935298a]

*** etckeeper, sudo, jed [#p34e33c9]

自動再起動後、コンソールからログインできることを確認し、

&ref(virtualbox-login.png,,66%);

- /etc フォルダのバージョン管理をするため etckeeper を入れます。
- 設定ファイルの編集用に sudo および jed エディタを入れます。
- sudo グループに自分を追加します

 LANG:console
 $ export LANG=C
 $ su
  Password: (rootパスワードを入力)
 # export LANG=C
 # apt install etckeeper
  The following extra packages will be installed:
    git git-man liberror-perl rsync
  Suggested packages:
    sudo git-daemon-run git-daemon-sysvinit git-doc git-el git-email git-gui
    gitk gitweb git-arch git-cvs git-mediawiki git-svn
  The following NEW packages will be installed:
    etckeeper git git-man liberror-perl rsync
  0 upgraded, 5 newly installed, 0 to remove and 0 not upgraded.
  Need to get 5065 kB of archives.
  After this operation, 26.7 MB of additional disk space will be used.
  Do you want to continue? [Y/n]
  ...
 # apt install sudo jed
  The following extra packages will be installed:
    jed-common libonig2 libslang2-modules slsh
  Suggested packages:
    gpm
  The following NEW packages will be installed:
    jed jed-common libonig2 libslang2-modules slsh sudo
  0 upgraded, 6 newly installed, 0 to remove and 0 not upgraded.
  Need to get 1892 kB of archives.
  After this operation, 5984 kB of additional disk space will be used.
  Do you want to continue? [Y/n]
  ...
 # adduser osamu sudo
  Adding user `osamu' to group `sudo' ...
  Adding user osamu to group sudo
  Done
 # exit
 $ sudo echo ok
  
  We trust you have received the usual lecture from the local System
  Administrator. It usually boils down to these three things:
 
      #1) Respect the privacy of others.
      #2) Think before you type.
      #3) With great power comes great responsibility.
 
  [sudo] password for osamu:
  osamu is not in the sudoers file.  This incident will be reported.
 $ groups
  osamu cdrom floppy audio dip video plugdev netdev bluetooth
 $ groups osamu
  osamu: osamu cdrom floppy sudo audio dip video plugdev netdev bluetooth
 $ exit

一旦ログインしなおさないと、グループ設定は反映されないみたい。

*** sshd on eth1 [#ma005734]

以下、再ログイン後、

 LANG:console
 $ export LANG=C
 $ groups
  osamu cdrom floppy sudo audio dip video plugdev netdev bluetooth
 $ sudo ifconfig
  [sudo] password for osamu:
  eth0     ...
           ...
 
  lo       ...
           ...
 
 $ sudo jed /etc/network/interfaces
  + allow-hotplug eth1
  + iface eth1_inet dhcp
 $ sudo service networking restart
 $ sudo service networking restart  # なぜか2回必要?
 $ sudo ifconfig eth1
  eth1     ...
           inet addr:192.168.56.103
           ...

これで 192.168.56.103 に ssh 接続が可能になった

以下、PuTTY で ssh 接続して続行する。

* クロスコンパイル環境の整備 [#z71faab4]

** ツールのインストール [#x6200f1a]

http://blog.kmckk.com/archives/4777624.html を見ながら

 LANG:console
 ### 基本的な開発環境(git と make など)
 $ sudo apt-get install git-core build-essential
 ### make menuconfig のため
 $ sudo apt-get install ncurses-dev
 ### uImage を作成するため
 $ sudo apt-get install u-boot-tools

** arm アーキテクチャの確認 [#ue15614b]

https://www.debian.org/releases/stable/armel/release-notes/ch-whats-new.ja.html
> - ARM EABI ('armel')
> - ARMv7 (EABI 浮動小数点ハードウェア ABI, 'armhf') 

https://japan.xilinx.com/support/documentation/data_sheets/j_ds190-Zynq-7000-Overview.pdf
> *Zynq‐7000 All Programmable SoC
> - ARM Cortex ‐ A9 ベース
> -- ARMv7-A アーキテクチャ
> -- 単精度および倍精度のベクター浮動小数点ユニット (VFPU)

** 実機の gcc バージョンを確認 [#ya3bf49d]

z-turn 付属の SD カードから立ち上げて、

 # gcc -v
  Using built-in specs.
  COLLECT_GCC=gcc
  COLLECT_LTO_WRAPPER=/usr/lib/gcc/arm-linux-gnueabihf/4.6/lto-wrapper
  Target: arm-linux-gnueabihf
  Configured with: ../src/configure -v --with-pkgversion='Ubuntu/Linaro 4.6.3-1ubuntu5' 
    --with-bugurl=file:///usr/share/doc/gcc-4.6/README.Bugs 
    --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.6 
    --enable-shared --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib 
    --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.6 
    --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug 
    --enable-libstdcxx-time=yes --enable-gnu-unique-object --enable-plugin --enable-objc-gc 
    --enable-multilib --disable-sjlj-exceptions --with-arch=armv7-a --with-float=hard 
    --with-fpu=vfpv3-d16 --with-mode=thumb --disable-werror --enable-checking=release 
    --build=arm-linux-gnueabihf --host=arm-linux-gnueabihf --target=arm-linux-gnueabihf
  Thread model: posix
  gcc version 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5)
 $ uname -a
  Linux localhost.localdomain 3.15.0-xilinx #9 SMP PREEMPT Tue May 26 17:26:14 CST 2015 armv7l armv7l armv7l GNU/Linux

armv7l とか armv7-a というアーキテクチャはどこで定義されているのだろう?

gcc は arm-linux-gnueabihf-gcc なので、armhf のものを使えばいいようだ。

** emdebian.org を apt のソースに指定 [#ad3822fc]

以下、http://qiita.com/myahal@github/items/fc332e53713df244518f を見ながら

 LANG:console
 $ jed /etc/apt/sources.list.d/crosstools.list
  + deb http://emdebian.org/tools/debian/ jessie main
 $ curl http://emdebian.org/tools/debian/emdebian-toolchain-archive.key | sudo apt-key add -
  -bash: curl: コマンドが見つかりません
  gpg: 有効なOpenPGPデータが見つかりません。
 $ sudo apt install curl
 $ curl http://emdebian.org/tools/debian/emdebian-toolchain-archive.key | sudo apt-key add -

** crossbuild-essential-armhf をインストール [#m990b6ea]

 LANG:console
 $ sudo dpkg --add-architecture armhf
 $ sudo apt-get update
 $ sudo apt-get install crossbuild-essential-armhf
  提案パッケージ:
    binutils-doc gcc-4.9-locales binutils-multiarch gcc-4.9-doc libstdc++6-4.9-dbg:armhf libgcc1-dbg:armhf
    libgomp1-dbg:armhf libitm1-dbg:armhf libatomic1-dbg:armhf libasan1-dbg:armhf liblsan0-dbg:armhf
    libtsan0-dbg:armhf libubsan0-dbg:armhf libcilkrts5-dbg:armhf libquadmath-dbg:armhf glibc-doc:armhf locales:armhf
    manpages-dev:armhf libstdc++-4.9-doc:armhf libyaml-shell-perl
 $ arm-linux-gnueabihf-gcc --version
  arm-linux-gnueabihf-gcc ( 4.9.2-10) 4.9.2
  Copyright (C) 2014 Free Software Foundation, Inc.
  This is free software; see the source for copying conditions.  There is NO
  warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

** 適当なソースをコンパイル [#f74d58d8]

 LANG:console
 $ mkdir arm-hello
 $ cd arm-hello
 $ cat > hello.c
  #include <stdio.h>
  void main()
  {
    puts("Hello world!");
  }
 $ arm-linux-gnueabihf-gcc hello.c -o hello
 $ file hello
  a.out: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-armhf.so.3, for GNU/Linux 2.6.32, BuildID[sha1]=94a2aefddb7ebe7a244405372693ca3758564470, not stripped

** エミュレータで動かす [#w38ca88a]

 LANG:console
 $ sudo apt-get install qemu-user-static
 $ qemu-arm-static ./hello
  Hello world!

** 実機で動かす [#q5e9c78b]

SD カードにコピーして z-turn board で動かす

 LANG:console
 # lsblk
  NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
  mmcblk0     179:0    0   7.4G  0 disk
  |-mmcblk0p1 179:1    0    64M  0 part
  `-mmcblk0p2 179:2    0   7.4G  0 part /
  mtdblock0    31:0    0   512K  0 disk
  mtdblock1    31:1    0   128K  0 disk
  mtdblock2    31:2    0   4.4M  0 disk
  mtdblock3    31:3    0   4.5M  0 disk
  mtdblock4    31:4    0    64K  0 disk
  mtdblock5    31:5    0     6M  0 disk
  mtdblock6    31:6    0   448K  0 disk
 # mount /dev/mmcblk0p1 /media/BOOT
  media-BOOT.mount
 # cp -r /media/BOOT/arm-hello .
 # cd arm-hello/
 # file hello
  hello: ELF 32-bit LSB  executable, ARM, EABI5 version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=94a2aefddb7ebe7a244405372693ca3758564470, not stripped
 # ./hello
  Hello world!

ちゃんと動いた!

* Xilinx Linux for Zynq AP SoC のビルド [#of5e33a1]

最新ソースファイルから uImage をビルドする。

http://blog.kmckk.com/archives/4777624.html を見ながら

 LANG:console
 $ git clone https://github.com/Xilinx/linux-xlnx.git
 $ git checkout xilinx-v2016.4
 $ export CROSS_COMPILE=arm-linux-gnueabihf-
 $ make ARCH=arm xilinx_zynq_defconfig
 $ make ARCH=arm menuconfig
  メニュー形式でカーネル設定を変更可能
    Device Drivers --->
      Userspace I/O drivers --->
        <*> Userspace I/O platform driver with generic IRQ handling
        <*> Xilinx AXI Performance Monitor driver
  を確認(初めからマークされているはず)
 $ make ARCH=arm UIMAGE_LOADADDR=0x8000 uImage
    ...
    LD      arch/arm/boot/compressed/vmlinux
    OBJCOPY arch/arm/boot/zImage
    Kernel: arch/arm/boot/zImage is ready
    Kernel: arch/arm/boot/Image is ready
    Kernel: arch/arm/boot/zImage is ready
    UIMAGE  arch/arm/boot/uImage
  Image Name:   Linux-4.6.0-xilinx
  Created:      Thu Feb  2 02:05:34 2017
  Image Type:   ARM Linux Kernel Image (uncompressed)
  Data Size:    3848368 Bytes = 3758.17 kB = 3.67 MB
  Load Address: 00008000
  Entry Point:  00008000
    Image arch/arm/boot/uImage is ready
 $ ls -l arch/arm/boot/uImage
  -rw-r--r-- 1 osamu osamu 3848432  2月  2 02:05 arch/arm/boot/uImage
 $

modules もビルドする

 LANG:console
 $ make ARCH=arm modules
    ...
    Building modules, stage 2.
    MODPOST 23 modules
    CC      crypto/drbg.mod.o
    LD [M]  crypto/drbg.ko
    CC      crypto/echainiv.mod.o
    LD [M]  crypto/echainiv.ko
    CC      crypto/hmac.mod.o
    LD [M]  crypto/hmac.ko
    CC      crypto/jitterentropy_rng.mod.o
    LD [M]  crypto/jitterentropy_rng.ko
    CC      crypto/sha256_generic.mod.o
    LD [M]  crypto/sha256_generic.ko
    CC      drivers/remoteproc/mb_remoteproc.mod.o
    LD [M]  drivers/remoteproc/mb_remoteproc.ko
    CC      drivers/remoteproc/remoteproc.mod.o
    LD [M]  drivers/remoteproc/remoteproc.ko
    CC      drivers/remoteproc/zynq_remoteproc.mod.o
    LD [M]  drivers/remoteproc/zynq_remoteproc.ko
    CC      drivers/rpmsg/virtio_rpmsg_bus.mod.o
    LD [M]  drivers/rpmsg/virtio_rpmsg_bus.ko
    CC      drivers/usb/gadget/function/usb_f_mass_storage.mod.o
    LD [M]  drivers/usb/gadget/function/usb_f_mass_storage.ko
    CC      drivers/usb/gadget/function/usb_f_ss_lb.mod.o
    LD [M]  drivers/usb/gadget/function/usb_f_ss_lb.ko
    CC      drivers/usb/gadget/legacy/g_zero.mod.o
    LD [M]  drivers/usb/gadget/legacy/g_zero.ko
    CC      drivers/usb/gadget/libcomposite.mod.o
    LD [M]  drivers/usb/gadget/libcomposite.ko
    CC      drivers/virtio/virtio.mod.o
    LD [M]  drivers/virtio/virtio.ko
    CC      drivers/virtio/virtio_ring.mod.o
    LD [M]  drivers/virtio/virtio_ring.ko
    CC      fs/configfs/configfs.mod.o
    LD [M]  fs/configfs/configfs.ko
    CC      net/802/p8022.mod.o
    LD [M]  net/802/p8022.ko
    CC      net/802/psnap.mod.o
    LD [M]  net/802/psnap.ko
    CC      net/802/stp.mod.o
    LD [M]  net/802/stp.ko
    CC      net/8021q/8021q.mod.o
    LD [M]  net/8021q/8021q.ko
    CC      net/bridge/bridge.mod.o
    LD [M]  net/bridge/bridge.ko
    CC      net/ipv4/ipip.mod.o
    LD [M]  net/ipv4/ipip.ko
    CC      net/llc/llc.mod.o
    LD [M]  net/llc/llc.ko
 $ ls modules*
  modules.builtin  modules.order

uImage は BOOT 領域にコピーすればいいとして、modules はどうすれば?

実機の構成を見てみる。

 LANG:console
 # ls /lib/modules/3.15.0-xilinx/
  kernel/            modules.builtin      modules.dep.bin  modules.softdep
  modules.alias      modules.builtin.bin  modules.devname  modules.symbols
  modules.alias.bin  modules.dep          modules.order    modules.symbols.bin
 # ls /lib/modules/3.15.0-xilinx/kernel/
  crypto/  drivers/  net/
 # 

真似すればいいのかしら?

USB3.0 の SD カードリーダーに VirtualBox からアクセスできるようにするために、
https://www.virtualbox.org/wiki/Downloads から落とした VirtualBox Extension Pack 
をダブルクリックし、VirtualBox で USB3.0 が使えるようにした。

VirtualBox の USB 設定でカードリーダーを割り当てる。

&ref(virtualbox-usb-cardreader.png,,66%);

 LANG:console
 $ lsblk
  NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
  sda      8:0    0   20G  0 disk
  ├─sda1   8:1    0 19.1G  0 part /
  ├─sda2   8:2    0    1K  0 part
  └─sda5   8:5    0  880M  0 part [SWAP]
  sdf      8:80   1  7.4G  0 disk
  ├─sdf1   8:81   1   64M  0 part
  └─sdf2   8:82   1  7.4G  0 part
  sr0     11:0    1 1024M  0 rom
 $ sudo mount /dev/sdf1 /mnt
 $ ls /mnt
  7z020.bit   System Volume Information  devicetree.dtb  uImage
  7z020b.bit  arm-hello                  original        uramdisk.image.gz
  BOOT.bin    devicetree-wo-uio.dtb      uEnv.txt
 $ sudo mv /mnt/uImage /mnt/uImage-orig
 $ sudo cp arch/arm/boot/uImage /mnt
 $ sudo umount /mnt
 $ sudo mount /dev/sdf2 /mnt
 $ ls -l /mnt/lib/modules
  合計 8
  drwxrwxr-x 3 1002 1002 4096  5月 26  2015 3.15.0-xilinx
  drwxr-xr-x 4 root root 4096  1月 26 19:37 3.2.0-1498-omap4
 $ sudo mkdir /mnt/lib/modules/4.6.0-xilinx
 $ cd linux-xlnx/
 $ ls modules*
  modules.builtin  modules.order
 $ sudo cp modules* /mnt/lib/modules/4.6.0-xilinx
 $ sudo mkdir /mnt/lib/modules/4.6.0-xilinx/kernel
 $ sudo cp --parents */*.ko */*/*.ko */*/*/*.ko /mnt/lib/modules/4.6.0-xilinx/kernel/
 $ sudo umount /mnt

 LANG:console
 ...
 reading uImage
 3848432 bytes read in 245 ms (15 MiB/s)
 reading devicetree.dtb
 11172 bytes read in 15 ms (726.6 KiB/s)
 ## Booting kernel from Legacy Image at 02080000 ...
    Image Name:   Linux-4.6.0-xilinx
    Image Type:   ARM Linux Kernel Image (uncompressed)
    Data Size:    3848368 Bytes = 3.7 MiB
    Load Address: 00008000
    Entry Point:  00008000
    Verifying Checksum ... OK
 ## Flattened Device Tree blob at 02000000
    Booting using the fdt blob at 0x2000000
    Loading Kernel Image ... OK
    Loading Device Tree to 1fffa000, end 1ffffba3 ... OK
 
 Starting kernel ...

ここで止まってしまった。~
そんなに単純な話ではないみたい。

z-turn board に付属の uImage だと、

 LANG:console
 ...
 reading uImage
 3886152 bytes read in 257 ms (14.4 MiB/s)
 reading devicetree.dtb
 11172 bytes read in 15 ms (726.6 KiB/s)
 ## Booting kernel from Legacy Image at 02080000 ...
    Image Name:   Linux-3.15.0-xilinx
    Image Type:   ARM Linux Kernel Image (uncompressed)
    Data Size:    3886088 Bytes = 3.7 MiB
    Load Address: 00008000
    Entry Point:  00008000
    Verifying Checksum ... OK
 ## Flattened Device Tree blob at 02000000
    Booting using the fdt blob at 0x2000000
    Loading Kernel Image ... OK
    Loading Device Tree to 1fffa000, end 1ffffba3 ... OK
 
 Starting kernel ...
 
 Booting Linux on physical CPU 0x0
 Linux version 3.15.0-xilinx (tom@dev-server) (gcc version 4.6.1 (Sourcery CodeBench Lite 2011.09-50) ) #9 SMP PREEMPT Tue May 26 17:26:14 CST 2015
 CPU: ARMv7 Processor [413fc090] revision 0 (ARMv7), cr=18c5387d
 CPU: PIPT / VIPT nonaliasing data cache, VIPT aliasing instruction cache
 Machine model: MYIR Z-turn Development Board
 cma: CMA: reserved 128 MiB at 27800000
 Memory policy: Data cache writealloc
 PERCPU: Embedded 8 pages/cpu @e719c000 s9088 r8192 d15488 u32768
 Built 1 zonelists in Zone order, mobility grouping on.  Total pages: 195088

のようになる。

ちゃんと調べなきゃ。

* u-boot のビルド [#df085745]

http://msyksphinz.hatenablog.com/entry/2016/02/27/020000 を見ながら
- http://msyksphinz.hatenablog.com/entry/2016/02/27/020000
- http://xilinx.wikidot.com/zynq-uboot

を見ながら

https://github.com/Xilinx/u-boot-xlnx

 LANG:console
 $ git clone https://github.com/Xilinx/u-boot-xlnx.git
  Cloning into 'u-boot-xlnx'...
  remote: Counting objects: 455718, done.
  remote: Total 455718 (delta 0), reused 0 (delta 0), pack-reused 455718
  Receiving objects: 100% (455718/455718), 114.43 MiB | 5.26 MiB/s, done.
  Resolving deltas: 100% (364615/364615), done.
  Checking connectivity... done.
 $ ls
  u-boot-xlnx/
 $ cd u-boot-xlnx
 $ git tag
  ..
  xilinx-v2016.2
  xilinx-v2016.3
  xilinx-v2016.4
  xilinx_microblaze
  xilinx_pele_v2010.09
  xilinx_pre_little_endian
  zynq-beta-v2.2
 $ git co xilinx-v2016.4
 $ git checkout xilinx-v2016.4
  Note: checking out 'xilinx-v2016.4'.
  
  You are in 'detached HEAD' state. You can look around, make experimental
  changes and commit them, and you can discard any commits you make in this
  state without impacting any branches by performing another checkout.
  
  If you want to create a new branch to retain commits you create, you may
  do so (now or later) by using -b with the checkout command again. Example:
  
    git checkout -b new_branch_name
  
  HEAD is now at 0b94ce5... ARM64: zynqmp: usb1 on zcu100 is not peripheral
 $
 $ export CROSS_COMPILE=arm-linux-gnueabihf-

まだ途中。


Counter: 12849 (from 2010/06/03), today: 4, yesterday: 0