Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
KernelVM式 nommu Linux入門/introduce of nommu Linu...
Search
Toshifumi NISHINAGA
July 22, 2017
Programming
2
1.5k
KernelVM式 nommu Linux入門/introduce of nommu Linux for KernelVM
2017年7月22日にKernelVM@東京13で発表した資料です。
STM32F746-discoveryマイコンボードでLinuxを動かす方法を紹介します。
Toshifumi NISHINAGA
July 22, 2017
Tweet
Share
More Decks by Toshifumi NISHINAGA
See All by Toshifumi NISHINAGA
BareMetalで遊ぶRaspberry Pi 5 PCIe編/KernelVM Tokyo17
tnishinaga
0
1.8k
probe-rsの紹介と最近の貢献紹介/CELF-02-03
tnishinaga
1
370
SecurityCamp2023基板作るコース講義資料/Security Camp 2023 Lecture Materials
tnishinaga
8
2.5k
RP2040のPIOを使う話/KernelVM Hokuriku 6
tnishinaga
3
1.3k
JTAGでArmプロセッサをデバッグする方法のつづき/KernelVM_Tokyo16
tnishinaga
0
400
CMSIS-DAPの概要と使い方/KernelVM Online5
tnishinaga
0
1.7k
JTAGでarmプロセッサをデバッグする話/KernelVM Online4
tnishinaga
4
3.1k
ARM入門/arm introduction
tnishinaga
15
12k
俺の仮想マシンルーターがこんなに遅いはずはない/ KernelVM online 1
tnishinaga
0
2.8k
Other Decks in Programming
See All in Programming
shadcn/uiを使ってReactでの開発を加速させよう!
lef237
0
300
traP の部内 ISUCON とそれを支えるポータル / PISCON Portal
ikura_hamu
0
180
Package Traits
ikesyo
1
210
VisionProで部屋の明るさを反映させるシェーダーを作った話
segur
0
100
PHPとAPI Platformで作る本格的なWeb APIアプリケーション(入門編) / phpcon 2024 Intro to API Platform
ttskch
0
390
Fibonacci Function Gallery - Part 2
philipschwarz
PRO
0
210
2025.01.17_Sansan × DMM.swift
riofujimon
2
540
生成AIでGitHubソースコード取得して仕様書を作成
shukob
0
630
ErdMap: Thinking about a map for Rails applications
makicamel
1
610
技術的負債と向き合うカイゼン活動を1年続けて分かった "持続可能" なプロダクト開発
yuichiro_serita
0
300
はてなにおけるfujiwara-wareの活用やecspressoのCI/CD構成 / Fujiwara Tech Conference 2025
cohalz
3
2.7k
PHPで学ぶプログラミングの教訓 / Lessons in Programming Learned through PHP
nrslib
4
1.1k
Featured
See All Featured
Stop Working from a Prison Cell
hatefulcrawdad
267
20k
Designing for Performance
lara
604
68k
Side Projects
sachag
452
42k
GraphQLの誤解/rethinking-graphql
sonatard
68
10k
GraphQLとの向き合い方2022年版
quramy
44
13k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
3
180
What's in a price? How to price your products and services
michaelherold
244
12k
Designing for humans not robots
tammielis
250
25k
Music & Morning Musume
bryan
46
6.3k
BBQ
matthewcrist
85
9.4k
A designer walks into a library…
pauljervisheath
205
24k
Building Adaptive Systems
keathley
38
2.4k
Transcript
Kernel/VM式 ARMマイコン入門 Toshifumi NISHINAGA
Kernel/VM式 nommu Linux入門 Toshifumi NISHINAGA
$ who @tnishinaga
一般的なLinuxの動くARM board
Linuxなどの現代の一般的なOSは 仮想メモリを必要とするため、 仮想メモリ制御を行う Memory Management Unit(MMU) が必要
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 用途 スマートフォン等 のプロセッサ リアルタイム 機器用 マイコン
しかし、世の中にはマイコンで Linuxを動かしたい人が居る Cortex-A Cortex-R Cortex-M CPU Clock 数百MHz 〜 数GHz
よくしらない 数MHz 〜 数百MHz RAM 数百MB 〜 数GB よくしらない 数KB 〜 数MB MMU/MPU MMU MPU MPU 用途 スマートフォン等 のプロセッサ リアルタイム 機器用 マイコン
nommu Linux
mmuの無いプロセッサで動くLinux
マイコンで動くLinux
STM32F746G discovery board
• STM32F746NG ◦ Cortex-M7 ◦ 200MHz CPU clock ◦ 7-stage
pipeline ◦ Superscalar ◦ I&D cache available ◦ 1MB Flash
つよいCPU + 8MB SDRAM
= Linuxが動く
どうやって起動するか
ブートに必要なもの ブートローダー Linux Kernel (+ device tree blob) rootfs
ブートローダー 役割: • SDRAMの有効化 • SDRAMへのカーネル読み込み • カーネルの起動
役割: • 各種ペリフェラルの初期化 • OS基本機能の初期化 • rootfsのマウント • init処理の実行 Linux
Kernel
役割: • busyboxなどの実行バイナリを提 供する rootfs
SDRAM ブートの流れ STM32F746 ROM u-boot.bin Image root.cpio
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を有効化
FITを有効化 U-Bootのビルド
U-Bootのビルド $ make CROSS_COMPILE=arm-none-eabi- -j4
U-Bootのインストール $ sudo st-flash write u-boot.bin 0x08000000 st-flashで書き込む USB
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用の設定を取得して修正していく
RAMアドレスを0xC0000000に修正 (FLASH size も0x00100000(1MiB)に修正) Linux Kernelのビルド
XIPを無効化 Linux Kernelのビルド
Linux Kernelのビルド $ ARCH=arm CROSS_COMPILE=arm-none-eabi- make -j4 Image dtbs ビルドする
rootfsの用意 $ curl http://elinux.org/images/5/51/Stm32_mini_rootfs.cpio.bz2 | bzip2 -d > rootfs.cpio Cortex-M4用のrootfsをもらってくる
(後方互換があるのでCortex-M7でも動く)
rootfsの用意 $ curl http://elinux.org/images/5/51/Stm32_mini_rootfs.cpio.bz2 | bzip2 -d > rootfs.cpio Cortex-M4用のrootfsをもらってくる
(後方互換があるのでCortex-M7でも動く) 動かなかった
rootfsの用意 buildrootを使ってrootfsを作る(要パッチ) 今パッチ作ってるので少々お待ちください…… $ make stm32f746_disco_defconfig $ make CROSS_COMPILE=arm-none-eabi- -j4
起動用イメージの用意 $ 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)を作成
起動イメージの転送 PC側でminicomを起動する $ minicom -D /dev/ttyACM0 -b 115200
起動イメージの転送
起動イメージの転送 PC側(minicom)はymodemよりFIT(*.itb)を送信 (Crtl + A, Sで開ける) U-Boot側はloadyで待受け U-Boot > loady
0xC0400000
起動イメージの転送
Linuxの起動 bootmでFITからLinux Kernelを読み込んで起動 U-Boot > bootm 0xC0400000
Demo: sl
今後の予定 • NIC使えるようにする • 画面使えるようにする • MINCS動かしてみる(?)