C言語でRaspberry Pi 3のユーザモードとカーネルモードでプログラミングを教えて!
こういった悩みにお答えします.
本記事の信頼性
- リアルタイムシステムの研究歴12年.
- 東大教員の時に,英語でOS(Linuxカーネル)の授業.
- 2012年9月~2013年8月にアメリカのノースカロライナ大学チャペルヒル校(UNC)コンピュータサイエンス学部で客員研究員として勤務.C言語でリアルタイムLinuxの研究開発.
- プログラミング歴15年以上,習得している言語: C/C++,Python,Solidity/Vyper,Java,Ruby,Go,Rust,D,HTML/CSS/JS/PHP,MATLAB,Verse(UEFN), Assembler (x64,aarch64).
- 東大教員の時に,C++言語で開発した「LLVMコンパイラの拡張」,C言語で開発した独自のリアルタイムOS「Mcube Kernel」をGitHubにオープンソースとして公開.
- 2020年1月~現在はアメリカのノースカロライナ州チャペルヒルにあるGuarantee Happiness LLCのCTOとしてECサイト開発やWeb/SNSマーケティングの業務.2022年6月~現在はアメリカのノースカロライナ州チャペルヒルにあるJapanese Tar Heel, Inc.のCEO兼CTO.
- 最近は自然言語処理AIとイーサリアムに関する有益な情報発信に従事.
- (AI全般を含む)自然言語処理AIの論文の日本語訳や,AIチャットボット(ChatGPT,Auto-GPT,Gemini(旧Bard)など)の記事を50本以上執筆.アメリカのサンフランシスコ(広義のシリコンバレー)の会社でプロンプトエンジニア・マネージャー・Quality Assurance(QA)の業務委託の経験あり.
- (スマートコントラクトのプログラミングを含む)イーサリアムや仮想通貨全般の記事を200本以上執筆.イギリスのロンドンの会社で仮想通貨の英語の記事を日本語に翻訳する業務委託の経験あり.
こういった私から学べます.
C言語を独学で習得することは難しいです.
私にC言語の無料相談をしたいあなたは,公式LINE「ChishiroのC言語」の友だち追加をお願い致します.
私のキャパシティもあり,一定数に達したら終了しますので,今すぐ追加しましょう!
独学が難しいあなたは,元東大教員がおすすめするC言語を学べるオンラインプログラミングスクール5社で自分に合うスクールを見つけましょう.後悔はさせません!
目次
Raspberry Pi 3(ラズパイ3)
Raspberry Pi 3(ラズパイ3)とは,イギリスのラズベリーパイ財団により開発されているARM64(AARCH64)プロセッサを搭載したシングルボードコンピュータです.
Raspberry Piシリーズは2022年2月28日時点で累計4,600万台以上売れていて,世界中で使われています.
Raspberry PiはIoT・組込みボードのデファクトスタンダード(事実上の標準)と言えるでしょう.
Raspberry Pi 3のエミュレータ「QEMU」
Raspberry Pi 3の代表的なエミュレータは,QEMU(キューエム)です.
QEMUを利用すると,Raspberry Pi 3の実機を使わないでコードを書いて実行できます.
つまり,Raspberry Pi 3の実機でプログラムを実行する毎に転送したり,電源をON/OFFしたりする手間を減らせます.
電源のON/OFFを頻繁にするとRaspberry Pi 3の実機が壊れる可能性があるので,実機で実行する必要がある時以外はQEMUで開発することをおすすめします.
QEMUはRaspberry Pi 3のユーザモードとカーネルモードの両方をサポートしています.
Ubuntu 22.04 LTSでQEMUをインストールするためには,以下のコマンドを実行します.
1 |
$ sudo apt-get install qemu qemu-user qemu-user-static qemu-system |
インストールされるQEMUバージョンは6.2.0です.
※QEMUのバージョン2.12.0以降でRaspberry Pi 3をサポートしています.
Raspberry Pi 3でC言語のプログラミング
それでは,Raspberry Pi 3でC言語のプログラミングをしましょう.
具体的には,"Hello World"を表示します.
"Hello World"を表示するコードは以下になります.
1 2 3 4 5 6 7 8 9 10 11 |
/* * Author: Hiroyuki Chishiro * License: 2-Clause BSD */ #include <stdio.h> int main(void) { printf("Hello World!\n"); return 0; } |
Intel 64ビットCPUのユーザモードで実行
Intel 64ビットCPU(ホストマシン)のユーザモードで実行します.
もちろん正常に動作しました.
1 2 3 |
$ gcc hello_world.c $ a.out Hello World! |
ARM64(AARCH64)用のクロスコンパイラ「aarch64-linux-gnu-gcc」のインストール
ARM64(AARCH64)用のクロスコンパイラ「aarch64-linux-gnu-gcc」をインストールします.
以下のコマンドを実行します.
1 |
$ sudo apt-get install gcc-aarch64-linux-gnu |
ARM64のユーザモードで実行
ARM64のユーザモードで実行します.
Raspberry Pi 3のボード依存ではなく,ARM64なら何でも実行できます.
静的リンクと動的リンクの両方の方法を解説していきます.
静的リンクで実行
静的リンクで実行するためには,コンパイル時に-staticオプションを入れます.
※-staticオプションはライブラリを静的リンクするという意味です.
qemu-user-staticをインストールした時にbinfmtの設定を行うので,ARM64のELFオブジェクトを実行する時に自動的にARM64のユーザモードのエミュレータqemu-aarch64-staticを経由して実行します.
1 2 3 |
$ aarch64-linux-gnu-gcc hello_world.c -static $ a.out Hello World! |
つまり,以下のようにqemu-aarch64-staticコマンドを明示的に実行する場合と同じです.
1 2 |
$ qemu-aarch64-static a.out Hello World! |
動的リンクで実行
動的リンク(-staticオプションなし)で実行すると,正常に動作しません.
1 2 3 |
$ aarch64-linux-gnu-gcc hello_world.c $ a.out /lib/ld-linux-aarch64.so.1: No such file or directory |
動的リンクのライブラリファイル/lib/ld-linux-aarch64.so.1がないというエラーが発生しています.
この理由は,/lib/以下はIntel 64ビットCPU(ホストマシン)の動的リンクのライブラリファイルがあるためです.
※Intel 64ビットCPU用の動的リンクのライブラリファイル/lib/ld-linux.so.2はあります.
/lib/ld-linux-aarch64.so.1は/usr/aarch64-linux-gnu/以下にあるので,ARM64用の動的リンクのライブラリファイルを見つけるためには,環境変数QEMU_LD_PREFIXに「/usr/aarch64-linux-gnu/」を設定してから実行します.
以下のように設定すると正常に動作しました.
1 2 3 |
$ export QEMU_LD_PREFIX=/usr/aarch64-linux-gnu/ $ a.out Hello World! |
こちらもqemu-aarch64コマンドを明示的に実行する場合と同じです.
1 2 |
$ qemu-aarch64 a.out Hello World! |
ARM64のカーネルモード(Raspberry Pi 3のベアメタル)で実行
ARM64のカーネルモード(Raspberry Pi 3のベアメタル)で実行します.
UARTで"Hello World"を出力するコード一式をこちらからダウンロードして下さい.
raspberry-pi-3.zipの中身は以下になります.
- Makefile:ビルド用のMakefile
- aarch64-elf.ld:ARM64用のリンカスクリプト
- include/:ヘッダファイル一式
- src/:コードファイル一式
コードは複雑なので解説は省略します.興味があれば読み解いて下さい!
以下のコマンドで解凍してARM64のカーネルモードのプログラムをQEMUで実行します.
1 2 3 4 5 6 7 8 |
$ unzip raspberry-pi-3.zip $ cd raspberry-pi-3 $ make ... $ make run Hello World! QEMU: Terminated # Ctrl + a,xでQEMU終了 $ |
QEMUを終了するためには,Ctrl + a,xを入力します.
他のQEMUのショートカットはKeys in the character backend multiplexerを参照して下さい.
Raspberry Pi 3でC言語を学習できるGitHubリポジトリ
Raspberry Pi 3でC言語を学習できるGitHubリポジトリは以下になります.
ベアメタルプログラミングやOS開発という中級者~上級者向けの内容です.
- Bare Metal Programming on Raspberry Pi 3
- Learning operating system development using Linux kernel and Raspberry Pi
Raspberry Pi 3の実機でプログラミングする時は,必要なパーツを購入するのを忘れないために,セットで購入することをおすすめします.
Raspberry Pi 3のCPU(ARMv8-A)やボードのマニュアル
Raspberry Pi 3のCPU(ARMv8-A)やボードのマニュアルです.
- Bare-metal Boot Code for ARMv8-A Processors
- ARM Architecture Reference Manual
- Raspberry Pi Documentation Processors
- Mailbox property interface
まとめ
Raspberry Pi 3でC言語をプログラミングする方法を紹介しました.
具体的には,Raspberry Pi 3に対応しているエミュレータのQEMUで,ユーザモードとカーネルモードの両方で"Hello World"を出力するプログラムを実行しました.
QEMUを利用するとお手軽にRaspberry Pi 3用のコードが書けて便利ですので,使いこなしましょう.
Raspberry Pi 3でC言語をプログラミングする方法を知りたいあなたはこちらからどうぞ.
C言語を独学で習得することは難しいです.
私にC言語の無料相談をしたいあなたは,公式LINE「ChishiroのC言語」の友だち追加をお願い致します.
私のキャパシティもあり,一定数に達したら終了しますので,今すぐ追加しましょう!
独学が難しいあなたは,元東大教員がおすすめするC言語を学べるオンラインプログラミングスクール5社で自分に合うスクールを見つけましょう.後悔はさせません!