
警告!まだ何も完全ではありません。ここでのすべては、実験的で非常に積極的な開発です。注意して進めてください。
コンピューターは奇妙です。あなたが彼らがどのように働くかわからないならば、彼らは魔法のように感じるという意味で奇妙です。その仕組みを学び始めると、その魔法の感覚が消えてしまいます。あなたは「すごい!これはブリリアントです」または「すごい...これはたわごとです」になります。
したがって、基本的に2つのオプションがあります。
まだ明らかではなかった場合、私は後者を取りました。
基本的に、「コンピューター」についてもっと知りたいと思いました。比較的ハイレベルのソフトウェアに取り組むことはかなり楽しいですが、私は低レベルのインターンセルや作業を見ることになるという悪い習慣があります。
「ああ、それで
malloc()とnewへの呼び出しはsyscallmmap()を呼び出すことになりますか?それがMMUであることを確認しましょう。MAIR、VMAとは何ですか?TLBTCRは何ですか?
私が知らなかったこれらの抽象化の層がありました!私はそこで止まるべきだったが、いない。代わりに、私は言った:「わかりました。私は低レベルのものの通話の声が本当に好きです。「シンプルな」オペレーティングシステムを書くことですべての抽象化を学びましょう。何がうまくいかないでしょうか?」と言いました。そして今、私はここにいます。
進行中の愛好家オペレーティングシステム/W「手作り」マイクロカーネル。名前は、ゲームオブスローンズの世界で最も政治的でめちゃくちゃな大陸からのものです。すべてがあちこちにあり、何も意味がありません。
このプロジェクトは、オペレーティングシステムについて学び、途中で楽しむのに役立つためにのみ存在します。私はOSの開発についてあまり知らないと主張していません。したがって、ここに表示されるプラクティス、デザインチョコー、いくつかの実装はあなたを怖がらせます。
私はあなたの期待を低くkeppにすることをお勧めします>。<
重要な注意: Westerosは非常に早期に開発されています。ものは変わり、ブレーキをかけるか、まっすぐに愚かになります。私はまだ最終目標を定義していません。それまでは、すべて、どこにでも、一度にすべてを期待しています。
/dev /procが可能な場合はidk?)mkdir 、 touch & catなどの基本的なシェルコマンド物事の内部働きにもう少し飛び込みましょう。ターゲットマシンは非常に具体的で静的です。 ARM64アーキテクチャ(ARMV8)とQEMUのARM VIRTマシンのみをサポートすることで、できるだけシンプルに保ちたいと思いました。
これがターゲットマシンです。

必須の基本周辺機器のみが定義されています。悲しいことに、これはUSB、NVME、NICがないことを意味します。 :(多分将来?
これが私がサポートする予定の周辺機器です。
カーネルは、単純なマイクロカーネル設計(L4ファミリーなど)に従います。理解しやすいシンプルなカーネルを作り、プロセス中にできるだけ多くのことを学ぶのを助けたかったのです。
最初にMITのXV6を追跡しました。しかし、尋ねられたとき、人々は私にそれが少し「素朴/安い」であり、おそらく私をIRLに助けてくれないと私に言った(彼らは驚くべき人だ)。そこで、私は彼らのアドバイスを受けて、マイクロカーネルのデザインを使用することにしました。また、もっと面白いようです
警告!私の手作りのマイクロカーネルのデザインはあなたをトリガーします。たとえば、デバイスドライバーをユーザースペースに入れ、スケジューラをカーネルスペース内に配置します(基本的には「適切/アクセミュアル」設計に従っていません)。
時間をください。私はまだ学んでいるときに学んでいます>。<
カーネルの全体的な概要を次に示します。 (TODO:すぐに更新されます...)

TODO:全体的なOS仕様。将来の目標は何ですか。


|-- Build <- Compiled objects, binaries & debug files
|-- Documents <- Reference documents
|-- Emulation <- QEMU scripts & Device Tree Structure
|-- Kernel <- The source code. Headers, C and C++ files
| `-- Arch <- Architecture related code
| `-- Drivers <- Driver source and header files
| `-- Library <- Library source and header files
| `-- Include <- Kernel header files
|-- Media <- Images and other media
|-- Toolchain <- Cross-compiling environment
|-- Userland <- User level source code
| `-- Dir. <- TBD.
|-- .gitignore <- Good ol' .gitignore
|-- Makefile <- Makefile
`-- README.md <- Main README
現在、Westerosを起動する唯一の方法は、 -kernelパラメーターを介してQemuのAarch64 Virt Machineです。
カーネル(したがってOS)の起動を担当する部分は、Shimと呼ばれます。これは、カーネルイメージに沿ってリンクされた小さなコードで、システムをブートストラップする責任があります。
カーネルが制御する前に、いくつかの操作を処理します。
参照:SEL4-エルフローダー
kmain()の直前のARM64マシン(例:レジスタ)の状態
0xffff0000401080000x401010000x401020030x401020000x400007010x401030000x401040030x401040000x400007010xbbff440c04000b00000000 (DEVICE_nGnRnE)0b00000100 (DEVICE_nGnRE)0b00001100 (DEVICE_GRE)0b01000100 (NORMAL_NC)0b11111111 (NORMAL)0b10111011 (NORMAL_WT)0b00000000 (Res)0b00000000 (Res)0x4801000100b0 (48 bit)0b100 (44 bits, 16TB)0b01000 (16)0b01000 (16)0b0 (Hierarchical permissions enabled)0b0 (Hierarchical permissions enabled)0b0 (Top Byte used)0b0 (Top Byte used)0b0 (8 bit)0b0 (TTBR0_EL1.ASID defines the ASID)0b0 (Perform table walk)0b0 (Perform table walk)0b10 (4 KiB)0b00 (4 KiB)0b00 (Non-shareable)0b00 (Non-shareable)0b00 (Outer Non-cacheable)0b00 (Outer Non-cacheable)0b00 (Inner Non-cacheable)0b00 (Inner Non-cacheable)0x40101000 (k_l0_pgtbl)0x40103000 (u_l0_pgtbl)0xc508390b1 (MMU enabled)0b0 (Alignment fault checking is disabled)0b00b1 (SP Alignment check enabled)0b1 (SP Alignment check enabled for EL0)0b1 (System instruction memory barrier enabled for EL0 Aarch32)0b0 (Access to Stage 1 Normal memory from EL0 & EL1 are Stage 1 Non-cacheable)Westerosカーネルは、マイクロカーネルの設計に従います。さまざまな人/組織には、マイクロカーネルの設計方法について異なる解釈があります(L4、Minixなど)。ここでは、カーネルを可能な限りシンプルに保つために、マイクロという用語を使用します。これはつまり:
上記のすべては、ユーザースペースアプリケーションとして実装する必要がありました。
カーネルは、次のサービスと機能を提供します。
mmap() )msgsend() 、 msgrecv() )thread_create() )intr_attach() )gettimeofday() )yield() )カーネルには、ブートローダーから[初期]ユーザーイメージが必要です。この画像には、カーネルが起動する最初のELF実行可能ファイルが含まれている必要があります(おそらくroot taskとprocess manager )。
使用者の画像は、Linuxシステムで使用されるinitrdと考えることができます。
カーネルが提供するすべてのすべての完全なリストと物の内側の仕組みは、後で路面で説明されます。私はまだそれらを実装していません。
参照に関しては、次のマイクロカーネルとOSをよく使用しました。
TODO:楽しいもの。彼らがOSを起動する人を待っているものは何ですか?
次のサービスが実装されます。
services.config )オペレーティングシステムを構築および実行するには、 ARM GNU Toolchain 、 QEMU 、Amite of Patience™の3つの主なことが必要です。
お気に入りのオペレーティングシステムにすべてを構築することが可能です。 ARM GNU Toolchain 、 Windows 、 MacOS 、 GNU/Linuxの両方で利用できます。ただし、 Windowsをまだテストしていません。だから、あなたはその空間に一人でいる。ごめん :(
以下の手順は、GNU/Linux(AARCH64)ホスト用です。
gitとmake持っていることを確認してください
$ apt install git make # if using `apt`
$ pacman -S git make # if using `pacman`1。このリポジトリをクローンします
$ git clone https://github.com/TunaCici/WesterOS.git 2。最新のARM GNU Toolchainをダウンロードします
ARM GNUツールチェーンダウンロードWebページに移動します。
ダウンロードするには、適切なAARCH64 BARE-MATELターゲットを選択してください。バージョンは重要ではないので、最新のものを選択してください。ただし、ダウンロードするツールチェーンをホストしていることは重要です。独自のオペレーティングシステム用に作成されたものを選択してください。
たとえば、OSがGNU/Linux(x86_64)の場合、ダウンロードしてください。
https://developer.arm.com/-/media/Files/downloads/gnu/12.2.rel1/binrel/arm-gnu-toolchain-12.2.rel1-x86_64-aarch64-none-elf.tar.xz
$ cd WesterOS/Toolchain
$ wget https://developer.arm.com/-/media/Files/downloads/gnu/12.2.rel1/binrel/arm-gnu-toolchain-12.2.rel1-aarch64-aarch64-none-elf.tar.xzダウンロードされたファイルの「整合性」と「署名」を確認するのはあなたの責任です。ダウンロードページで提供されるSHA256キーを使用します。
3.ダウンロードしたARM GNU Toolchainを抽出します
Westeros/Toolchainで抽出してください。
$ tar -xvf arm-gnu-toolchain-12.2.rel1-aarch64-aarch64-none-elf.tar.xz 4. MakefileでTOOLCHAIN_PATHを変更します
TOOLCHAIN_PATH 、新しくダウンロードされ、抽出されたARM GNU Toolchainを指す必要があります。ホストOSとツールチェーンバージョンは私のものとは異なる可能性があるため、パス変数を編集する必要があります。
正しく設定されていない場合、次のようなエラーメッセージでmakeプロセスが失敗します。
make[1]: Toolchain/arm-gnu-toolchain-12.2.rel1-darwin-arm64-aarch64-none-elf/bin/aarch64-none-elf-as: No such file or directory
したがって、 TOOLCHAIN_PATHを編集してください。
# Open the main Makefile /w your favorite text editor
$ vim Makefile
# And change the `TOOLCHAIN_PATH` accordingly. For example..
> TOOLCHAIN_PATH=Toolchain/arm-gnu-toolchain-12.2.rel1-darwin-arm64-aarch64-none-elf
# Save & exit 5。 makeを使用してビルドします
$ make allビルドは、メッセージビルドが完了して終了します。人生を楽しむ<3 。あなたがそれを見ないなら、私に連絡してください。問題の修正>。<を試してみます
WesterosはQemuを使用してのみ実行できます。実際のハードウェアのために完全に加工可能な画像を作成する予定はありません。もともと私のアイデアは、 Raspberrry Pi 4Bをエミュレートすることでしたが、テストや脱落時に「初心者向け」ではないかもしれないことに気付きました。だから、QEMU!
恥知らずなプラグ時間! QEMUの詳細が必要な場合は、QEMU_STARTER GitHub Thingyにアクセスしてください。
0. qemu-system-aarch64がインストールされていることを確認してください
$ apt install qemu-system qemu-utils # if using `apt`
$ pacman -S qemu-full # if using `pacman`1. Westerosを起動します
$ make run2023年7月9日の時点で、Westerosはまっすぐに空いています!したがって、端末に非常に基本的なカーネルメッセージを表示する以外は何もできません:/
繰り返しになりますが、Westerosは愛好家のオペレーティングシステムであり、学習プロセスです。ソースコードのコードを実際に検討しようとする必要があります。私はあなたがそこでもっと楽しくなると確信しています。
TODO:ユーザーを基本的にドキュメントである別のREADMEに移動します。