
Я делал ОС Linux с нуля. Я наткнулся наэтотстатья, в которой создается минимальная версия ОС Linux, которая просто выводит «Hello World» после загрузки ядра Linux.
Итак, мой вопрос: в каком пространстве [ядро или пользовательское пространство] запущена такая программа helloworld? Моя совесть говорит, что это пространство ядра, тогда как мне заставить ее работать в пользовательском пространстве?
Для тех, кто не хочет читать эту длинную статью, вот ее краткий обзор.
- Я отформатировал свой USB-флеш-накопитель [/dev/sdb в моей системе Linux] в файловом формате ext4.
- Смонтировал его в папку /mnt/mylinux.
- Создал в нем папки /boot и /bin.
- Разместил копию ядра Linux [я скомпилировал из исходного кода github.] bzImage в папке /boot
- Установил grub2 в папку /boot на /dev/sdb и создал файл grub.cfg для указания моей программы инициализации.
Моя программа инициализации.
#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).