私は最初からLinuxオペレーティングシステムを作成しています。私が出会ったこれこの記事では、Linuxカーネルが起動すると、単にhello worldを印刷する最小のLinuxオペレーティングシステムを作成します。
だから私の質問は、そのようなhelloworldプログラムがどのスペース(カーネルまたはユーザースペース)で実行されるのかです。良心はカーネル空間と呼ばれますが、どのようにユーザー空間で実行させることができますか?
長い記事を読みたくない人のためにここで行われていることは簡単です。
- USBフラッシュドライブ[Linuxシステムの場合/dev/sdb]をext4ファイル形式でフォーマットしました。
- /mnt/mylinuxフォルダにインストールしてください。
- そこに/bootおよび/binフォルダを作成します。
- Linuxカーネルのコピー[Githubソースからコンパイルしました。 ] bzImageは/ bootフォルダにあります。
- /dev/sdbの/bootフォルダにgrub2をインストールし、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ではありません)。