将内核移植到不同的架构?

Kri*_*oks 6 kernel darwin xnu mach

我想将xnu内核移植到ARM架构,最终目标是能够在Qemu中运行完整的内核.虽然我确实意识到这是一项非常艰巨的任务,但我仍然想要了解它.

据我所知,你打算为内核(osfmk/arm/start.s)编写一个入口点,在那里你可以进行一般初始化(MMU和PlatformExpert),之后可以启动Kext/IOKit子系统并加载CPU特定的扩展(即陷阱, GPIO,时钟),它们预先链接到二进制文件或由引导加载程序加载(因为由于NAND扩展尚不可用,内核无法与文件系统交互).

虽然我对ARM CPU如何工作有一个大概的了解,但我甚至不知道从哪里开始使用该xnu端口,因为我不完全确定如何:

  • 进行低级调试(因为内核调试工具在启动期间早期不可用).
  • 将ARM分支与内核源代码树的其余部分集成(即确保内容osfmk/kern正在工作).
  • 为独立于平台的内核创建一个理智的环境来start(machine_startup());
  • 修复主内核代码中的一些特定于平台的代码(大多数平台代码仅限于此,osfmk/platform_name但有些代码必须集成到osfmk/kern其他代码中).

是否有任何关于将XNU(或至少Mach)内核移植到不同平台的指南,就像Linux指南一样?

Hot*_*cks 2

无法给你答案,但给你一些提示:

“大佬”在带有特殊硬件的系统上完成此类工作,该硬件允许处理器单周期运行、检查寄存器等。并且他们可能在具有相同设施的仿真器上完成大部分工作。硬件调试器设置可能超出了您的构建能力(而且购买起来有点贵),但模拟器是完全可行的(这就是盖茨和艾伦开始使用 Altair BASIC 的方式 - 如果艾伦没有编写模拟器,盖茨就会仍在哈佛玩电子游戏)。

如果没有完整的调试器,如果您附加了任何类型的字符显示器,则可以在正在调试的代码中嵌入指令,以便随着代码的进行将字符写入显示器。路径 A 可能会在下一个位置写入“A”(保存在某个保留内存字中的索引),而路径 B 会写入“B”等。非常粗糙,但有时对于小型项目来说已经足够了。

所以我想我建议先编写模拟器。无论如何,这是熟悉处理器的好方法。

(至于集成东西,我总是只是说“嘿,杰里米!为我集成这个,好吗?”)