
警告!几乎什么都没有完成。这里的一切都是实验性的,并且在非常积极的发展中。谨慎行事。
计算机很奇怪。如果您不知道它们是如何工作的,那么他们就会感到神奇的意义上很奇怪。如果以及何时开始学习它的工作方式,那神奇的感觉消失了。您要么最终都会得到“哇!这是光彩”或“哇...这是狗屎”。
因此,您基本上有两个选择:
如果还不明显,我拿了后者。
基本上,我想了解有关“计算机”的更多信息。使用相对高级的软件工作非常有趣,但是我有一个不好的习惯,最终要查看低级实习生和工作的工作。
“哦,所以我打电话给
malloc()和new最终打电话给syscallmmap()?让我们检查一下它的实现..哦,VMA是什么?什么是MMU?什么是TLB?什么是TCR和MAIR?我是什么?我是什么?我是什么?我是什么?
我不知道这些抽象层!我应该在那里停下来,但没有。取而代之的是:“好吧。我真的很喜欢低级东西的风情。让我们疯狂地尝试通过编写“简单”操作系统来学习所有抽象。什么可能出了问题?”现在,我在这里。
在进行工作的业余爱好者操作系统/W“手工制作”微核。这个名字来自《权力的游戏世界》中最政治和混乱的大陆。[^2]我真的很喜欢got(是的,判断我想要的一切),政治混乱与我对这个项目的目标相似。一切都到处都是,没有任何意义。
该项目的存在只是为了帮助我了解操作系统并在此过程中获得一些乐趣。我声称对操作系统开发了解太多。因此,您在这里看到的实践,设计巧克力和某些实现将吓到您。
我建议将您的期望低>。<。<
重要说明: Westeros处于非常早期的发展。东西会改变,制动或直接愚蠢。我还没有定义最终目标。直到那时,任何地方都期望一切都立刻。
/dev和/proc (如果可能的话,idk?)mkdir , touch & cat让我们进一步研究事物的内部工作。目标机非常具体且静态。我想通过仅支持ARM64架构(ARMV8)和Qemu的Arm Virt机器来保持尽可能简单。
这是目标机。

仅定义了必不可少的基本外围设备。可悲的是,这意味着没有USB,NVME和NIC。 :(也许将来?
这是我计划支持的外围设备。
内核遵循一个简单的微粒设计(例如L4家庭)。我想制作一个易于理解并帮助我在此过程中尽可能多地学习的简单内核。
我最初遵循麻省理工学院的XV6。但是,当被问及时,人们告诉我,这太“天真/便宜”,可能不会帮助我IRL(他们真是太神奇了)。因此,我决定接受他们的建议,并进行微核设计。似乎更有趣的oo
警告!我的手工制作的微粒设计会触发您。例如,我将设备驱动程序放在用户空间和调度程序中,并在内核空间内(基本上不是真正遵循“适当/流行”设计)。
只是给我一些时间。我继续学习>。<
这是内核的总体概述。 (Todo:将很快更新...)

TODO:整体操作系统规格。什么是什么和未来目标。


|-- 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 VIRD机器上。
负责启动内核的部分(以及OS)称为Shim。这是一小部分代码,与内核图像并驾齐驱,负责引导系统。
它可以在内核控制之前处理一些操作。
参考:SEL4 -Elfloader
在kmain()之前
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)。在这里,我使用Micro一词来使内核尽可能简单。这意味着:
以上所有内容都需要作为用户空间应用程序实现。
内核将提供以下服务和功能:
mmap() )msgsend() , msgrecv() )thread_create() )intr_attach() )gettimeofday() )yield() )内核需要启动加载程序的[初始]用户图像。该图像应包含内核将启动的第一个精灵可执行文件(可能是root task和process manager )。
可以将使用者图像视为Linux系统中使用的启动。
内核提供的所有内容的完整列表和内部工作的工作将在后面进行解释。我还没有实施它们。
至于参考,我高度使用了以下微粒和OS:
托多:一些有趣的东西。是什么等待着他们推出操作系统的人?
将实施以下服务:
services.config )要构建并运行操作系统,您需要三件事: ARM GNU Toolchain , QEMU和一点Patience™。
可以在您喜欢的操作系统上构建所有内容。 ARM GNU Toolchain都可以在Windows , MacOS和GNU/Linux上使用。但是,我尚未测试Windows 。因此,您一个人在那个领域。对不起 :(
以下步骤是针对GNU/Linux(AARCH64)主机的。
0。确保您有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工具链下载网页。
选择适当的Aarch64裸机目标要下载。版本不重要,因此请选择最新的版本。但是,您下载的托管工具链确实很重要。选择为自己的操作系统创建的一个。
例如,如果您的操作系统是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 Build
$ make all构建以消息构建完整结束。享受生活<3 。如果您看不到,请与我联系。我将尝试解决问题>。<
Westeros只能使用QEMU运行。我没有计划为现实世界硬件制作完整的图像。最初,我的想法是模仿Pi 4b的Raspberrry Pi 4B ,但我意识到在测试和脱身时可能并不是“初学者友好的”。所以,Qemu是!
无耻的插头时间!如果您想要更多有关QEMU的信息,请访问我的QEMU_STARTER GITHUB。
0。确保您安装了qemu-system-aarch64
$ apt install qemu-system qemu-utils # if using `apt`
$ pacman -S qemu-full # if using `pacman`1。推出Westeros
$ make run截至2023年7月9日,Westeros直接空了!因此,除了在终端上查看一些非常基本的内核消息外,您无能为力:/
再说一次,维斯特罗斯是一个业余爱好者操作系统和学习过程。您应该真正尝试探索其源代码。我敢肯定,您在那里会很开心。
TODO:将用户导航到另一个基本上是文档的读数。