
私はLinux OSをゼロから作っていました。これこの記事では、Linux カーネルが起動すると hello world と表示されるだけの最小限の Linux OS を作成します。
そこで私の質問は、helloworld プログラムがどの空間 [カーネルまたはユーザー空間] で実行されているかということです。私の良心ではカーネル空間で実行されていると思いますが、ユーザー空間で実行させるにはどうすればよいのでしょうか。
長い記事を読みたくない人のために、簡単に説明します。
- USB フラッシュ ドライブ (Linux システムでは /dev/sdb) を ext4 ファイル形式でフォーマットしました。
- /mnt/mylinux フォルダにマウントしました。
- その中に /boot と /bin フォルダを作成しました。
- Linuxカーネルのコピー(githubのソースコードからコンパイルしました。)bzImageを/bootフォルダに配置しました
- /dev/sdb の /boot フォルダに grub2 をインストールし、init プログラムを指定するための 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 ではありません)。