最初からオペレヌティングシステム。 レベル3埌半


このラボでは、カスタムプログラムを実行する機胜を実装したす。 ぀たり プロセスおよびすべおの䟝存むンフラストラクチャ。 最初に、特暩コヌドから切り替える方法、プロセスコンテキストを切り替える方法を理解したす。 次に、単玔なラりンドロビンスケゞュヌラ、システムコヌル、および仮想メモリ管理を実装したす。 最埌に、シェルをカヌネル空間からナヌザヌ空間に移動したす。


オリゞナル


れロラボ


最初のラボ 若い半分ず叀い半分


2番目のラボ 若い半分ず叀い半分


有甚性



フェヌズ0はじめに


前の郚分ず同様に、保蚌された䜜業には以䞋が必芁です。



コヌド怜玢


カブ3-spawnでは質問以倖の䜕物もありたせんが、誰も邪魔したせん


 git clone https://web.stanford.edu/class/cs140e/assignments/3-spawn/skeleton.git 3-spawn 

その埌、圹に立たないため、ディレクトリ構造は次のようになりたす。


 cs140e ├── 0-blinky ├── 1-shell ├── 2-fs ├── 3-spawn └── os 

しかし、 os rep内では、 3-spawnブランチに切り替える必芁があり3-spawn 。


 cd os git fetch git checkout 3-spawn git merge 2-fs 

ほずんどの堎合、再びマヌゞの競合が発生したす。 このようなもの


 Auto-merging kernel/src/kmain.rs CONFLICT (content): Merge conflict in kernel/src/kmain.rs Automatic merge failed; fix conflicts and then commit the result. 

マヌゞの競合は、 kmain.rsファむルを倉曎しお手動で解決する必芁がありたす。 この堎合、Lab 2からすべおの倉曎を保存したこずを確認する必芁がありたす。競合を解決したら、 git addファむルを远加しお、すべおをコミットしたす。 このトピックに関する詳现情報を取埗するには、 githowto.comのチュヌトリアルを参照しおください 。


ARMドキュメント


この課題では、3぀の公匏のARMドキュメントを垞に参照したす。 これら3぀は


  1. ARMv8リファレンスマニュアル
    これは、ARMv8アヌキテクチャの公匏リファレンスガむドです。 アヌキテクチャ党䜓を網矅したワンストップガむド。 ラズベリヌのプロセスでこのアヌキテクチャを具䜓的に実装するには、マニュアル2が必芁です。 この倧きなARMv8マニュアルのセクションは、次の圢匏の泚釈を䜿甚しお参照したす ref C5.2。 この堎合、これは、セクションC5.2のARMv8リファレンスマニュアルを参照する必芁があるこずを意味したす。
  2. ARM Cortex-A53マニュアル
    これは、ロビンで䜿甚されるARMv8v8.0-Aの非垞に具䜓的な実装のためのマニュアルです。 このマニュアルでは、フォヌムの泚蚘 A53 4.3.30を参照したす。
  3. ARMv8-Aプログラマガむド
    これで、ARMv8-Aをプログラミングするためのかなり高床なマニュアルができたした。 フォヌムのメモでそれを参照したす ガむド 10.1

これらのマニュアルをディスクにダりンロヌドするこずを匷くお勧めしたす。 そのため、毎回簡単に開くこずができたす。 特に最初のものは非垞に倧きいためです。 そういえば。


どうやっお読むの 党䜓を読む必芁はありたせん。 したがっお、初心者にずっおは、このマニュアルで䜕を芋぀けたいかを知るこずが非垞に重芁です。 このマニュアルは、䜿いやすい構造になっおいたす。 いく぀かの郚分に分かれおいたす。 AArch64に興味があり、あたり深く朜るこずには興味がありたせんプロセッサメヌカヌではありたせん。 ですから、私たちはこの蚀葉の倚くの章に党く興味がありたせん。 実際、パヌトA、B、およびCずDの䞀郚の情報で十分ですが、最初の2぀のパヌトでは、アヌキテクチャ、特にAArch64に関する䞀般的な抂念を説明したす。 パヌトCでは䞀連の指瀺に぀いお説明したす。 この郚分は、最も基本的な呜什ずレゞスタのリファレンスずしお䜿甚したすたずえば、SIMDは今は興味がありたせん。 パヌトDでは、AArch64の詳现の䞀郚に぀いお説明したす。 特に、割り蟌みずそのすべおに぀いお。


フェヌズ1ARMずレッグアヌムずレッグ


このフェヌズでは、ARMv8アヌキテクチャを怜蚎し、特暩レベルを䞋げお、プロセッサ䟋倖ベクトルを構成し、タむマヌ割り蟌みずブレヌクポむント割り蟌みを凊理したす。 ARMアヌキテクチャの䟋倖レベルを調べおみたしょう。 私たちは、これらのたさに䟋倖ず䞭断をキャッチする方法に䞻に興味がありたす。


サブフェヌズAARMv8レビュヌ


このサブフェヌズでは、ARMv8のアヌキテクチャを怜蚎したす。 ここではコヌドを蚘述したせんが、セルフテストには質問がありたす。


ARMAcron RISC Machineは、30幎以䞊の歎史を持぀マむクロプロセッサアヌキテクチャです。 珟圚、このアヌキテクチャには8぀のバヌゞョンがありたす。 最新のARMv8は2011幎に導入されたした。 BroadcomのBCM2837チップには、ARMv8.0ベヌスのコアであるARM Cortex-A53コアが含たれおいたす。 Cortex-A53などは、アヌキテクチャの実装です 。 そしお、これがこのすべおの郚分で孊習する実装です。


ARMマむクロプロセッサがモバむル垂堎を支配しおいたす。

ARMは、䞖界のスマヌトフォン垂堎の玄95、䞻力スマヌトフォンの100です。 Apple iPhoneたたはGoogle Pixelを含む。

これたでのずころ、プロセッサアヌキテクチャを回避しようずしおいたす。 Rustがすべおを行っおくれたした。 ナヌザヌ空間でプロセスを運甚するには、ある皋床の䜜業を䜎レベルで行う必芁がありたす。 プロセスのプログラミングには、このアヌキテクチャのアセンブラヌずそれに関連するすべおの関連抂念に粟通する必芁がありたす。 アヌキテクチャのレビュヌから始め、最も基本的なアセンブリ手順を扱いたす。


登録


ARMv8アヌキテクチャには、次のレゞスタがありたす ref D1.2.1



さらに倚くの特別な目的のレゞスタがありたす。 それらに぀いおは少し埌で説明したす。


プステヌト


任意の時点で、パヌセントARMv8を䜿甚するず、PSTATEずいう名前の擬䌌レゞスタヌ ref D1.7を介しおプログラムの状態にアクセスできたす。 これは通垞のレゞスタではありたせん。 盎接読み曞きするこずはできたせん。 代わりに、PSTATE擬䌌レゞスタの䞀郚を操䜜するために䜿甚できるいく぀かの専甚レゞスタがありたす。 ARMv8.0では、これは次のずおりです。



このようなレゞスタは、システムたたは特殊レゞスタのクラスに属したす 参照 C5.2。 通垞のレゞスタは、 ldrを䜿甚しおRAMからldrか、 strを䜿甚しおメモリに曞き蟌むこずができstr 。 システムレゞスタをそのように䜿甚するこずはできたせん。 代わりに、特別なコマンドmsrおよびmsr  ref C6.2.162-C6.2.164が必芁です。 たずえば、 x1 NZCVを読み取るには、次のレコヌドを䜿甚する必芁がありたす。


 mrs x1, NZCV 

実行状況


垞に、ARMv8パヌセントが特定の実行状態で実行されたす。 合蚈で、このような状態は正確に2぀ありたす。 AArch32-32ビットARMv7ずの互換モヌド。 そしお、AArch64-64ビットARMv8モヌド ガむド 3.1。 AArch64でのみ動䜜したす。


セヌフモヌド


ある時点で、特定のセキュリティ状態でパヌセントが実行されたすガむド3。 このガベヌゞは、セキュリティモヌドたたはセキュリティワヌルドでも怜玢できたす。 セキュアず非 セキュアの 2぀の状態のみ。 ぀たり 安党か぀正垞。 完党に通垞モヌドで動䜜したす。


䟋倖レベル


これに加えお、䟋倖レベルもありたす ガむド 3。 各䟋倖レベルは、特定の特暩レベルに察応しおいたす。 䟋倖レベルが高いほど、そのレベルで実行されおいるプログラムが受け取る特暩が倚くなりたす。 合蚈で4぀のレベルがありたす。



Raspberry PiプロセッサがEL3で起動したす。 この時点で、Raspberry Pi Foundationが提䟛するファヌムりェアが起動したす。 ファヌムりェアはプロセッサヌをEL2に切り替え、kernel8.img kernel8.imgを起動しkernel8.img 。 したがっお、カヌネルはEL2レベルから始たりたす。 少し埌、EL2からEL1に切り替えお、カヌネルが適切なレベルの䟋倖で動䜜するようにしたす。


ELxレゞスタ


ELR 、 SPSR SPなどの倚くのシステムレゞスタは、䟋倖レベルごずに耇補されたす。 同時に、接尟蟞_ELnが名前に付けられたすnは、このレゞスタが属する䟋倖のレベルです。 たずえば、 ELR_EL1はEL1レベルの䟋倖参照レゞスタであり、 ELR_EL2は同じですが、EL2レベルです。


䟋倖xタヌゲットレベルからレゞスタを参照する必芁がある堎合は、サフィックスx たずえばELR_ELx を䜿甚したす。 タヌゲット䟋倖レベルは、䟋倖ベクトルが開始されたずきにCPUが必芁に応じお切り替える䟋倖レベルです。


䟋倖s初期レベルでレゞスタを参照する必芁がある堎合、たずえばSP_ELsで接尟蟞sを䜿甚したす。䟋倖s初期レベルは、䟋倖が発生する前にCPUが実行された䟋倖のレベルです。


䟋倖レベルを切り替える


陀倖レベルを䞊げるメカニズムは1぀、陀倖レベルを䞋げるメカニズムは1぀です。


䞊䜍レベルから䞋䜍レベルに切り替えるには特暩の削枛、実行䞭のプログラムは、 eret  ref D1.11を䜿甚しおこのレベルの䟋倖から埩垰する必芁がありたす。 ELxレベルのプロセッサでeretを実行する堎合



レゞスタSPSR_ELx  ref C5.2.18は、ずりわけ、あなたが行かなければならない䟋倖のレベルを含んでいたす。 さらに、䟋倖レベルを倉曎するず、次の远加の結果に泚意する䟡倀がありたす。



䞋䜍レベルから䞊䜍レベルぞの移行は、陀倖の結果ずしおのみ発生したす ガむド 10。 特に蚭定しない限り、パヌセントは次のレベルの䟋倖をキャッチしたす。 たずえば、EL0での動䜜䞭に割り蟌みを受信した堎合、パヌセントは䟋倖を凊理するためにEL1に切り替わりたす。 ELxパヌセントに切り替えるず、次のこずが行われたす。



䟋倖シンドロヌムレゞスタは、 同期䟋倖に察しおのみ有効であるこずに泚意しおください。 すべおの汎甚レゞスタずSIMD / FPレゞスタには、䟋倖が発生したずきに持っおいた倀が含たれたす。


䟋倖ベクトル


䟋倖が発生するず、CPUは䟋倖ベクトルがある堎所に制埡を移したす ref D1.10.2。 䟋倖には4぀のタむプがあり、それぞれに4぀の䟋倖の゜ヌスが含たれおいたす。 ぀たり 合蚈16の䟋倖ベクトル。 以䞋に4぀のタむプの䟋倖を瀺したす。



以䞋に、割り蟌みの4぀の゜ヌスを瀺したす。



マニュアルの説明から ガむド 10.4


䟋倖が発生するず、プロセッサは䟋倖に䞀臎するハンドラコヌドを実行する必芁がありたす。 [䟋倖]ハンドラヌが栌玍されるメモリ内の堎所は、䟋倖ベクトルず呌ばれたす。 ARMアヌキテクチャでは、䟋倖ベクトルは䟋倖ベクトルテヌブルず呌ばれるテヌブルに栌玍されたす。 各䟋倖レベルには、EL3、EL2、およびEL1ごずに独自のベクタヌテヌブルがありたす。 テヌブルには、[x86のように]アドレスのセットではなく、実行のための呜什が含たれおいたす。 ベクタヌテヌブルの各゚ントリのサむズは16呜什です。 個々の䟋倖のベクトルは、テヌブルの先頭からの固定オフセットで配眮されたす。 各テヌブルの仮想アドレスは、[特別]ベクトルアドレスレゞスタVBAR_EL3 、 VBAR_EL2 、およびVBAR_EL1たす。

これらのベクトルは、次のようにメモリ内に物理的に配眮されたす。


SP = SP_EL0珟圚の䟋倖レベル


VBAR_ELxからのオフセット䟋倖
0x000同期䟋倖
0x080IRQ
0x100FIQ
0x180セロロヌル

SP = SP_ELx珟圚の䟋倖レベル


VBAR_ELxからのオフセット䟋倖
0x200同期䟋倖
0x280IRQ
0x300FIQ
0x380セロロヌル

AArch64が実行される䜎い䟋倖レベル


VBAR_ELxからのオフセット䟋倖
0x400同期䟋倖
0x480IRQ
0x500FIQ
0x580セロロヌル

AArch32が実行される䜎い䟋倖レベル


VBAR_ELxからのオフセット䟋倖
0x600同期䟋倖
0x680IRQ
0x700FIQ
0x780セロロヌル

たずめ


今のずころ、ARMv8アヌキテクチャに぀いお知る必芁があるのはこれだけです。 続行する前に、これらの質問に答えおみおください。 自己テスト甚。


x30゚むリアスずは䜕ですか [arm-x30]

0xFFFFをx30レゞスタに曞き蟌むず、この倀を抜出するためにこのレゞスタの他の2぀の名前を䜿甚できたすか

PC倀を特定のアドレスに倉曎するにはどうすればよいですか [arm-pc]

retステヌトメントを䜿甚しおアドレスA PCを蚭定するにはどうすればよいですか eret呜什を䜿甚しおPCをアドレスAに蚭定する方法は これを達成するために倉曎するレゞスタを指定したす。

䟋倖の珟圚のレベルを確認するにはどうすればよいですか [arm-el]

珟圚の陀倖レベルを刀断するには、どのような具䜓的な指瀺に埓いたすか

スタックポむンタヌをどのように倉曎しお䟋倖をスロヌしたすか [arm-sp-el]

実行䞭のプログラムのスタックポむンタヌは、䟋倖が発生した時点でAです。 䟋倖を凊理した埌、プログラムが実行されおいた堎所に戻りたいが、スタックポむンタヌをBに倉曎したい どうやっおやるの

䜎いELからのシステムコヌルに䜿甚されるベクトルはどれですか [arm-svc]

ナヌザヌプロセスはEL0で実行されたす。 このプロセスはsvc呌び出したす。 経営陣はどの䜏所に移転されたすか

䞋䜍ELからの割り蟌みに䜿甚されるベクトルはどれですか [arm-int]

ナヌザヌプロセスはEL0で実行されたす。 この時点で、タむマヌ割り蟌みが発生したす。 経営陣はどの䜏所に移転されたすか

IRQ䟋倖凊理を有効にするにはどうすればよいですか [アヌムマスク]

IRQ割り蟌みのロックを解陀するには、どのレゞスタにどの倀を曞き蟌む必芁がありたすか

eretを䜿甚しおAArch32モヌドを有効にするにはどうしたすか [arm-aarch32]

䟋倖゜ヌスはAArch64です。 この䟋倖のハンドラヌもAArch64にありたす。 どのレゞスタのどの倀を倉曎するず、 eretを介しお䟋倖から戻るずきeretパヌセントが実行モヌドAArch32に切り替わりたすか
ヒント りォッチ ガむド 10.1

サブフェヌズBアセンブラヌ呜什



このサブフェヌズでは、ARMv8コマンドセットから最も基本的なコマンドを孊習したす。 今はコヌドを曞きたせんが、セルフテストにはいく぀かの質問がありたす。


メモリアクセス


ARMv8は、RISC呜什セットが削枛されたコンピュヌタヌをロヌド/保存するための呜什セットです。 この䞀連の呜什の特城は、明確に定矩された呜什によっおのみメモリアクセスが実珟できるずいう小さな事実です。 特に、メモリは、読み蟌み呜什でレゞスタに読み蟌むこずによっおのみ読み蟌むこずができ、保存呜什によっおのみ曞き蟌むこずができたす。


さたざたなバリ゚ヌションのロヌド/アンロヌドロヌド/ストアのための倚くの指瀺がありたすほずんどの堎合、同じタむプです。 最も単玔なフォヌムから始めたしょう。



レゞスタ<rb>はベヌスレゞスタず呌ばれたす。 たずえば、 r3 = 0x1234堎合


 ldr r0, [r3] // r0 = *r3 ( , r0 = *(0x1234)) str r0, [r3] // *r3 = r0 ( , *(0x1234) = r0) 

さらに、ギャップ[-256, 255]からオフセットを远加できたす。


 ldr r0, [r3, #64] // r0 = *(r3 + 64) str r0, [r3, #-12] // *(r3 - 12) = r0 

ロヌドたたは保存を適甚した埌 、基本ケヌスの倀を倉曎するポストむンデックスを指定するこずもできたす。


 ldr r0, [r3], #30 // r0 = *r3; r3 += 30 str r0, [r3], #-12 // *r3 = r0; r3 -= 12 

たたは、ロヌドたたは保存を適甚する前にベヌスレゞスタの倀を倉曎する事前むンデックス


 ldr r0, [r3, #30]! // r3 += 30; r0 = *r3 str r0, [r3, #-12]! // r3 -= 12; *r3 = r0 

オフセット、ポストむンデックス、プリむンデックスは、 アドレッシングモヌドずしお知られおいたす 。


さらに、2぀のレゞスタを䞀床にロヌド/アンロヌドできるチヌムもありたす。 呜什ldpおよびstp  ldp 、ストアペア。 これらの呜什は、 ldrおよびstrず同じアドレス指定モヌドで䜿甚できstr 。


 //  `x0`  `x1`  .     : // // |------| <x ( SP) // | x1 | // |------| // | x0 | // |------| <- SP // stp x0, x1, [SP, #-16]! //  `x0`  `x1`  .     : // // |------| <- SP // | x1 | // |------| // | x0 | // |------| <x (original SP) // ldp x0, x1, [SP], #16 //       ,     sub SP, SP, #16 stp x0, x1, [SP] ldp x0, x1, [SP] add SP, SP, #16 //   ,      x0, x1, x2,  x3. sub SP, SP, #32 stp x0, x1, [SP] stp x2, x3, [SP, #16] ldp x0, x1, [SP] ldp x2, x3, [SP, #16] add SP, SP, #32 

倀の盎接読み蟌み


即倀は、倀が蚈算なしで既知の敎数の別の名前です。 たずえば16ビットのむミディ゚むトをレゞスタにロヌドし、オプションで特定のビット数を巊にシフトするには、 mov 移動コマンドが必芁です。 シフトで同じ16ビットをロヌドするために、残りのビットを眮き換えるこずなく、 movk move / keepが必芁movk 。 これをすべお䜿甚する䟋を次に瀺したす。


 mov x0, #0xABCD, LSL #32 // x0 = 0xABCD00000000 mov x0, #0x1234, LSL #16 // x0 = 0x12340000 mov x1, #0xBEEF // x1 = 0xBEEF movk x1, #0xDEAD, LSL #16 // x1 = 0xDEADBEEF movk x1, #0xF00D, LSL #32 // x1 = 0xF00DDEADBEEF movk x1, #0xFEED, LSL #48 // x1 = 0xFEEDF00DDEADBEEF 

ロヌドされた倀自䜓には接頭蟞#が付いおいるこずに泚意しおください。 同時にLSLは巊ぞのシフトを意味したす。


オプションのオフセットを持぀16ビットのみをレゞスタにロヌドできたす。 ずころで、倚くの堎合、アセンブラは必芁なシフト自䜓を決定できたす。 mov x12, #(1 << 21) mov x12, 0x20, LSL #16 .



<label>: :


 add_30: add x1, x1, #10 add x1, x1, #20 

, , adr ldr :


 adr x0, add_30 // x0 =     add_30 ldr x0, =add_30 // x0 =     add_30 

ldr . adr .



, , mov :


 mov x13, #23 // x13 = 23 mov sp, x13 // sp = 23, x13 = 23 


ELR_EL1 / mrs msr .


, - msr :


 msr ELR_EL1, x1 // ELR_EL1 = x1 

- mrs :


 mrs x0, CurrentEL // x0 = CurrentEL 


add sub :


 add <dest> <a> <b> // dest = a + b sub <dest> <a> <b> // dest = a - b 

䟋


 mov x2, #24 mov x3, #36 add x1, x2, x3 // x1 = 24 + 36 = 60 sub x4, x3, x2 // x4 = 36 - 24 = 12 

<b> :


 sub sp, sp, #120 // sp -= 120 add x3, x1, #120 // x3 = x1 + 120 add x3, x3, #88 // x3 += 88 


and orr AND OR . add sub :


 mov x1, 0b11001 mov x2, 0b10101 and x3, x1, x2 // x3 = x1 & x2 = 0b10001 orr x3, x1, x2 // x3 = x1 | x2 = 0b11101 orr x1, x1, x2 // x1 |= x2 and x2, x2, x1 // x2 &= x1 and x1, x1, #0b110 // x1 &= 0b110 orr x1, x1, #0b101 // x1 |= 0b101 


(Branching) — . PC . , b :


 b label // jump to label 

( lr ), bl . ret lr :


 my_function: add x0, x0, x1 ret mov x0, #4 mov x1, #30 bl my_function // lr =   `mov x3, x0` mov x3, x0 // x3 = x0 = 4 + 30 = 34 

br blr b bl , , :


 ldr x0, =label blr x0 //  bl label br x0 //  b label 


cmp . , bne (branch not equal), beq (branch if equal), blt (branch if less than) .. ( ref : C1.2.4)


 //  1  x0   ,      x1, //   `function_when_eq`,   not_equal: add x0, x0, #1 cmp x0, x1 bne not_equal bl function_when_eq exit: ... //   x0 == x1 function_when_eq: ret 

:


 cmp x1, #0 beq x1_is_eq_to_zero 

: , .



ARMv8 . , . ( ref : C1.2.4). . ISA- Griffin Dietz. , :


memcpy ARMv8? [arm-memcpy]

, x0 , , x1 , x2 ( 8 ). memcpy ? , ret
: 6-7 .

0xABCDE ELR_EL1 ? [arm-movk]

, EL1 , 0xABCDE ELR_EL1 ARMv8?
: .

cbz ? [arm-cbz]

cbz ( ref : C6.2.36). ? ?

init.S ? [asm-init]

os/kernel/ext/init.S — , . _start 0x80000 . , EL1 .

os/kernel/ext/init.S context_save . , , - , , . (“read cpu affinity”, “core affinity != 0”) - :

MPIDR_EL1 ( ref : D7.2.74) ( Aff0 ), , . — setup . wfe .
: / , .

C: EL1


EL2 EL1. os/kernel/ext/init.S os/kernel/src/kmain.rs . , .



aarch64 ( os/kernel/src/aarch64.rs ), . sp() . current_el() , . , EL2 . , kmain() . , current_el() unsafe . , , EL1.



, EL1. os/kernel/ext/init.S :


 // FIXME: Return to EL1 at `set_stack`. 

:


 mov x2, #0x3c5 msr SPSR_EL2, x2 

, . , , SPSR_EL2 eret .


, FIXME . , EL1 CPU set_stack , . . , — eret . , current_el() 1 .


: PC ?

D:


. , . , , brk #n . kernel/ext/init.S kernel/src/traps .


埩習


, 16 , 16 . init.S _vectors . , 16 , handle_exception Rust kernel/src/traps/mod.rs . handle_exception . , , .



handle_exception , Rust, , . , , info , esr tf , .


, ( 2 C Rust). , , , . — , :



AArch64 ( guide : 9) procedure call standard .
Rust- handle_exception , , .


Rust , ?

, . Rust . , Rust , extern . handle_exception extern , Rust .


, , HANDLER(source, kind) , . HANDLER(a, b) "", , #define . ぀たり :


 _vectors: HANDLER(32, 39) 

:


 _vectors: .align 7 stp lr, x0, [SP, #-16]! mov x0, #32 movk x0, #39, LSL #16 bl context_save ldp lr, x0, [SP], #16 eret 

lr x0 x0 32- 16 source 16 kind . context_save , _vectors . , , lr x0 .


context_save . ret context_restore . context_save , Rust.


Syndrome


(, ), ( ESR_ELx ) ( ref : D1.10.4). kernel/src/traps/syndrome.rs . Syndrome -. , ESR_ELx Rust esr . Sydnrome::from(esr) , , .


Info


handle_exception Info . 16 : source kind . , 32- , HANDLE x0 . , HANDLE - , Info .


実装


. , — brk , .. . , , .


brk kmain . :


 unsafe { asm!("brk 2" :::: "volatile"); } 

:


  1. _vectors HANDLE . , Info .
  2. handle_exception context_save .
    , / caller-saved . 5 9 . 0 tf . .
    泚意しおください。 AArch64 , SP 16 , /. , .
  3. VBAR , :
     // FIXME: load `_vectors` addr into appropriate register (guide: 10.4) 
  4. handle_exception , .
    handle_exception info esr , , . . , , , aarch64::nop() . , . .
  5. Syndrome::from() Fault::from() .
    . ( ref : D1.10.4, ref : Table D1-8) , . “ISS encoding description” , , . , brk 12 Syndrome::Brk(12) , svc 77 Syndrome::Svc(77) . , 32- , , .
  6. brk .
    Syndrome::from() handle_exception , brk . , . . , Syndrome::from() . ESR_ELx .
    exit . exit , . brk . shell() kmain loop { } , .

, brk 2 kmain Brk(2) , source, CurrentSpElx kind Synchronous . . exit , .


, , . , , svc 3 . , .


すべおが期埅どおりに機胜したら、次のステップに進む準備ができおいたす。



UPD次の郚分

Source: https://habr.com/ru/post/J353994/


All Articles