我正在从头开始制作 Linux 操作系统。我遇到了这文章,它创建了一个最低限度的 Linux 操作系统,一旦 Linux 内核启动,它只会打印 hello world。
所以我的问题是,这样的 helloworld 程序在哪个空间[内核或用户空间]运行?良心说是内核空间,那么如何让它运行在用户空间呢?
对于那些不想阅读那篇冗长文章的人来说,这里的作用很简单。
- 我用 ext4 文件格式格式化了我的 USB 闪存驱动器 [Linux 系统上的 /dev/sdb]。
- 将其安装到 /mnt/mylinux 文件夹。
- 在其中创建文件夹 /boot 和 /bin。
- 将 Linux 内核的副本 [我从 github 源代码编译。] bzImage 放在 /boot 文件夹中
- 将 grub2 安装在 /dev/sdb 的 /boot 文件夹中,并创建 grub.cfg 文件来指定我的 init 程序。
我的初始化程序。
#include <stdio.h>
#include <unistd.h>
int main(void){
while(1){
printf("Hello World\n");
sleep(1);
}
}
我的 init 程序是静态编译的并放置在 /bin 文件夹中。
所以当我启动这个驱动器时,它开始打印:Hello World
答案1
就您而言,它是一个用户空间:您使用标准库,因此您使用用户空间 API 来完成工作。
如果你的程序是由内核执行的,那么你只有内部内核 API(即 kprintf),并且对你可以执行的操作有很多限制。此外,您需要放入内核或作为内核模块。内核不会将外部代码作为内核空间执行。
注意:存在混合情况,但始终由内核启动,以实现持久进程,而不是阻止内核。在这种情况下,代码由调度程序处理,并且在进程列表中可见(通常是低 PID 号,但不是 1)。