首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基本操作系统内核编程

基本操作系统内核编程
EN

Stack Overflow用户
提问于 2015-03-06 20:08:44
回答 3查看 1.6K关注 0票数 2

我最近开始对操作系统的主题感兴趣。我有几件事让我心烦意乱,但我决定把问题分开。

假设我们正在为市场上推出的新指令集体系结构设计一个内核。这里没有C运行库,也没有任何东西。只为该ISA提供兼容的编译器。

这可能意味着内核程序员可以使用的唯一C结构只有基本赋值操作符、位运算符和循环。这是正确的吗?

如果是这样的话,如何在最低层次上实现更复杂的事情,如主存I/O和进程调度?它们只能在纯程序集中实现吗?

那么,用C(例如Linux)编写内核意味着什么呢?那么,内核的某些部分是在程序集中编写的吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-03-06 20:25:32

这可能意味着内核程序员可以使用的唯一C结构只有基本赋值操作符、位运算符和循环。这是正确的吗?

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

但是,像标准C库这样的库将不可用,您必须编写自己的实现。特别是,这意味着在您自己实现mallocfree之前没有它们。

如果是这样的话,如何在最低层次上实现更复杂的事情,如主存I/O和进程调度?它们只能在纯程序集中实现吗?

内存I/O级别要低得多。,由计算机上的CPU、BIOS和其他各种硬件处理。值得庆幸的是,操作系统不必为此烦恼(除了一些例外,例如一些地址被保留,以及一些内存管理功能)。

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

那么,用C(例如linux)编写内核意味着什么呢?那么,内核的某些部分是在程序集中编写的吗?

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

但是C是一种可移植的语言,它不需要这样低层次的特定于体系结构的概念(尽管理论上您可以从包含编译器本质和内联.c的文件中完成所有事情)。在汇编程序例程中抽象这一点更有用,并在一个干净的接口之上构建C代码,如果您想将操作系统移植到另一个体系结构中,可以维护这个接口。

如果您对这个主题感兴趣,我强烈建议您访问操作系统开发Wiki,它是有关操作系统的一个很好的信息来源,您将发现许多与您有共同兴趣的爱好者。

票数 7
EN

Stack Overflow用户

发布于 2015-03-06 20:26:50

在汇编程序中需要编写的唯一代码是:

  • 上下文切换(将一个抽象进程的机器状态交换给另一个抽象进程)
  • 访问设备寄存器(如果这些设备是内存映射的,您甚至不需要这样做)
  • 中断处理程序的输入和退出(这是一种上下文切换)
  • 也许是一个引导加载程序

在C代码中,您应该能够做的其他任何事情。

如果您想看到这项工作完成得非常出色,您应该查看一下多学操作系统,它可以追溯到60年代中期,支持大规模的信息服务(多个CPU、虚拟内存,.)。这几乎完全是用PL/1 (一种类似C的语言)编码的,只有非常小的位编码在支持Multics的Honeywell处理器的本地汇编语言中。在展示Multics的工作原理和清洁程度方面,关于Multics的Organick书是值得它的重量的。(取而代之的是"Eunuchs“)。

在某些地方,无论如何在汇编程序中编写代码都是值得的。不管编译器的代码生成器的质量如何,您都可以在汇编程序中比编译器更好地处理在时间关键区域发生的某些例程。我期望这件事发生的地方:调度器,系统调用输入和退出。其他地方仅如测量所示。(在较旧的、小得多的系统上,人们倾向于使用大量的汇编程序编写操作系统,但这与执行效率一样节省空间,C编译器几乎没有那么好)。

票数 2
EN

Stack Overflow用户

发布于 2015-03-07 00:35:30

我想知道,一个“上市”的新架构怎么还没有某种类型的操作系统呢?

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28906788

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档