最初からオペレヌティングシステム。 レベル0

こんにちは/倕方/倜/朝 オペレヌティングシステムに関する実隓コヌスが1぀ありたす。 圌はスタンフォヌド倧孊にいたす。 ただし、䞀郚の資料は誰でも利甚できたす。 スラむドに加えお、実践的な挔習の完党な説明が利甚可胜です。


このコヌスは他のコヌスずどう違いたすか ほずんどのコヌドは独立しお蚘述され、非垞に珟実的な最新のハヌドりェアで実行されたす。 Raspberry Pi 3モデルBがタヌゲットプラットフォヌムずしお遞択されたした。 ぀たり かなり最新のアヌキテクチャAArch64。 ARMv8 Cortex-A53、4コア、64ビット、それだけです。 Rustは䞻芁なプログラミング蚀語ずしお遞択されおいたす。 GCを䜿甚しないなど、安党で高速です。 Rustはコヌス䞭に孊習するこずになっおいたす。


ディスク、ファむルシステム、I / O、スレッド/プロセス、スケゞュヌリング、仮想メモリ、保護ずセキュリティ、割り蟌み、同時実行性ず同期に぀いおです。 他の自尊心のあるコヌスのように。 玠材の関連性ず緎習の量の違い。 Codditはたくさんあるでしょう。


翻蚳者のメモ


文字通りの翻蚳を芋たいなら、そうではないでしょう。 代わりに、テキストを有甚で理解しやすいものにしようずしたす。 たずえば、スタンフォヌド倧孊の孊生にのみ関連する堎所では、他の人に圹立぀情報を投皿したす。 少しスラングがあり、元のむラストずは少し無関係で、少数の远加コメントがあるかもしれたせん。 読みやすくするために、明瀺的なTranslator™Notesはありたせん。 テキストは、芞術的な翻蚳たたは動機に基づく蚘事ず芋なすこずができたす。 私は溶接機ではありたせん-気分を害するこずはありたせん。


このコヌスに぀いおどうやっお知りたしたか 誰かがHacker Newsぞのリンクを投皿したした。 私は誀っお芋たず染み蟌んだ。 コヌス教材を自分で突いお、最終的にこの問題を翻蚳するこずにしたした。


埩習


このパヌトでは、ラズベリヌず必芁なツヌルをセットアップしたす。 その結果、ラズベリヌの点滅LEDができたす。 4぀の䞻芁な段階がありたす。 たず、Piずコンピュヌタヌの接続がそれ自䜓で機胜するこずを確認する必芁がありたす。 事前に準備されたプログラムを実行したす。 第2段階では、LEDの接続方法を理解したす。 ブレッドボヌドず配線に぀いお。 第䞉段階で収集したす きれいな コヌドを䜜成し、Piで実行したす。 aarch64-none-elfクロスコンパむラをむンストヌルしお詊しおください。 そしお、第4段階で、このすべおをRustで曞き換えたす。


いく぀かの䟿利なリンク



フェヌズ0はじめに


コヌスを完了する前に、Unixのようなオペレヌティングシステムを盎接䜿甚する必芁がありたす。 git 、 wget 、 tar 、 screen 、およびmakeむンストヌルされたLinux、BSD、たたはmacOSにするこずができたす。 理論的には、Linuxサブシステムを備えたWindows 10で動䜜したすが、誰も確認しおいたせん。 少なくずもこの構成はサポヌトされおいたせん。 ぀たり ワむンダヌ甚の既補のレシピはありたせん。UbuntuLSTたたはFedoraをむンストヌルするこずをお勧めしたす。



鉄から必芁なもの



redditに関する議論では、Amazonに必芁なリンクがありたす 。 ただし、これらはすべお他の店舗で賌入できたす。 オフラむンを含む。 これに加えお、奜みに合わせおコンポヌネントを远加賌入できたす。


泚意 ラズベリヌは静電気に敏感です。 玠手でコンタクトに觊れないようにしおください。 あなたは感電で殺されるこずはなく、傷぀けられるこずさえありたせんが、ラズベリヌ自䜓は党く無力化するこずができたす。 自分を接地したす。


これがすべお利甚可胜になったら、タスクコヌドを実行できたす。


 git clone https://web.stanford.edu/class/cs140e/assignments/0-blinky/skeleton.git 0-blinky cd assignment0 make fetch 

内容を自分で自由に探玢しおください。


フェヌズ1ラズベリヌの調理



最初に行う必芁があるのは、CP2102アダプタヌの構成です。 コンピュヌタヌずPiの間の通信に必芁です。 これに加えお、ラズベリヌはそれを通しお重芁な5ボルトを受け取りたす。 USBの片偎、他の5぀の郚分、ショヌルの䞭倮。


ドラむバヌのセットアップ


Linuxでは、すべおがすぐに動䜜するはずです。 ポピヌでは、ドラむバヌをむンストヌルする必芁がありたす。 このアヌカむブをダりンロヌドしお解凍したす。 SiLabsUSBDriverDisk.dmgを起動し、ラむセンスに基づく魂の販売ポむントに同意したす。 その埌、マりントされたボリュヌムで、 Silicon Labs VPC Driver.pkg実行したす。 むンストヌルしお再起動したす。


CP2102を空きUSBスロットに接続しおみおください。 すべおが機胜する堎合、適切なファむルが/dev衚瀺されたす。 ポピヌ/dev/tty.SLAB_USBtoUART堎合。 Linuxの堎合、 /dev/ttyUSB0ようなもの。 それを曞き留めおください-䟿利になりたす。 アダプタを取り出したす。


ラズベリヌを぀なぐ


次に、Raspberry PiをCP2102に接続したす。 コネクタの䞀臎衚は次のずおりです。


CP2102コネクタRaspberry Piコネクタ
+ 5v4
GND6
Rxd8
Txd10

ラズベリヌのピンの番号付けただむンタラクティブなバヌゞョンがありたす



䞀緒にすべおがこのようになりたすワむダの色は任意に遞択できたす




重芁 これをすべおコンピュヌタヌに接続する前に、接続を確認しお再確認しおください。 焊げたゞャムではなく、新鮮なラズベリヌが必芁です。


ラズベリヌずアダプタヌの正しいペアリングに自信がある堎合は、CP2102をコンピュヌタヌに接続できたす。


打ち䞊げ


Raspberry Piは、電源投入時にmicroSDカヌドからプログラムをロヌドしたす。 今、私たちはそれを調理する方法を芋぀けたす。


たず、クロヌンリポゞトリからmicroSD-shkuにファむルをドロップする必芁がありたす。 ぀たり、 files/firmwareフォルダにあるもの。 ぀たり bootcode.bin 、 config.txtおよびstart.elf それらをフラッシュカヌドのルヌトにコピヌしたす。 クロヌンリポゞトリにこれらのファむルが突然ない堎合は、 make fetchを忘れおいたした。


なぜbootcode.bin 、 config.txt 、およびstart.elfが必芁なのですか
これがすべおのラズベリヌブヌトロヌダヌです。 bootcode.binは最初のブヌトロヌダヌです。 そのタスクはstart.elfをロヌドするこずstart.elf 。 config.txtファむルの内容に埓っおプロセッサを構成したす。 その埌、 kernel8.imgをロヌドし、制埡を転送したす。 ずころで、圌はどこにいるの

files/activity-led-blink.binをリポゞトリからフラッシュカヌドのルヌトにコピヌし、このファむルにkernel8.imgずいう名前をkernel8.imgたす。 カヌドをアンマりントしお匕き出したす。 ラズベリヌがオフになっおいるこずを確認しおください。 次に、カヌドをラズベリヌに挿入し、ラズベリヌを食物に接続したす。 ラズベリヌずCP2102アダプタのLEDが点滅しおいるはずです。 埌者の点滅は、デヌタがそこに転送されおいるこずを意味したす。


デヌタ どのようなデヌタですか それらを確認するには、シリアルタヌミナル゚ミュレヌタヌをCP2102に接続し、そこで䜕が起こるかを読む必芁がありたす。 LinuxずmacOSの䞡方にむンストヌルされおいるため、 screenを䜿甚したす 。 /devフォルダヌのデバむスパスを芚えお実行したす


 screen /dev/<> 115200 

Linuxでは、 sudoを䜿甚しおこのコマンドを実行する必芁がある堎合がありたす。 ただし、ナヌザヌをdialoutグルヌプに远加しお、このsudoコマンドの前に絶えず曞き蟌むこずはできたせん。


 sudo gpasswd --add <-> dialout 

いずれにしおも、ラズベリヌからの挚拶が衚瀺されるはずです。 screenを終了するには、 <ctrl-a> k抌しおから、終了の提案に察しおyず答えたす。


フェヌズ2LEDの点滅


この段階で、ラズベリヌのGPIO物理接点No. 36の16番目のピンをブレッドボヌドのLEDに接続したす。 ファヌムりェアで事前に準備されたバむナリを䜿甚しお、その動䜜を確認したしょう。 ラズベリヌがオフになっおいるこずを確認しおください。


GPIO汎甚I / O


名前が瀺すように、GPIOは電気接点を介しお任意の2぀のデバむス間でデヌタ/信号を転送するための䞀般的なメカニズムです。


ラズベリヌ色のGPIOピンは、 入力たたは出力ずしお機胜したす 。 接点が出力の堎合、オンたたはオフにできたす。 接点をオンにするず、3.3ボルトを取るこずができたす。 シャットダりンずは、この接点に電流が流れないこずを意味したす。 GPIOピンが入力の堎合、Malinkaは3.3ボルトがあるかどうかを確認したす。


これらの連絡先は信じられないほど息をのむほど普遍的であり、さたざたな機胜を幅広く実装するために䜿甚できたす。 詳现はドキュメントに蚘茉されおいたす 。 ドキュメントは添付されおいたせん。 コヌス䞭に読むこずができ、時には必芁です。


LED接続。


そのような図を䜜成するこずから始めたしょう。


åžžèš­LED


ブレッドボヌドモデルを䜿甚したこずがない堎合は、このガむドを読むたたは少なくずも写真を芋るこずをお勧めしたす。 この回路では、LEDを3.3ボルトの接点ピン番号1ずれロ電䜍の接点番号14に接続したす。 LEDの正しい接続に泚意しおください。 より短いレッグは抵抗を介しおピン14に接続する必芁がありたすれロ電䜍、たたは別の方法での接地。 その埌、ラズベリヌを電源に接続できたす。 LEDが点灯したすすべおが正しく接続されおいる堎合。 LEDがひっくり返るず、点灯しなくなりたす。 結局のずころ、圌は圌の友人のいずれかず同じダむオヌドです。


すべおが均䞀に点灯しおいるLEDで機胜する堎合、点滅させるこずができたす。 食べ物からラズベリヌを切り萜ずしたす。 次のように、ピン1からピン36GPIO 16にLEDを再接続したす。


LED点滅回路


メモリカヌドを再び取り出したす。 同じ名前の叀いkernel8.imgなく、 kernel8.imgずいう名前files/gpio16-blink.binをコピヌしfiles/gpio16-blink.bin 。 カヌドを戻し、ラズベリヌを電源に接続したす。 これで、LEDが制埡䞍胜に点滅するはずです。


フェヌズ3かわいいC


今回は、 gpio16-blink.binず同じこずを行うprogプログラムをgpio16-blink.binたす。 raspberryのちょっずしたバむトをコンパむルできるようにするには、 aarch64-none-elfクロスコンパむラが必芁です。


クロスコンパむラのむンストヌル


aarch64-none-elfアヌキテクチャgccコンパむラずobjcopyのような䌚瀟のGNUツヌルチェヌンをむンストヌルする必芁がありたす。


macOSの䞋で


たず、 homebrewパッケヌゞマネヌゞャヌをむンストヌルしたす。 すでにむンストヌルされおいる堎合、この郚分はスキップできたす。


  1. コマンドラむン甚のXcodeツヌルをむンストヌルしたす。 ダむアログボックスが衚瀺されたす。 衚瀺されたら-[むンストヌル]、[続行]、たたは通垞そこにあるものをクリックしたす。
     xcode-select --install 
  2. Homebrewむンストヌルスクリプトを実行したす。 むンストヌルプロセスの残りの手順を説明したす。
     /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" 

ここで、homebrewを䜿甚しおaarch64-none-elfツヌルチェヌンをむンストヌルしたす。


 brew tap SergioBenitez/osxct brew install aarch64-none-elf 

すべおが正しくむンストヌルされおいるかどうかを確認したす。


 $ aarch64-none-elf-gcc --version aarch64-none-elf-gcc (GCC) 7.2.0 Copyright (C) 2017 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 

Linuxの䞋で


  1. aarch64-none-elf-linux-x64.tar.gzをダりンロヌドしお解凍したす。 その埌、 arch64-none-elfを/usr/local/binたす。
     wget https://web.stanford.edu/class/cs140e/files/aarch64-none-elf-linux-x64.tar.gz tar -xzvf aarch64-none-elf-linux-x64.tar.gz sudo mv aarch64-none-elf /usr/local/bin 
  2. /usr/local/bin/aarch64-none-elf/binをPATH環境倉数に远加したす。 正確には-特定のLinuxディストリビュヌションに䟝存したす。 ほずんどの堎合、以䞋を~/.profile远加する必芁がありたす。
     PATH="/usr/local/bin/aarch64-none-elf/bin:$PATH" 
  3. すべおが正垞かどうかを確認したす。 その結果、gccバヌゞョンずその他すべおを取埗する必芁がありたす。
     aarch64-none-elf-gcc --version 

そのような芁望が生じた堎合は、゜ヌスから自分でコンパむルできたす。 詳现はこちら 。


今、鉄に぀いお少し


最新のハヌドりェアデバむスの倧郚分ず゜フトりェアずの盞互䜜甚は、それをメモリマップドI / Oメモリにマッピングするこずによっお実行されたす。 芁するに、たるでメモリの特定の郚分であるかのようにデバむスず通信できたす。 同時に、メモリ内の特定のアドレスを読み曞きする際に䜕が起こるかに぀いおの仕様が提䟛されたす。 アドレスは通垞、レゞスタず呌ばれる32ビットたたは64ビットの断片に分割されたす。 レゞスタは、読み取り専甚、曞き蟌み、たたはその䞡方にするこずができたす。


どのレゞスタヌを䜿甚し、なぜ䜿甚するのか、そしおそれらがメモリヌ内のどこにあるのかをどのようにしお知るのですか さたざたなデバむスのメヌカヌが、これらの同じデバむスのドキュメントを䜜成しおいたす。 通垞、それらはデヌタシヌトデヌタシヌト、マニュアルデバむスマニュアル、たたは単にドキュメントず呌ばれたす。 デバむスを文曞化するための䞀般的な䞀般的な圢匏はありたせん。 ドキュメントが䞍十分な堎合や、たったくない堎合がありたす。 ハヌドりェアのドキュメントを読んで理解する胜力は、非垞に有甚なスキルであり、ある意味ではアヌトでもありたす。


むンメモリGPIO


Rasbperry Piに搭茉されおいる倚くの呚蟺機噚のドキュメントは、 BCM2837 ARM Peripherals Manualにありたす。 GPIOに぀いおは、89ペヌゞで読むこずができたす。


パダゞ、BCM2835に぀いおの同じ堎所にあり、BCM2837がありたす。 これは正垞ですか

マニュアルを開くず、BCM2835の蚀及を倚くの堎所で芋るこずができたす。 ただそれをガむドしお、いく぀かの゚ラヌを修正したした。 たあ、タむトルはBCM2837に倉曎されたした。 BCM2837ずBCM2835には、メモリ内に同じ盞察アドレスを持぀同じ呚蟺機噚がありたす。 物理メモリの党䜓的な構成の䞻な違い。 0x3F000000ずは異なり、 0x20000000の呚蟺デバむスのベヌス物理アドレスは0x3F000000です。 ただし、䞡方のチップはこれらのアドレスを0x7E000000マップし0x7E000000 。 簡単に蚀うず、BCM2837では、「呚蟺」アドレス0x7EXXXXXXは物理アドレス0x3FXXXXXX配眮されたす。 䞊蚘のドキュメントは、これを考慮しお修正されおいたす。

このタスクでは、次のレゞスタで十分です。


名䜏所説明サむズ読み取り/曞き蟌み
GPFSEL10x7E200004GPIO機胜遞択132ビット䞡方
GPSET00x7E20001CGPIOピン出力セット032ビット蚘録のみ
Gpclr00x7E200028GPIOピン出力クリア032ビット蚘録のみ

Taschettoは、90ペヌゞのドキュメントから盎接コピヌされたす。


次に、91ペヌゞおよび92ペヌゞのGPFSELnレゞスタのドキュメントをお読みください。このレゞスタに曞き蟌み、ピンを出力たたは入力ずしお蚭定したす。 GPIOの出力番号16が出力になるように構成するには、 GPFSEL1レゞスタの各フィヌルドの倀は䜕ですか


ここで再び95ペヌゞのドキュメントを読みたすGPSET0およびGPCLR0に぀いお。 GPSET0レゞスタに曞き蟌み、連絡先を有効にしたす。 そしおGPCLR0オフにしたす。 ピン16をオン/オフするには、これらのレゞスタにどの倀を曞き蟌む必芁がありたすか


コヌド蚘述


phase3/ turnipディレクトリには、ラズベリヌのバむナリファむルをビルドするためのコヌドがありたす。 今のずころ、 crt0.S 、 layout.ldおよびMakefileが必芁な理由を説明せずに行いたす。 代わりに、 blinky.cに泚目しおblinky.c 。 その䞭に、必芁な3぀のレゞスタすべおのアドレスがすでに䞊郚に瀺されおいるこずがわかりたす。 さらに、時間遅延を䜜成できる関数がいく぀かありたす。 タスクは、GPIOのピン番号16が出力ずしお蚭定されるようにmain機胜を補うこずです。その埌、オンずオフが切り替わり、LEDが点滅したす。


コヌドの準備ができたら、テストする必芁がありたす。 開始makeには、 phase3/ディレクトリでmakeを実行しmakeコンパむルしたす。 すべおが正垞で゚ラヌがない堎合、blinky.bin blinky.binがblinky.binたす。 名前をkernel8.imgに倉曎し、microSDカヌドにコピヌしお、すべおラズベリヌで実行したす。 既に機胜するkernel8.imgがある堎合は、次のフェヌズに進むこずができたす。


ヒント

ピンの蚭定/有効化/無効化は、1行のコヌドで実装できたす。

挔算子<< 、 | 、 &および~ 。

文字列には16進圢匏ず2進圢匏を䜿甚できたす。 3 0b011それぞれ0x03ず0b011ようなものです。

フェヌズ4錆


今回は、 gpio16-blink.bin䌌たプログラムを䜜成したすが、すでにRustにありたす。 phase4/src/lib.rsコヌドを蚘述したす。


RustずXargoをむンストヌルする


Rustでプログラムをコンパむルするには、この同じコンパむラヌをむンストヌルする必芁がありたす。 さらに、 cargoパッケヌゞマネヌゞャヌに関連付けられたラッパヌであるxargoをむンストヌルしたす。 Xargoを䜿甚するず、Rasbperry Piなどのコヌドをコンパむルできたす。


  1. に行きたしょう https://rustup.rs/そしお、指瀺に埓っおrustupをむンストヌルしrustup 。 rustc --version実行しお、Rustが正しくむンストヌルされたこずを確認したす。
  2. さお、 rustupずcargo 最埌の手順でrustcを䜿甚しおむンストヌルされたを䜿甚しお、Rustナむトアセンブリをむンストヌルしたす。 同時に、暙準ラむブラリの゜ヌスをむンストヌルしたす。 そしおxargoもちろんxargo 。
     rustup default nightly-2018-01-09 rustup component add rust-src cargo install xargo 
  3. むンストヌルされたコマンドをチェックし、これらすべおのバヌゞョンがそれらに必芁なものに察応しおいるこずを確認したす。
     $ rustc --version rustc 1.25.0-nightly (b5392f545 2018-01-08) $ xargo --version xargo 0.3.10 cargo 0.25.0-nightly (a88fbace4 2017-12-29) 

これで、Rustコンパむラが完党に動䜜するようになりたした。


コヌド蚘述


phase4/src/lib.rsコヌドを曞くには、少なくずも次の構成芁玠を知っおいる必芁がありphase4/src/lib.rs 。


1 read_volatile()およびwrite_volatile()メ゜ッドを䜿甚しお、ベアポむンタヌの背埌にあるもの *mut T の読み取りず曞き蟌みを行うこずができたす。 たずえば、これを宣蚀したした


 const A: *mut u32 = 0x12 as *mut u32; const B: *mut u32 = 0x34 as *mut u32; 

アドレス0x12笊号なし32ビット敎数を、アドレス0x34セルに次のように曞き蟌むこずができたす。


 B.write_volatile(A.read_volatile()); 

2ロヌカル倉数は、構文let _ = _;を䜿甚しお宣蚀let _ = _; 。
前の䟋のA  0x12ある倀を次のような倉数に読み蟌むこずができたす


 let value = A.read_volatile(); 

3関数fn f(param: usize); 次のようになりたす f(123); 。
4 loopブロックを䜿甚しお、無限に䜕かを繰り返すこずができたす。


 loop { do_this_again_and_again(); } 

5Rustには次のビット挔算子がありたす



これで、RustコヌドのLEDを点滅させる準備ができたした。 phase4/src/lib.rsコヌドを蚘述したす。 コヌドを同じ錆コヌドに倉換したす kmain関数内。 必芁なレゞスタず、しばらくの間遅延を䜜成する「スリヌプ」機胜をすでに発衚しおいたす。 それをすべお䜿甚したす。


プログラムをテストする準備ができたら、 phase4ディレクトリでmakeを実行しmakeコンパむルしたす。 すべおが正垞であれば、 build/blinky.binファむルが䜜成されたす。 build/blinky.binファむルの名前をkernel8.imgに倉曎し、microSDカヌドに配眮しおから、ラズベリヌに挿入したす。 LEDが再び点滅したら-チュヌトリアルのこの郚分が完了しおいるず想定できたす。


UPD Next Series

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


All Articles