C LANGUAGE TECHNOLOGY

【C言語】Raspberry Pi 3のユーザモードとカーネルモードでプログラミング【QEMUを利用】

2021年6月15日

悩んでいる人
悩んでいる人

C言語でRaspberry Pi 3のユーザモードとカーネルモードでプログラミングを教えて!

こういった悩みにお答えします.

本記事の信頼性

  • リアルタイムシステムの研究歴12年.
  • 東大教員の時に,英語でOS(Linuxカーネル)の授業.
  • 2012年9月~2013年8月にアメリカのノースカロライナ大学チャペルヒル校(UNC)コンピュータサイエンス学部で客員研究員として勤務.C言語でリアルタイムLinuxの研究開発.
  • プログラミング歴15年以上,習得している言語: C/C++PythonSolidity/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イーサリアムに関する有益な情報発信や,Unreal Editor for Fortnite(UEFN)でゲーム開発に従事.
    • (AI全般を含む)自然言語処理AIの論文の日本語訳や,AIチャットボット(ChatGPT,Auto-GPT,Gemini(旧Bard)など)の記事を50本以上執筆.アメリカのサンフランシスコ(広義のシリコンバレー)の会社でChatGPT/Geminiを訓練するプロンプトエンジニア・マネージャー・Quality Assurance(QA)の業務委託の経験あり.
    • (スマートコントラクトのプログラミングを含む)イーサリアムや仮想通貨全般の記事を200本以上執筆.イギリスのロンドンの会社で仮想通貨の英語の記事を日本語に翻訳する業務委託の経験あり.
    • UEFNで10本以上のゲームを開発し,フォートナイト上で公開(FortniteFortnite.GG).

こういった私から学べます.

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をインストールするためには,以下のコマンドを実行します.

インストールされるQEMUバージョンは6.2.0です.

※QEMUのバージョン2.12.0以降でRaspberry Pi 3をサポートしています.

Raspberry Pi 3でC言語のプログラミング

それでは,Raspberry Pi 3でC言語のプログラミングをしましょう.

具体的には,"Hello World"を表示します.

"Hello World"を表示するコードは以下になります.

Intel 64ビットCPUのユーザモードで実行

Intel 64ビットCPU(ホストマシン)のユーザモードで実行します.

もちろん正常に動作しました.

ARM64(AARCH64)用のクロスコンパイラ「aarch64-linux-gnu-gcc」のインストール

ARM64(AARCH64)用のクロスコンパイラ「aarch64-linux-gnu-gcc」をインストールします.

以下のコマンドを実行します.

ARM64のユーザモードで実行

ARM64のユーザモードで実行します.

Raspberry Pi 3のボード依存ではなく,ARM64なら何でも実行できます.

静的リンクと動的リンクの両方の方法を解説していきます.

静的リンクで実行

静的リンクで実行するためには,コンパイル時に-staticオプションを入れます.

※-staticオプションはライブラリを静的リンクするという意味です.

qemu-user-staticをインストールした時にbinfmtの設定を行うので,ARM64のELFオブジェクトを実行する時に自動的にARM64のユーザモードのエミュレータqemu-aarch64-staticを経由して実行します.

つまり,以下のようにqemu-aarch64-staticコマンドを明示的に実行する場合と同じです.

動的リンクで実行

動的リンク(-staticオプションなし)で実行すると,正常に動作しません.

動的リンクのライブラリファイル/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/」を設定してから実行します.

以下のように設定すると正常に動作しました.

こちらもqemu-aarch64コマンドを明示的に実行する場合と同じです.

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で実行します.

QEMUを終了するためには,Ctrl + a,xを入力します.

他のQEMUのショートカットはKeys in the character backend multiplexerを参照して下さい.

Raspberry Pi 3でC言語を学習できるGitHubリポジトリ

Raspberry Pi 3でC言語を学習できるGitHubリポジトリは以下になります.

ベアメタルプログラミングやOS開発という中級者~上級者向けの内容です.

Raspberry Pi 3の実機でプログラミングする時は,必要なパーツを購入するのを忘れないために,セットで購入することをおすすめします.


Raspberry Pi 3のCPU(ARMv8-A)やボードのマニュアル

Raspberry Pi 3のCPU(ARMv8-A)やボードのマニュアルです.

まとめ

Raspberry Pi 3でC言語をプログラミングする方法を紹介しました.

具体的には,Raspberry Pi 3に対応しているエミュレータのQEMUで,ユーザモードとカーネルモードの両方で"Hello World"を出力するプログラムを実行しました.

QEMUを利用するとお手軽にRaspberry Pi 3用のコードが書けて便利ですので,使いこなしましょう.

Raspberry Pi 3でC言語をプログラミングする方法を知りたいあなたはこちらからどうぞ.

C言語 ラズパイ4
【C言語】Raspberry Pi 4のユーザモードとカーネルモードでプログラミング【QEMUを利用】

こういった悩みにお答えします. こういった私から学べます. Raspberry Pi 4(ラズパイ4) Raspberry Pi 4(ラズパイ4)とは,イギリスのラズベリーパイ財団により開発されている ...

続きを見る

C言語を独学で習得することは難しいです.

私にC言語の無料相談をしたいあなたは,公式LINE「ChishiroのC言語」の友だち追加をお願い致します.

私のキャパシティもあり,一定数に達したら終了しますので,今すぐ追加しましょう!

友だち追加

独学が難しいあなたは,元東大教員がおすすめするC言語を学べるオンラインプログラミングスクール5社で自分に合うスクールを見つけましょう.後悔はさせません!

-C LANGUAGE, TECHNOLOGY
-, , , , , , , , ,