Portability

来自osdev
跳到导航 跳到搜索

理论

虽然你可能满足于编写一个仅在x86 IBM兼容计算机上运行的内核,但事实是,还有许多其他平台可以编写内核。 这些范围从久远已经死亡的机器 (例如基于Amiga和Alpha处理器的计算机) 到相关的ARM架构。 传统上,操作系统是特定于体系结构的,该体系结构允许用户程序充分利用其硬件设计。 UNIX但是,随着C编程语言的引入而改变了这一点,该语言允许UNIX (和其他程序) 仅需稍作调整即可移植到几乎所有构想的系统。 作为操作系统的核心,内核旨在处理硬件,因此操作系统可以忽略硬件更改。 但是,大多数内核代码可以在共享相似硬件的不同体系结构上重用,例如USB和PCI总线。

实践

准备工作

C和C代码可以交叉编译到许多系统上,因此,如果你可以针对gcc在其上运行,则可以为其编写内核。 某些硬件将比其他硬件更容易,更完整地记录,但是无论如何,你应该完全了解正在开发的系统,并阅读其所有手册和规范。 一旦你对它充满信心,你就可以开始了。

区别来源

你的内核将具有包含所谓的 generictargeted 代码的函数。 例如: put () 实现将是通用的,而put () 用于将字符串绘制到输出设备的屏幕驱动程序将针对特定实现。 在开始尝试为多个平台编写代码之前,请分开你的源,以便所有目标函数都位于与泛型不同的位置。 这在硬件驱动程序和纯软件之间创建了一个抽象层。 这样,将内核移植到新平台所需要做的就是重新编写平台的目标函数,通用代码可以在平台上运行。

目标代码可以进一步分为两类: 体系结构特定的代码和机器特定的代码。 特定于体系结构的代码是在不同的处理器体系结构之间有所不同的代码,例如I/O,陷阱调度和分页。 机器特定代码是在具有相同处理器体系结构的机器之间不同的代码,例如IRQ控制器,系统计时器,实时时钟和多处理器信息。 NT内核有一个包含机器特定代码的模块,称为硬件抽象层或HAL。

代码

分离目标文件后,你可以为要移植到的每个平台创建新的目标功能。 通用代码将 (通常) 在目标代码之上无问题地运行。 简要说明,请确保在重新定位后删除对象文件,因为对象文件不交叉兼容。

下一步

分离特定于体系结构的代码后,你需要开始为新平台编写驱动程序。 error 例如,如果你之前有一个x86-only内核,并且你分离出目标代码并为Raspi编写目标代码,为了使你的操作系统与用户实际接口,你必须为屏幕和音频控制器等硬件编写设备驱动程序。

示例目标函数

  • 启动 (通常是程序集存根)
  • CPU特定功能 (I/O,陷阱调度,分页,上下文切换,SMP)
  • 计时器 (PIT,RTC,APIC计时器,HPET)

示例通用函数

  • malloc() (不是分页!)
  • 任务计划程序
  • 字符串解析函数
  • 缓冲I/O (gets,putchar等)