Slide 1

Slide 1 text

Kernel/VM式 ARMマイコン入門 Toshifumi NISHINAGA

Slide 2

Slide 2 text

Kernel/VM式 nommu Linux入門 Toshifumi NISHINAGA

Slide 3

Slide 3 text

$ who @tnishinaga

Slide 4

Slide 4 text

一般的なLinuxの動くARM board

Slide 5

Slide 5 text

Linuxなどの現代の一般的なOSは 仮想メモリを必要とするため、 仮想メモリ制御を行う Memory Management Unit(MMU) が必要

Slide 6

Slide 6 text

MMUはCortex-Aファミリにのみ搭載されている Cortex-A Cortex-R Cortex-M CPU Clock 数百MHz 〜 数GHz よくしらない 数MHz 〜 数百MHz RAM 数百MB 〜 数GB よくしらない 数KB 〜 数MB MMU/MPU MMU MPU MPU 用途 スマートフォン等 のプロセッサ リアルタイム 機器用 マイコン

Slide 7

Slide 7 text

しかし、世の中にはマイコンで Linuxを動かしたい人が居る Cortex-A Cortex-R Cortex-M CPU Clock 数百MHz 〜 数GHz よくしらない 数MHz 〜 数百MHz RAM 数百MB 〜 数GB よくしらない 数KB 〜 数MB MMU/MPU MMU MPU MPU 用途 スマートフォン等 のプロセッサ リアルタイム 機器用 マイコン

Slide 8

Slide 8 text

nommu Linux

Slide 9

Slide 9 text

mmuの無いプロセッサで動くLinux

Slide 10

Slide 10 text

マイコンで動くLinux

Slide 11

Slide 11 text

STM32F746G discovery board

Slide 12

Slide 12 text

● STM32F746NG ○ Cortex-M7 ○ 200MHz CPU clock ○ 7-stage pipeline ○ Superscalar ○ I&D cache available ○ 1MB Flash

Slide 13

Slide 13 text

つよいCPU + 8MB SDRAM

Slide 14

Slide 14 text

= Linuxが動く

Slide 15

Slide 15 text

どうやって起動するか

Slide 16

Slide 16 text

ブートに必要なもの ブートローダー Linux Kernel (+ device tree blob) rootfs

Slide 17

Slide 17 text

ブートローダー 役割: ● SDRAMの有効化 ● SDRAMへのカーネル読み込み ● カーネルの起動

Slide 18

Slide 18 text

役割: ● 各種ペリフェラルの初期化 ● OS基本機能の初期化 ● rootfsのマウント ● init処理の実行 Linux Kernel

Slide 19

Slide 19 text

役割: ● busyboxなどの実行バイナリを提 供する rootfs

Slide 20

Slide 20 text

SDRAM ブートの流れ STM32F746 ROM u-boot.bin Image root.cpio

Slide 21

Slide 21 text

U-Bootのビルド $ git git://git.denx.de/u-boot.git && cd u-boot $ curl https://gist.githubusercontent.com/tnishinaga/ea0180fc28227ad158d3092645ccb575/raw/76cbb90cf30a23 d3a59c860c7a887250b31a385b/disable_spl_stm32f7.diff | git apply U-Bootのソースをダウンロード.SPLを切るパッチを当てる $ make stm32f746-disco_defconfig $ make menuconfig STM32F746-disco用の設定からFITを有効化

Slide 22

Slide 22 text

FITを有効化 U-Bootのビルド

Slide 23

Slide 23 text

U-Bootのビルド $ make CROSS_COMPILE=arm-none-eabi- -j4

Slide 24

Slide 24 text

U-Bootのインストール $ sudo st-flash write u-boot.bin 0x08000000 st-flashで書き込む USB

Slide 25

Slide 25 text

Linux Kernelのビルド $ git clone git://git.kernel.org/pub/scm/linux/kernel/git/atorgue/stm32.git stm32-linux $ cd stm32-linux $ git checkout -b stm32-dt-for-v4.13 remotes/origin/stm32-dt-for-v4.13 ソースをダウンロード $ make ARCH=arm stm32_defconfig $ make ARCH=arm menuconfig STM32用の設定を取得して修正していく

Slide 26

Slide 26 text

RAMアドレスを0xC0000000に修正 (FLASH size も0x00100000(1MiB)に修正) Linux Kernelのビルド

Slide 27

Slide 27 text

XIPを無効化 Linux Kernelのビルド

Slide 28

Slide 28 text

Linux Kernelのビルド $ ARCH=arm CROSS_COMPILE=arm-none-eabi- make -j4 Image dtbs ビルドする

Slide 29

Slide 29 text

rootfsの用意 $ curl http://elinux.org/images/5/51/Stm32_mini_rootfs.cpio.bz2 | bzip2 -d > rootfs.cpio Cortex-M4用のrootfsをもらってくる (後方互換があるのでCortex-M7でも動く)

Slide 30

Slide 30 text

rootfsの用意 $ curl http://elinux.org/images/5/51/Stm32_mini_rootfs.cpio.bz2 | bzip2 -d > rootfs.cpio Cortex-M4用のrootfsをもらってくる (後方互換があるのでCortex-M7でも動く) 動かなかった

Slide 31

Slide 31 text

rootfsの用意 buildrootを使ってrootfsを作る(要パッチ) 今パッチ作ってるので少々お待ちください…… $ make stm32f746_disco_defconfig $ make CROSS_COMPILE=arm-none-eabi- -j4

Slide 32

Slide 32 text

起動用イメージの用意 $ curl -O https://gist.githubusercontent.com/tnishinaga/ea0180fc28227ad158d3092645ccb575/raw/cdab9f1bfd5488 d2ec180c383f0d142fb1f5200a/stm32f7_fit.its $ mkimage -f stm32f7_fit.its stm32f7_fit.itb Image Tree Souce(stm32f7_fit.its)を持ってきて Image Tree Blob(stm32f7_fit.itb)を作成

Slide 33

Slide 33 text

起動イメージの転送 PC側でminicomを起動する $ minicom -D /dev/ttyACM0 -b 115200

Slide 34

Slide 34 text

起動イメージの転送

Slide 35

Slide 35 text

起動イメージの転送 PC側(minicom)はymodemよりFIT(*.itb)を送信 (Crtl + A, Sで開ける) U-Boot側はloadyで待受け U-Boot > loady 0xC0400000

Slide 36

Slide 36 text

起動イメージの転送

Slide 37

Slide 37 text

Linuxの起動 bootmでFITからLinux Kernelを読み込んで起動 U-Boot > bootm 0xC0400000

Slide 38

Slide 38 text

Demo: sl

Slide 39

Slide 39 text

今後の予定 ● NIC使えるようにする ● 画面使えるようにする ● MINCS動かしてみる(?)