c - 内核(以及一般的操作系统)是如何用 C 编写的?

标签 c operating-system kernel

我试图了解您是如何开始用 C 之类的语言编写操作系统的。

我一直使用 C 来编写应用程序 - 使用像 malloc 这样的命令和fork等等来向操作系统请求东西。如果在对操作系统本身(或者特别是内核)进行编程时这些方法不存在,那么如何编写它们?

如何实现内存和进程管理等,特别是哪些函数可用以及公开哪些函数允许您用 C 而不是汇编程序来执行此操作? (你调用什么来与内存/设备/中断交互?)

我可以想象这不是一个小问题,所以我非常高兴得到一个包含一些进一步阅读的答案,但如果您能够总结与每个问题相关的要点,那将非常方便为了我!

提前致谢!

编辑(8/3/20):

此相关问题附带了一些很好的资源,有助于回答该问题:

What are some resources for getting started in operating system development?

最佳答案

How do you implement memory

编写自己的分配器是一种常见的系统编程练习。您从“外部”唯一需要的是要管理的内存区域。如果您正在裸机编程,您可能会有一个可用的内存映射来描述哪些区域是 RAM。您可以使用 malloc 来管理这些。

and process management

现代操作系统上的进程有很多内容。它们通常有自己的页表、上下文(在进程挂起时保存的寄存器)和许多其他特定于进程的数据结构。

您可以在 C 中设置的数据结构,但它们的“激活”(切换页表、保存/恢复上下文)通常超出了可移植 C 中可能实现的范围。对于那些您要么有汇编例程,要么有一些内联汇编与C 代码。

and so on, specifically what functions are available and what is exposed to allows you to do this in C instead of assembler?

有托管和独立的 C 实现。如果您编写自己的操作系统,则通常处于独立的 C 环境中,并且没有标准库提供的函数可供您使用。您依赖自己的代码、编写汇编例程或使用编译器内部函数。

what do you call to interact with memory

您可以将整数转换为指针并操作指针。 volatile 允许您告诉编译器您绝对希望按照写入的顺序进行读/写。

devices

许多设备都是内存映射的,这意味着您可以像读取/写入内存一样进行通信(简化;缓存可能会使这变得有点棘手)。其他设备可通过专用 I/O 端口进行寻址。这些需要特殊的指令,编译器有内在函数,或者您需要在汇编中实现(您可以从 C 调用)。

interrupts?

像上面一样。启用/禁用中断等部分可能需要专用指令。设置中断处理程序可能只需将函数指针写入正确的地址即可。

I'm more than happy for an answer that includes some further reading but if you'd be able to summarise the main points related to each question that would be super handy for me!

我的建议是给自己买一个 ARM Cortex-M 并开始使用它。评论中指出的 osdev 也是一个非常好的资源。

关于c - 内核(以及一般的操作系统)是如何用 C 编写的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66520418/

相关文章:

c - 如何使用C API解码openssl命令行生成的aes-256-cbc文件?

c - 加载由 malloc 分配的数组时发生访问冲突?

c++ - 如何从 C++ 重新启动 Mac OS

jquery - 我可以在jquery中检测客户端操作系统是专门的Mac雪豹吗?

linux - 什么是 hrtick_clear(rq);在 linux 调度程序中?

linux - 在 Linux 内核级别限制用户登录

c - scanf 无法识别格式 %zu

c++ - RTOS 中第一个任务切换的代码

Linux 内核头文件组织

c++ - C/C++ 中 >=、<= 与 <、>、== 操作的复杂性