如何判断程序运行在内核空间还是用户空间?

如何判断程序运行在内核空间还是用户空间?

我正在从头开始制作 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)。

相关内容