微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

光秃秃的骨头OS内核编程

我最近开始对操作系统的话题感兴趣。 我有几件事情在脑海中沉重,但是我决定把问题分开。

假设我们正在devise一个新的指令集架构的内核,这个架构已经在市场上出现了。 没有C运行时库,什么也没有。 只有一个兼容的ISA编译器。

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

如果是这样的话,最主要的内存I / O和进程调度在最底层是如何实现的呢? 他们只能在纯assembly中实施吗?

将Linux内核作为路由器来实现

embedded式Linux PPC32dynamic内存检查工具?

I2C设备的linux驱动

将内核模块标题导出到用户空间

什么是“struct file_operations”参数?

这意味着什么,一个内核写在C(例如Linux)。 内核的某些部分是固有地写在汇编中的呢?

Linux:好友系统可用内存

buildroot自定义内核在1MB以下

目前的Linux内核debugging技术

Windows 7驱动程序ioctl调用

Linux如何知道要调用哪个ioctl函数

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

几乎所有的C语言功能都可以在你的内核中工作,而不需要任何特定的运行时支持,你的C编译器就可以把它们转换成汇编程序,在内核模式下运行,就像在普通的用户模式程序中一样。

但是,像标准C库这样的库将不可用,您将不得不编写自己的实现。 特别是这意味着没有malloc和free直到你自己实现它们。

如果是这样的话,最主要的内存I / O和进程调度在最底层是如何实现的呢? 他们只能在纯装配中实施吗?

内存I / O是由您的计算机上的cpu,BIOS和各种其他硬件处理的更低级别的东西 。 幸运的是,操作系统不必担心这一点(除了一些例外,比如某些地址被保留,以及一些内存管理功能)。

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

这意味着什么,一个内核写在C(例如Linux)。 内核的某些部分固有地写在汇编中呢?

内核的某些部分将依赖于体系结构,必须用ASM编写。 例如, 在x86模式之间切换 (例如运行16位代码,或作为启动过程的一部分)或中断处理只能用一些受保护的ASM指令完成。 您选择的体系结构的参考手册(例如x86和x86架构的x86 架构软件开发人员手册)是查找这些细节的首选。

但是C是一种可移植的语言,它不需要这种低层次的体系结构特定的概念(尽管理论上可以做所有的事情,包括具有编译器内在函数和内联ASM的.c文件)。 把这个东西抽象成汇编程序是比较有用的,如果你想把你的操作系统移植到另一个体系结构上,你可以在一个干净的界面上构建你的C代码

如果您对这个主题感兴趣,我强烈建议您访问OS Development Wiki ,这是关于操作系统的一个很好的信息来源,您会发现很多有兴趣的爱好者。

关于您需要在汇编程序中编码的唯一信息是:

上下文切换(将一个抽象进程的机器状态换成另一个抽象进程)

访问设备寄存器(如果设备是内存映射的,你甚至不需要这个)

进入和退出中断处理程序(这是一种上下文切换)

也许是一个引导程序

否则,你应该可以在C代码中完成。

如果你想看到这个工作做得非常好,你应该去看一下从60年代中期开始支持大规模信息服务(多cpu,虚拟内存……)的Multics OS。 这几乎完全以PL / 1(一种类似C的语言)编码,只有非常小的位以霍尼韦尔处理器的本机汇编语言编码,支持Multics。 有关Multics的Organick书籍对于展示Multics如何工作以及如何清理大部分内容来说是值得的。 (我们得到了“太监”)。

无论如何,有一些地方值得用汇编代码。 无论编译器的代码生成器的质量如何,您都可以使用汇编语言对编译器执行的时间关键区域中出现的某些例程进行手动编写。 我期望这个问题的地方:调度程序,系统调用进入和退出。 其他地方只是测量表明。 (在较小的系统上,人们倾向于使用大量的汇编语言来编写操作系统,但是为了节省空间和为了提高执行效率,C语言编译器并没有那么好)。

我想知道一个新的“市场”架构是不是已经有了某种类型的操作系统。

设备驱动程序 – 有人将不得不为此编写代码,也许一个驱动程序的BIOS,另一个操作系统。 内存映射I / O可能会因硬件而变得复杂,例如带有一组描述符的控制器,每个描述符都包含一个物理地址和长度。 如果操作系统支持虚拟内存,则该内存必须“锁定”,并获得物理地址才能对控制器进行编程。 这就是拥有一组描述符的原因,因此单个内存映射I / O可以处理已经映射到连续虚拟地址空间的分散物理页面

汇编代码 – 这里的其他注释已经注意到一些汇编将是必需的(上下文切换,中断处理程序(可以调用C函数,所以大部分代码可以在C中))。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐