裸骨OS内核编程

Mar*_*ark 2 c linux assembly operating-system kernel

我最近开始对操作系统的主题感兴趣.我有几件事情让我头疼,但我决定分开问题.

让我们假设我们正在为市场上出现的新指令集架构设计内核.没有C运行时库,没有任何东西.只有该ISA的兼容编译器.

据推测,这意味着内核程序员可用的唯一C构造只是基本赋值运算符,按位运算符和循环.它是否正确?

如果是这样,那么如何在最低级别实现主存储器I/O和进程调度等更复杂的事情?它们只能用纯装配实现吗?

那么,用C语言编写内核(例如Linux)意味着什么.内核的某些部分本身是用汇编语言编写的吗?

tux*_*ux3 7

据推测,这意味着内核程序员可用的唯一C构造只是基本赋值运算符,按位运算符和循环.它是否正确?

几乎所有C语言功能仍然可以在您的内核中运行而无需任何特定的运行时支持,您的C编译器将能够将它们转换为可以在内核模式下运行的汇编程序,就像在普通用户模式程序中一样.

但是,诸如标准C库之类的库将不可用,您将必须编写自己的实现.特别是这意味着没有malloc,free直到你自己实现它们.

如果是这样,那么如何在最低级别实现主存储器I/O和进程调度等更复杂的事情?它们只能用纯装配实现吗?

内存I/O是一个更低级别的内容,由CPU,BIOS和计算机上的各种其他硬件处理.谢天谢地,操作系统不必为此烦恼(有一些例外,例如某些地址被保留,以及一些内存管理功能).

进程调度是一种在大多数体系结构的机器代码级别上并不存在的概念.x86确实有任务和硬件任务切换的概念,没有人使用它.这是操作系统根据需要设置的抽象,您必须自己实现它,或者如果您不想花费精力,您可以决定使用单任务操作系统,它仍然可以工作.

那么,对于用C语言编写的内核(例如linux)来说,这意味着什么.内核的某些部分本身是用汇编语言编写的吗?

内核的某些部分将严重依赖于体系结构,必须使用ASM编写.例如,在x86模式之间切换(例如,运行16位代码,或作为引导过程的一部分)或中断处理只能通过一些受保护的ASM指令来完成.您选择的体系结构的参考手册,例如x86 的英特尔®64和IA-32架构软件开发人员手册,是第一个查找这些细节的地方.

但是C是一种可移植的语言,它不需要这种低级别的体系结构特定的概念(尽管理论上你可以从带有编译器内在函数和内联ASM的.c文件中做所有事情).在汇编程序中抽象出来更有用,并在一个干净的界面上构建你的C代码,如果你想将操作系统移植到另一个架构,你可以维护它.

如果您对该主题感兴趣,我强烈建议您访问OS开发Wiki,它是有关操作系统的重要信息来源,您会找到许多与您有共同兴趣的爱好者.