ホームページ  >  記事  >  システムチュートリアル  >  Linuxのカーネル空間とユーザー空間の詳しい説明

Linuxのカーネル空間とユーザー空間の詳しい説明

王林
王林転載
2024-02-13 21:36:151041ブラウズ

Linux ドライバーは通常、カーネル空間で実行されますが、ユーザー空間でも実行できます。以下では、カーネル空間とユーザー空間の概念とそれらを判断する方法を詳細に分析します。

Linux は、仮想アドレスとリニア アドレスが常に一致するようにセグメンテーションのメカニズムを簡素化しているため、Linux の仮想アドレス空間も 0 ~ 4G です。 Linux カーネルは、この 4G バイトのスペースを 2 つの部分に分割します。最上位の 1G バイト (仮想アドレス 0xC0000000 から 0xFFFFFFFF まで) はカーネルによって使用され、「カーネル空間」と呼ばれます。下位 3G バイト (仮想アドレス 0x00000000 から 0xBFFFFFFF) は各プロセスによって使用され、「ユーザー空間」と呼ばれます。各プロセスはシステム コールを通じてカーネルに入ることができるため、Linux カーネルはシステム内のすべてのプロセスで構成されます。したがって、特定のプロセスの観点から見ると、各プロセスは 4G バイトの仮想空間を持つことができます。

Linux は 2 レベルの保護メカニズムを使用します。レベル 0 はカーネル用、レベル 3 はユーザー プログラム用です。図からわかるように (図はここでは表現できません)、各プロセスは独自のプライベート ユーザー空間 (0 ~ 3G) を持ち、この空間はシステム内の他のプロセスからは見えません。仮想カーネル空間の上位 1GB は、すべてのプロセスとカーネルによって共有されます。

Linuxのカーネル空間とユーザー空間の詳しい説明

カーネル空間にはカーネル コードとデータが格納され、プロセスのユーザー空間にはユーザー プログラムのコードとデータが格納されます。カーネル空間であれ、ユーザー空間であれ、それらはすべて仮想空間内にあります。カーネル空間は各仮想空間の上位 1GB を占有しますが、物理メモリへのマッピングは常に最小アドレス (0x00000000) から始まります。カーネル空間の場合、そのアドレス マッピングは非常に単純な線形マッピングであり、0xC0000000 は物理アドレスと線形アドレスの間の変位であり、Linux コードでは PAGE_OFFSET と呼ばれます。

それでは、カーネル空間とユーザー空間の間でどのように通信するのでしょうか?通信は通常、システムコールを通じて行われます。

ドライバーがユーザー モード ドライバーであるかカーネル モード ドライバーであるかを判断するにはどうすればよいですか?判断基準は何ですか?

ユーザー空間モード ドライバーは通常、ドライバーの IO 空間をユーザー空間にマッピングするなど、システム コールを通じてハードウェアへのアクセスを完了します。したがって、主な判断基準はシステムコールです。また、ユーザーモードのリンクリストとカーネルモードのリンクリストは異なり、ユーザーモードではprintf、カーネルモードではprintkが使用されます。ユーザー モードの各アプリケーション空間は仮想的で比較的独立していますが、カーネル モードでは独立していないため、プログラミングには細心の注意が必要です。もちろん、ユーザー モード プログラムとカーネル モード プログラム間の通信は、ioctl、sysfs、proc などを通じて実現できます。

カーネル モードとユーザー モード

タスク (プロセス) がシステム コールを実行し、実行のためにカーネル コードにトラップされるとき、プロセスはカーネル実行状態 (または単にカーネル状態と呼ばれます) にあると言います。現時点では、プロセッサは最高の特権レベル (レベル 0) のカーネル コードで実行されています。プロセスがカーネル モードの場合、実行されるカーネル コードは現在のプロセスのカーネル スタックを使用します。各プロセスには独自のカーネル スタックがあります。プロセスがユーザー独自のコードを実行しているとき、そのプロセスはユーザー実行状態 (ユーザー状態) にあると言われます。つまり、プロセッサは最も低い特権レベル (レベル 3) のユーザー コードで実行されます。ユーザー プログラムの実行中に、割り込みプログラムによって突然中断された場合、ユーザー プログラムは、象徴的にプロセスのカーネル状態にあるとも言えます。割り込みハンドラーは現在のプロセスのカーネル スタックを使用するためです。これは、カーネル モードのプロセスの状態に似ています。

プロセスコンテキストと割り込みコンテキスト

プロセッサは常に次のいずれかの状態になります:

1. プロセス コンテキストで実行されているカーネル状態。カーネルは、カーネル空間で実行されているプロセスを表します。

2. 割り込みコンテキストで実行されるカーネル状態。カーネルは、カーネル空間で実行されるハードウェアを表します。

3. ユーザー モード、ユーザー空間で実行されます。

ユーザー空間アプリケーションは、システムコールを通じてカーネル空間に入ります。このとき、ユーザー空間プロセスは多くの変数とパラメータ値をカーネルに渡す必要があり、カーネルモードの実行時には、ユーザープロセスのいくつかのレジスタ値と変数も保存する必要があります。いわゆる「プロセスコンテキスト」は、ユーザープロセスによってカーネルに渡されるパラメータ、およびカーネルとその時点の環境によって保存される変数とレジスタ値の完全なセットとして見ることができます。 。

ハードウェアが信号をトリガーし、カーネルが割り込みハンドラーを呼び出してカーネル空間に入ります。このプロセスでは、ハードウェアのいくつかの変数とパラメータもカーネルに渡す必要があり、カーネルはこれらのパラメータを使用して割り込み処理を実行します。いわゆる「割り込みコンテキスト」は、実際には、ハードウェアおよびカーネルが保存する必要があるその他の環境 (主に現在割り込まれているプロセス環境) によって渡されるこれらのパラメーターとみなすことができます。

以上がLinuxのカーネル空間とユーザー空間の詳しい説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はlxlinux.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。