2024.12.19
システムの穴を運用でカバーしようとしてミス多発… バグが大量発生、決算が合わない状態から業務効率化を実現するまで
リンクをコピー
記事をブックマーク
金津穂氏(以下、金津):「AArch64とOS入門」ということで金津が発表いたします。
はじめにですが、「これからArmでOSを自作したい!」という人向けのまとめ資料になります。なので、すでにArmでお仕事している人、とくに組み込み向けだったりとかすでにOS開発とかしている人にとってはもう既知の情報しかない。あと、リファレンスマニュアルを自分で読める人にとっては、それを読んだほうが確実な情報が手に入るんじゃないかなと思います。
Armと題してますけど、基本的にはAArch64だけにします。AArch32はちょっと面倒くさいので触りません。Cortex-MなどのMシリーズはまた別の機会ということで、今回はAシリーズ、これを発表していきます。
まず私、orumin。Twitter「kotatsu_mi」でやっています。主にunikernelとか仮想化とかをやってて、博士学生です。
では始めていきます。まずOSに必要なプロセッサーの機能とは何でしょうか?
OSの中でも、モダンなOSに求められる必須要素というものが存在すると思います。最近は、WindowsだったりLinuxだったりMacといったモダンなデスクトップOS、あるいは組み込みでもモダンなOSが多いと思いますが、こういったものではマルチタスクやメモリ保護、そして計算資源の抽象化や多重化といったものが前提となっています。
今回は、この中でもマルチタスクやメモリ保護について主にフィーチャーしていこうかと思います。ということで、主にマルチタスクに必要な割り込みやコンテキスト退避、メモリ保護に必要なMMU、これに絞って説明をしていきたいと思います。
まず本題に入る前に……。みなさんArmの名前、いつも混乱していると思います。先ほどtnishinagaさんにもいろいろと説明してもらいましたが、一度おさらいしておくと、ArmはArm社のプロセッサーということで、もともとはイギリスのAcornという会社が作っていた、Acorn RISC Machinesという特定のAcorn社のPC向けのプロセッサーでした。
そのあとAdvanced RISC Machines、ARM Ltd.、Arm Holdings plcと主体が変遷してて、現在Arm Holdingsはソフトバンクが買収しています。もともとArmはすべて大文字「ARM」でしたが、現在、先頭のAだけ大文字の「Arm」というのが正式名称です。
また、64-bit Armのアーキテクチャ名は基本的に「AArch64」で、「Arm64」というのはGNUがreferして使っている名前です。「Intel 64」が正式名称でありながら、GNU、GCCだと「x86-64」のほうを使うのと同じような理由です。
AArch64では先ほどtnishinagaさんが説明したようにA64。AArch32ではA32とT32の命令セットが利用できます。
商標のページを見てても、記事タイトルとかですべて大文字にするような何か必要性がないかぎりは、基本的には不適切な大文字化は避けよと書かれています。
では本題です。まずArmの実行モデルについて話していこうと思います。これからは、基本的にはIntel 64のCPUプロセッサーと比較して話していきます。
まずIntel。みなさん知っているかと思いますが、Intelはリング(Ring)といったものを使って実行権限を分離しています。Ring 0・1・2・3がありまして、Ring 0が特権モード、いわゆるOSカーネルを動作させるモードで、Ring 3がみんなが使っているブラウザなどのアプリケーションです。
Ring 1・2は、本当はOSのドライバとかをよりRing 0よりも小さな権限で実行することでセキュリティを担保する、そういった理由で作られているのですが、実際のところ誰も使っていません。
というのも、基本的には特権モードが多すぎるとOSをそれに特化させて実装しなければいけないんですが、x86-64だけで動くPCなどではそれでいいんですけど、Windows NTだったりLinuxだったり複数のアーキテクチャで動く必要のあるものは、基本的には2つのモードがあったとしてもRing1・Ring2といったものは存在しないため、それらは使わないことになってしまって、実質2モードしかないことになっています。
一方、Armを見てみましょう。ArmではRingではなくて、Exception Level(例外レベル)という名前で実行モードを分けています。Intelと違って、数字の若いほうから権限が弱くなっていて、数字の大きいほうが権限が一番強くなっています。0から順番にUser、OS、Hypervisor、そしてSecure Monitorとなっていまして、Secure Monitorというのは基本的にTrustZoneなどのセキュアOSで実行するものになっています。
TrustZoneについては後ほど説明があると思うので、今回は省こうと思います。Hypervisorについても、ぬるぽへさんがあとでしゃべると思うので、今回の資料では、EL0とEL1、この2つのモードに絞って説明していこうと思います。
その前に、いちど、AArch32の実行モデルを説明していこうと思います。先ほどException Levelという話をしましたが、こちらの図のException Level 1のところにService Call(svc)・Abort(abt)・IRQ(irq)・FIQ(fiq)・Undefined(und)・System(sys)、これら6つモードが書いてあります。
これはどういうことかと言いますと、もともとAArch32・ARMv7では7つCPUの動作モードがありまして、特権モードは7つのモードのうちの6つ、1つUserモードだけ非特権モードになっており、それぞれモードによって汎用レジスタがバンク切り替えすることによっていろいろなモードを切り替えて実行する、そういったことになっていました。
実はAArch64でもAArch32モードに切り替えることができるので、途中でそのモードに……6つのモードを意識した状態で実行することも可能なのですが、今回の発表ではそこはなるべく触れないようにしていきます。ですが、たまに古いOSの実装とか読むときには、これも必要となってくるので、頭の片隅に置いておくと何か役に立つかもしれません。
AArch64の割り込みについてです。AArch64はAArch32と違って、いくつかレジスタとか増やしていて、基本的に割り込みに関係するのはここらへんのレジスタになります。
まずPSTATE。これは条件フラグとか現在の例外レベルといった状態を記憶しておきます。例外が実際に発生したときには、SPSRというレジスタにPSTATEを保存して退避して、別の例外レベルにジャンプします。SPSRは例外レベルごとに1〜3まで3つ別々に存在しているため、例えばOSの中でHypervisor Call(HVC)を発行したら、そのときのPSTATEをまたSPSR_EL2に保存してといったかたちで、順番にジャンプすることが可能です。
そしてリンクレジスタ(LR)。これは先ほど説明がありましたね。サブルーチンからのリターンアドレスを記憶しますが、例外リンクレジスタというELRというものも存在します。これは例外からのリターンアドレスを記憶するもので、リンクレジスタと基本的に使い方は同じですが、例外のハンドリングのときに使用します。
次にベクタテーブルを見ていきます。AArch64はベクタテーブルを割り込みレベルEL1〜3それぞれ別々に持っていて、それぞれVBAR_ELnというアドレスからのオフセットでアクセスできます。
例えばVBAR_ELnがcurrent ELをSP0でとか書いてありますけど、これはどういうことかといいますと、例えばOS、EL1の中でもう一度OSの割り込みが発生するNested IRQが起きたときに同じ例外レベルでハンドリングすることになったら、SP0を使ってそのまままた例外に返ってくる。そのときの例外の種類によってIRQだったりFIQだったりSErrorだったりとかで、それぞれ0x080、0x100、0x180などにジャンプして、そこに登録されている例外ハンドラを実行するかたちになっています。
また、SP0だけじゃなくて、SPは例外レベルポイントごとにあったりするんですけど、SPSelというビットがあったりするので、それでSPを切り替えたりすることもできます。
より低い例外レベルに遷移したときにAArch64からAArch32に切り替えるなどもあるので、それぞれより低い例外レベルにジャンプしたときのベクタはAArch64モード版とAArch32版でそれぞれ別々に用意されていて、0x780までベクタが存在しています。
このときの割り込みのフローを実際に見てきますと、EL0 User Programで、例えばSupervisor Call(SVC)、いわゆるシステムコールを発行したらIRQが起きるので、そこでProgram Counterレジスタ(PC)を、Exception level Link Register(ELR)、例外のリンクレジスタに保存。また、現在の状態はPSTATEからSPSRに退避して、実際の割り込みを実行し始める。
割り込みのハンドラの中でまたレジスタ退避だったりとか割り込みを有効化することで、さらにnestedして別のinterruption handlerが呼ばれる。そういったこともあります。
基本的にはLRとPSTATE、PCなど使っていい感じにELの変化などでレジスタに退避できるので、けっこう便利な感じになっています。直感的だと思います。これは。
最後に割り込みについて実際のアセンブリコードを見ていきます。これは公式のドキュメントで見てみたんですけど簡単で、いっぺん壊される可能性のあるレジスタをSPに退避して、read_irq_sourceとかそういった割り込み原因を読むようなコードにブランチしてから、Cで実装されたハンドラにブランチしてまた割り込みに返ってくるみたいな素朴な実装になっています。また、ERETを使うことによって、ELRに保存したリターンアドレスを使ってもとの場所に返ってきます。
この実装の場合はSPSRやELRの退避をしていないので、nestedの割り込みをハンドルすることはできません。
(次回につづく)
2024.12.12
会議で発言しやすくなる「心理的安全性」を高めるには ファシリテーションがうまい人の3つの条件
2024.12.19
12万通りの「資格の組み合わせ」の中で厳選された60の項目 532の資格を持つ林雄次氏の新刊『資格のかけ算』の見所
2024.12.16
32歳で成績最下位から1年でトップ営業になれた理由 売るテクニックよりも大事な「あり方」
2023.03.21
民間宇宙開発で高まる「飛行機とロケットの衝突」の危機...どうやって回避する?
2024.12.10
メールのラリー回数でわかる「評価されない人」の特徴 職場での評価を下げる行動5選
2024.12.13
ファシリテーターは「しゃべらないほうがいい」理由 入山章栄氏が語る、心理的安全性の高い場を作るポイント
PR | 2024.12.20
モンスター化したExcelが、ある日突然崩壊 昭和のガス工事会社を生まれ変わらせた、起死回生のノーコード活用術
2024.12.18
「社長以外みんな儲かる給与設計」にした理由 経営者たちが語る、優秀な人材集め・会社を発展させるためのヒント
2024.12.12
今までとこれからで、エンジニアに求められる「スキル」の違い AI時代のエンジニアの未来と生存戦略のカギとは
PR | 2024.11.26
なぜ電話営業はなくならない?その要因は「属人化」 通話内容をデータ化するZoomのクラウドサービス活用術
Climbers Startup JAPAN EXPO 2024 - 秋 -
2024.11.20 - 2024.11.21
『主体的なキャリア形成』を考える~資格のかけ算について〜
2024.12.07 - 2024.12.07
Startup CTO of the year 2024
2024.11.19 - 2024.11.19
社員の力を引き出す経営戦略〜ひとり一人が自ら成長する組織づくり〜
2024.11.20 - 2024.11.20
「確率思考」で未来を見通す 事業を成功に導く意思決定 ~エビデンス・ベースド・マーケティング思考の調査分析で事業に有効な予測手法とは~
2024.11.05 - 2024.11.05