カーネル空間とユーザー空間の違いは何ですか?


回答:


117

本当に単純化答えは、カーネルがカーネル空間で実行され、通常のプログラムはユーザ空間で実行することです。ユーザー空間は基本的にサンドボックスの一種です-ユーザープログラムを制限するため、他のプログラムやOSカーネルが所有するメモリ(および他のリソース)を乱用することはできません。これにより、マシンのクラッシュなどの悪いことを行う能力が制限されます(ただし、通常は完全になくなるわけではありません)。

カーネルはオペレーティングシステムの中核です。通常は、すべてのメモリとマシンハードウェア(およびマシン上のその他すべて)にフルアクセスできます。マシンをできるだけ安定に保つには、通常、最も信頼できる、十分にテストされたコードのみをカーネルモード/カーネルスペースで実行する必要があります。

スタックはメモリの別の部分にすぎないため、当然、残りのメモリと一緒に分離されます。


4
私のシステムに10個ほどのプロセスがあるとしたら、各プロセスには、ユーザースタックとカーネルスタックに分かれた独自のスタックがあるのですか、それともすべてのプロセスが単一のカーネルスタックを共有しているのですか?
kc3

10
@ kc3:少なくとも部分的にはOSに依存しますが、ほとんどの場合、カーネルがプロセス(I / Oなど)に代わって何かを実行しているときに使用される各プロセスのカーネルモードスタックと、少なくとも1つカーネルによる内部使用(スケジューリングなど)専用のカーネルスタック。
ジェリーコフィン

2
カーネルプロセスの存在はありますか、そして質問されたユーザー空間プロセスとの関係や違いは何ですか?
Victor Choy

それ自体、ユーザー空間プロセスを実行するには、カーネル空間にマップする必要がありますか?
roottraveller 2017

@roottraveller:何があなたにそのアイデアを与えたのかはわかりませんが、まったく違います。同時に、ユーザースペースプロセスに通常、カーネル空間メモリが(多かれ少なかれ隠されています)あるので、(たとえば)プロセスには、ユーザースペーススタックと、カーネルスペーススタックがあります。カーネルモードで実行する必要があるOS呼び出しを行います。
Jerry Coffin 2017

64

ランダムアクセスメモリ(RAM)は、論理的に、すなわち2つの別個の領域に分けることができる- 。カーネル空間とユーザ空間(物理アドレス RAMのは、実際に分割されていないだけで仮想アドレス、このすべてによって実装MMU

カーネルは、それを利用できるメモリの一部で実行されます。カーネルはメモリのすべての部分にアクセスできるため、メモリのこの部分には通常のユーザーのプロセスから直接アクセスできません。カーネルの一部にアクセスするには、ユーザー・プロセスが呼び出し、すなわち事前に定義されたシステムを使用する必要がありopenreadwriteなど。また、Cのようなライブラリ関数printf呼び出しシステムコールwriteターンインチ

システムコールは、ユーザープロセスとカーネルプロセス間のインターフェースとして機能します。アクセス権は、ユーザーが無意識のうちにカーネルを乱用するのを防ぐために、カーネルスペースに配置されます。

したがって、システムコールが発生すると、ソフトウェア割り込みがカーネルに送信されます。CPUは、一時的に制御を関連する割り込みハンドラルーチンに渡すことができます。割り込みによって停止されたカーネルプロセスは、割り込みハンドラルーチンがそのジョブを終了した後に再開されます。


2
この回答の最初の部分は正しくありません。RAMはカーネルとユーザー空間に分割されません。仮想メモリです。回答を編集してみましたが、編集キューは何日もいっぱいです。修正してください。詳細については、下記のVarunの回答をご覧ください。
MeLikeyCode 2017年

1
@MeLikeyCode広く理解できる答えを提供しようとする状況において、それは正当化できる単純化ではありませんか?
problemofficer 2017年

2
@problemofficerは、大幅な簡略化は誤った基本的な理解をもたらす可能性があると思います。それぞれが物理メモリがユーザー空間とカーネル空間に分割されていないことを理解する必要がありますが、カーネルは仮想メモリの抽象化を提供します。これはカーネルとユーザー空間に分割され、後で物理メモリにマッピングされます。
dshil 2017

22

カーネルスペースと仮想スペースは、仮想メモリの概念です。Ram(実際のメモリ)がカーネルスペースとユーザースペースに分割されるわけではありません。各プロセスには、カーネルとユーザー空間に分割された仮想メモリが与えられます。

つまり、「ランダムアクセスメモリ(RAM)は、カーネル空間とユーザー空間という2つの異なる領域に分割できます。」間違っている。

&「カーネルスペースvsユーザースペース」について

プロセスが作成され、その仮想メモリがユーザー空間とカーネル空間に分割されると、ユーザー空間領域にはデータ、コード、スタック、プロセスのヒープが含まれ、カーネル空間にはプロセスのページテーブルなどが含まれます。 、カーネルデータ構造、カーネルコードなど。カーネルスペースコードを実行するには、制御をカーネルモードに移行する必要があり(システムコールに0x80ソフトウェア割り込みを使用)、カーネルスタックは基本的にカーネルスペースで実行中のすべてのプロセス間で共有されます。


1
一般的なプロセスには、独自のカーネルスペースとユーザースペースがありますか?
Victor Choy

@VictorChoy、プロセスは、ユーザーとカーネルの2つのモードで実行されます。プロセスが見るメモリはそれに固有です。しかし、カーネルモードで実行されているすべてのプロセス(カーネルコードを実行)には、カーネルスペースという1つのスペースしかありません。
dshil 2017

また、プロセスが作成されると、その仮想メモリは2つの部分(ユーザーとカーネル)に分割され、仮想アドレスの一部はユーザーモード用に、もう1つはカーネルモード用に予約されることに注意してください。
dshil 2017

19

CPUリングは最も明確な違いです

x86保護モードでは、CPUは常に4つのリングのいずれかにあります。Linuxカーネルは0と3のみを使用します。

  • カーネルの場合は0
  • ユーザー用3

これは、カーネル対ユーザーランドの最もハードで高速な定義です。

Linuxがリング1および2を使用しない理由:CPU特権リング:リング1および2が使用されないのはなぜですか?

現在のリングはどのように決定されますか?

現在のリングは、次の組み合わせで選択されます。

  • グローバル記述子テーブル:GDTエントリのメモリ内テーブル。各エントリにはPrivl、リングをエンコードするフィールドがあります。

    LGDT命令は、アドレスを現在の記述子テーブルに設定します。

    参照:http : //wiki.osdev.org/Global_Descriptor_Table

  • セグメントは、GDTのエントリのインデックスを指すCS、DSなどを登録します。

    たとえばCS = 0、GDTの最初のエントリが実行中のコードに対して現在アクティブであることを意味します。

各リングは何ができますか?

CPUチップは、次のように物理的に構築されています。

  • リング0は何でもできます

  • ring 3は、いくつかの命令を実行して、いくつかのレジスタに書き込むことができません。

    • 自分のリングを変更することはできません!それ以外の場合、それ自体をリング0に設定する可能性があり、リングは役に立たなくなります。

      つまり、現在のリングを決定する現在のセグメント記述子を変更できません。

    • はページテーブルを変更できません:x86ページングは​​どのように機能しますか?

      つまり、CR3レジスタを変更できず、ページング自体がページテーブルの変更を防ぎます。

      これにより、セキュリティ/プログラミングの容易さのために、1つのプロセスが他のプロセスのメモリを参照できなくなります。

    • 割り込みハンドラを登録できません。これらはメモリ位置への書き込みによって構成されますが、これもページングによって防止されます。

      ハンドラーはリング0で実行され、セキュリティモデルに違反します。

      つまり、LGDTおよびLIDT命令を使用できません。

    • inおよびのようなIO命令を実行できないoutため、任意のハードウェアアクセスが可能です。

      それ以外の場合、たとえば、プログラムがディスクから直接読み取ることができる場合、ファイルのアクセス許可は役に立ちません。

      より正確には、Michael Petchに感謝します。実際には、OSがリング3でIO命令を許可することが可能です。これは、実際には、タスク状態セグメントによって制御されます

      リング3がそれを最初から持っていなかった場合、リング3がそれを許可することは不可能です。

      Linuxは常にそれを拒否します。参照:LinuxがTSS経由でハードウェアコンテキストスイッチを使用しないのはなぜですか?

プログラムとオペレーティングシステムはリング間でどのように移行しますか

  • CPUがオンになると、リング0で初期プログラムの実行を開始します(まあ、それは良い概算です)。この初期プログラムはカーネルであると考えることができます(ただし、通常は、まだリング0のカーネルを呼び出すブートローダーです)。

  • ユーザランドのプロセスがカーネルは、ファイルへの書き込みのようにそれのために何かをしたいとき、それはそのような割り込み生成指示使用していますint 0x80syscallカーネルを知らせるために。x86-64 Linux syscall hello worldの例:

    .data
    hello_world:
        .ascii "hello world\n"
        hello_world_len = . - hello_world
    .text
    .global _start
    _start:
        /* write */
        mov $1, %rax
        mov $1, %rdi
        mov $hello_world, %rsi
        mov $hello_world_len, %rdx
        syscall
    
        /* exit */
        mov $60, %rax
        mov $0, %rdi
        syscall
    

    コンパイルして実行:

    as -o hello_world.o hello_world.S
    ld -o hello_world.out hello_world.o
    ./hello_world.out
    

    GitHubアップストリーム

    これが発生すると、CPUはカーネルがブート時に登録した割り込みコールバックハンドラーを呼び出します。ハンドラを登録して使用する具体的なベアメタルの例を次に示します。

    このハンドラーはリング0で実行され、カーネルがこのアクションを許可するかどうかを決定し、アクションを実行し、リング3でユーザーランドプログラムを再起動します。x86_64

  • ときにexecシステムコールが使用されている(または場合カーネルが開始されます/init)、カーネルは、レジスタおよびメモリ準備し、新しいユーザーランドプロセスのをそれがエントリポイントにジャンプし、リング3にCPUを切り替えます

  • (ページングのため)禁止されたレジスタまたはメモリアドレスへの書き込みなど、プログラムがいたずらを行おうとすると、CPUはリング0のカーネルコールバックハンドラも呼び出します。

    しかし、ユーザーランドはいたずらだったので、今回はカーネルがプロセスを強制終了するか、シグナルで警告を出す可能性があります。

  • カーネルが起動すると、一定の周波数でハードウェアクロックが設定され、定期的に割り込みが生成されます。

    このハードウェアクロックは、リング0を実行する割り込みを生成し、ウェイクアップするユーザーランドプロセスをスケジュールできるようにします。

    このようにして、プロセスがシステムコールを実行していない場合でも、スケジューリングを行うことができます。

複数のリングを持つことのポイントは何ですか?

カーネルとユーザーランドを分離することには、2つの大きな利点があります。

  • どちらか一方が他方に干渉しないことが確実になるため、プログラムを作成するのが簡単になります。たとえば、あるユーザーランドプロセスは、ページングのために別のプログラムのメモリを上書きしたり、別のプロセスに対してハードウェアを無効な状態にすることを心配する必要はありません。
  • より安全です。たとえば、ファイルのアクセス許可とメモリの分離により、ハッキングアプリが銀行データを読み取ることができなくなる可能性があります。もちろん、これはあなたがカーネルを信頼していることを前提としています。

それをいじるには?

リングを直接操作するための適切な方法であるベアメタルセットアップを作成しました:https : //github.com/cirosantilli/x86-bare-metal-examples

残念ながらユーザーランドの例を作る忍耐力はありませんでしたが、ページングの設定まで行ったので、ユーザーランドは実現可能です。プルリクエストを見たいです。

あるいは、Linuxカーネルモジュールはリング0で実行されるため、それらを使用して特権操作を試すことができます。たとえば、制御レジスターを読み取ります。プログラムから制御レジスターcr0、cr2、cr3にアクセスする方法は?セグメンテーション違反の取得

ここで便利なQEMU + Buildrootセットアップあなたのホストを殺すことなく、それを試しては。

カーネルモジュールの欠点は、他のkthreadが実行中であり、実験に干渉する可能性があることです。しかし理論的には、カーネルモジュールですべての割り込みハンドラーを引き継ぎ、システムを所有することができます。これは実際には興味深いプロジェクトです。

負のリング

負のリングは実際にはIntelのマニュアルでは参照されていませんが、実際にはリング0自体よりも多くの機能を備えたCPUモードがあるため、「負のリング」の名前に適しています。

1つの例は、仮想化で使用されるハイパーバイザーモードです。

詳細については、以下を参照してください。

ARMでは、リングは代わりに例外レベルと呼ばれますが、主な考え方は同じです。

ARMv8には4つの例外レベルがあり、一般に次のように使用されます。

  • EL0:ユーザーランド

  • EL1:カーネル(ARM用語では「スーパーバイザー」)。

    以前は統一されたアセンブリsvc呼ばれていた命令(SuperVisor Call)を入力します。これは、Linuxシステムコールを行うために使用される命令です。Hello world ARMv8の例:swi

    こんにちは。

    .text
    .global _start
    _start:
        /* write */
        mov x0, 1
        ldr x1, =msg
        ldr x2, =len
        mov x8, 64
        svc 0
    
        /* exit */
        mov x0, 0
        mov x8, 93
        svc 0
    msg:
        .ascii "hello syscall v8\n"
    len = . - msg
    

    GitHubアップストリーム

    Ubuntu 16.04のQEMUでテストします。

    sudo apt-get install qemu-user gcc-arm-linux-gnueabihf
    arm-linux-gnueabihf-as -o hello.o hello.S
    arm-linux-gnueabihf-ld -o hello hello.o
    qemu-arm hello
    

    以下は、SVCハンドラー登録してSVC呼び出しを行う具体的なベアメタルの例です。

  • EL2:ハイパーバイザーXenなど)

    hvc命令(HyperVisor Call)で入力されました。

    ハイパーバイザーはOSに対するものであり、OSはユーザーランドにとっての役割です。

    たとえば、Xenを使用すると、LinuxやWindowsなどの複数のOSを同じシステムで同時に実行でき、Linuxがユーザーランドプログラムと同じように、OSを互いに分離してセキュリティとデバッグを容易にします。

    ハイパーバイザーは、今日のクラウドインフラストラクチャの重要な部分です。ハイパーバイザーを使用すると、複数のサーバーを単一のハードウェア上で実行でき、ハードウェアの使用率を常に100%に保ち、大幅なコスト削減を実現できます。

    たとえばAWSは、KVMへの移行が発表される2017年までXenを使用していました

  • EL3:さらに別のレベル。TODOの例。

    smc指示で入力(セキュアモードコール)

ARMv8アーキテクチャリファレンスモデルDDI 0487C.a -章D1 - AArch64システムレベルプログラマモデル-図D1-1が美しく、これを示しています。

ここに画像の説明を入力してください

ARMの状況は、ARMv8.1 Virtualization Host Extensions(VHE)の登場により少し変化しました。この拡張により、カーネルはEL2で効率的に実行できます。

ここに画像の説明を入力してください

VHEは、KVMなどのLinuxカーネル内の仮想化ソリューションがXenを上回ったために作成されました(たとえば、前述のAWSのKVMへの移行を参照)。プロジェクトでは、KVMはXenよりもシンプルで、潜在的に効率的です。したがって、これらのケースでは、ホストLinuxカーネルがハイパーバイザーとして機能します。

後知恵の恩恵により、ARMの特権レベルの命名規則はx86よりも優れていることに注意してください。負のレベルは必要ありません。0は最低で3は最高です。高いレベルは、低いレベルよりも頻繁に作成される傾向があります。

現在のELは、次のMRS命令で照会できます。現在の実行モード/例外レベルは何ですか?

ARMでは、チップ領域を節約する機能を必要としない実装を可能にするために、すべての例外レベルが存在する必要はありません。ARMv8の「例外レベル」は次のように述べています。

実装には、すべての例外レベルが含まれていない場合があります。すべての実装にはEL0とEL1を含める必要があります。EL2とEL3はオプションです。

EL1に例のデフォルトのためのQEMUが、EL2とEL3は、コマンドラインオプションを有効にすることができます:A53パワーアップをエミュレートする際のqemu-システムaarch64入るEL1

Ubuntu 18.10でテストされたコードスニペット。


11

カーネルスペースとユーザースペースは、特権オペレーティングシステム機能と制限付きユーザーアプリケーションの分離です。この分離は、ユーザーアプリケーションがコンピューターを攻撃するのを防ぐために必要です。古いユーザープログラムがランダムデータをハードドライブに書き込んだり、別のユーザープログラムのメモリスペースからメモリを読み取ったりするのは悪いことです。

ユーザー空間プログラムはシステムリソースに直接アクセスできないため、オペレーティングシステムのカーネルがプログラムに代わってアクセスを処理します。ユーザー空間プログラムは通常、システムコールを介してオペレーティングシステムにこのような要求を行います。

カーネルスレッド、プロセス、スタックは同じことを意味するものではありません。これらは、ユーザー空間の対応物と同様に、カーネル空間の構成要素です。


8

各プロセスには、ページテーブルを介して物理メモリにマップする独自の4 GBの仮想メモリがあります。仮想メモリは、主に2つの部分に分割されます。プロセスを使用する場合は3 GB、カーネルを使用する場合は1 GBです。作成する変数のほとんどは、アドレス空間の最初の部分にあります。その部分はユーザー空間と呼ばれます。最後の部分はカーネルが存在する場所であり、すべてのプロセスに共通です。これはカーネルスペースと呼ばれ、このスペースのほとんどは、ブート時にカーネルイメージがロードされる物理メモリの開始位置にマップされます。


1
答えはWindowsに固有です。それを明確にする必要があります。
マシュー

1
4 GBの仮想メモリのすべてのプロセスで、1 GBはすべてのプロセスで同じでマッピングを保持するだけのカーネルスペースであると言っています。
VISHAL DAGA 2013

5

アドレス空間の最大サイズは、CPUのアドレスレジスタの長さに依存します。

32ビットアドレスレジスタを備えたシステムでは、アドレススペースの最大サイズは2 32バイト、つまり4 GiBです。同様に、64ビットシステムでは、2 64バイトをアドレス指定できます。

このようなアドレス空間は、仮想メモリまたは仮想アドレス空間と呼ばれます。実際には、物理​​RAMのサイズとは関係ありません。

Linuxプラットフォームでは、仮想アドレス空間はカーネル空間とユーザー空間に分けられます。

タスクサイズの制限またはと呼ばれるアーキテクチャ固有の定数TASK_SIZEは、分割が発生する位置を示します。

  • 0からTASK_SIZE-1 までのアドレス範囲がユーザー空間に割り当てられます。

  • TASK_SIZE最大2 32 -1(または2 64 -1)の残りはカーネル空間に割り当てられます。

たとえば、特定の32ビットシステムでは、ユーザー空間に3 GiB、カーネル空間に1 GiBを使用できます。

Unixライクなオペレーティングシステムの各アプリケーション/プログラムはプロセスです。それらのそれぞれには、プロセス識別子(または単にプロセスID、つまりPID)と呼ばれる一意の識別子があります。Linuxは、プロセスを作成するための2つのメカニズムを提供します。1。fork()システムコール、または2。exec()コール。

カーネルスレッドは軽量プロセスであり、実行中のプログラムでもあります。単一のプロセスは、同じデータとリソースを共有するが、プログラムコードを通じて異なるパスをとる複数のスレッドで構成される場合があります。Linuxは、clone()スレッドを生成するシステムコールを提供します。

カーネルスレッドの使用例には、RAMのデータ同期、スケジューラがCPU間でプロセスを分散するのを助けるなどがあります。


4

簡単に言うと、カーネルはカーネルスペースで実行され、カーネルスペースはすべてのメモリとリソースにフルアクセスできます。メモリは、カーネル用とユーザー独自のプロセス用の2つの部分に分かれています。(ユーザー空間)は通常のプログラムを実行します。スペースはカーネルスペースに直接アクセスできないため、カーネルからリソースを使用するように要求します。syscall(glibcで事前定義されたシステムコール)

異なる「ユーザースペースはカーネルの単なるテストロード」を簡素化するステートメントがあります...

明確にするために:プロセッサアーキテクチャにより、CPUはカーネルモードとユーザーモードの 2つのモードで動作でき、ハードウェア命令により、1つのモードから別のモードに切り替えることができます。

メモリは、ユーザー空間またはカーネル空間の一部としてマークできます。

CPUがユーザーモードで実行されている場合、CPUはユーザー空間にあるメモリのみにアクセスできますが、CPUがカーネルスペース内のメモリにアクセスしようとすると、「ハードウェア例外」が発生します。カーネルモードで実行されているCPUが直接アクセスできる場合、カーネル空間とユーザー空間の両方に...


2

カーネルスペースとは、メモリスペースはカーネルのみが操作できることを意味します。32ビットLinuxでは、1G(仮想メモリアドレスとして0xC0000000から0xffffffffまで)です。カーネルによって作成されたすべてのプロセスはカーネルスレッドでもあるため、1つのプロセスには2つのスタックがあります。カーネルスレッド用のスペース。

カーネルスタックは2ページ(32ビットLinuxでは8k)を占め、task_struct(約1k)と実際のスタック(約7k)を含みます。後者は、カーネル関数にいくつかの自動変数または関数呼び出しパラメーターまたは関数アドレスを格納するために使用されます。これがコードです(Processor.h(linux \ include \ asm-i386)):

#define THREAD_SIZE (2*PAGE_SIZE)
#define alloc_task_struct() ((struct task_struct *) __get_free_pages(GFP_KERNEL,1))
#define free_task_struct(p) free_pages((unsigned long) (p), 1)

__get_free_pages(GFP_KERNEL、1))は、メモリを2 ^ 1 = 2ページとして割り当てることを意味します。

しかし、プロセススタックは別のものです。そのアドレスは0xC0000000(32ビットLinux)のすぐ下にあり、そのサイズは非常に大きくなる可能性があり、ユーザー空間関数呼び出しに使用されます。

システムコールについての質問です。カーネル空間で実行されていますが、ユーザー空間のプロセスによって呼び出されました。どのように機能しますか?Linuxはそのパラメーターと関数アドレスをカーネルスタックまたはプロセススタックに配置しますか?Linuxのソリューション:すべてのシステムコールは、ソフトウェア割り込みINT 0x80によってトリガーされます。entry.S(linux \ arch \ i386 \ kernel)で定義されています。ここに例をいくつか示します。

ENTRY(sys_call_table)
.long SYMBOL_NAME(sys_ni_syscall)   /* 0  -  old "setup()" system call*/
.long SYMBOL_NAME(sys_exit)
.long SYMBOL_NAME(sys_fork)
.long SYMBOL_NAME(sys_read)
.long SYMBOL_NAME(sys_write)
.long SYMBOL_NAME(sys_open)     /* 5 */
.long SYMBOL_NAME(sys_close)

最後の質問はあなたが提唱したとても良い質問です。しかし、ソフトウェア割り込みINT 0x80だけですか?それは私にとって良い説明ではありません。ご自分で出された質問に対してソリューションがどのように機能するかを詳しく説明していただけますか?
Victor Choy

2

ことでスニルYadavが、Quoraの上:

Linuxカーネルとは、カーネルモードで実行されるすべてのものを指し、いくつかの異なる層で構成されています。最下層では、カーネルはHALを介してハードウェアと対話します。中間レベルでは、UNIXカーネルは4つの異なる領域に分かれています。4つの領域のうちの最初の領域は、キャラクターデバイス、生および調理済みTTY、および端末処理を処理します。2番目の領域は、ネットワークデバイスドライバー、ルーティングプロトコル、およびソケットを処理します。3番目の領域は、ディスクデバイスドライバー、ページおよびバッファーキャッシュ、ファイルシステム、仮想メモリ、ファイルの名前付けとマッピングを処理します。4番目と最後の領域は、プロセスのディスパッチ、スケジューリング、作成、終了、および信号処理を処理します。この上に、システムコール、割り込み、トラップを含むカーネルの最上位層があります。このレベルは、下位レベルの各機能へのインターフェースとして機能します。プログラマーは、さまざまなシステムコールと割り込みを使用して、オペレーティングシステムの機能を操作します。



1

非常に簡単な説明をしようとする

仮想メモリは、カーネル空間とユーザー空間に分かれています。カーネル空間は、カーネルプロセスが実行される仮想メモリの領域であり、ユーザー空間は、ユーザープロセスが実行される仮想メモリの領域です。

この分割は、メモリアクセス保護のために必要です。

ブートローダーがカーネルをRAM内の場所に読み込んだ後に起動するときは常に(通常、ARMベースのコントローラー上)、コントローラーがスーパーバイザーモードでFIQおよびIRQが無効になっていることを確認する必要があります。


1

カーネル空間とユーザー空間は論理的な空間です。

最近のプロセッサのほとんどは、さまざまな特権モードで実行するように設計されています。x86マシンは、4つの異なる特権モードで実行できます。 ここに画像の説明を入力してください

また、特定の機械語命令は、特定の特権モードで実行されます。

この設計により、システムを保護するか、実行環境をサンドボックス化します。

カーネルは、ハードウェアを管理し、システムの抽象化を提供するコードの一部です。したがって、すべての機械語命令にアクセスできる必要があります。そして、これは最も信頼できるソフトウェアです。したがって、最高の特権で実行する必要があります。また、リングレベル0が最も特権的なモードです。したがって、リングレベル0カーネルモードとも呼ばれます

ユーザーアプリケーションは、サードパーティベンダーが提供するソフトウェアの一部であり、完全に信頼することはできません。悪意のある人が、すべての機械語命令に完全にアクセスできた場合、システムをクラッシュさせるコードを書くことができます。したがって、アプリケーションには、限られた一連の命令へのアクセスを提供する必要があります。また、リングレベル3は最も特権の少ないモードです。したがって、すべてのアプリケーションはそのモードで実行されます。したがって、そのリングレベル3ユーザーモードとも呼ばれます

注:リングレベル1と2を取得していません。これらは基本的に中間の特権を持つモードです。したがって、デバイスドライバーコードがこの特権で実行される可能性があります。私の知る限り、Linuxはカーネルコードの実行とユーザーアプリケーションにそれぞれリングレベル0と3のみを使用します。

したがって、カーネルモードで発生するすべての操作は、カーネルスペースと見なすことができます。また、ユーザーモードで発生する操作はすべてユーザー空間と見なすことができます。


0

正解は次のとおりです。カーネル空間やユーザー空間などはありません。プロセッサ命令セットには、ページテーブルマップのルートなどの破壊的なものを設定したり、ハードウェアデバイスのメモリにアクセスしたりするための特別な権限があります。

カーネルコードには最高レベルの特権があり、ユーザーコードには最低レベルの特権があります。これにより、ユーザーコードによるシステムのクラッシュ、他のプログラムの変更などが防止されます。

一般に、カーネルコードは、ユーザーコードとは異なるメモリマップに保持されます(ユーザー空間が互いに異なるメモリマップに保持されるのと同じように)。これが「カーネルスペース」と「ユーザースペース」の用語の由来です。しかし、それは厳格な規則ではありません。たとえば、x86では間接的に割り込み/トラップハンドラーを常にマップする必要があるため、カーネルの一部(または一部のOSすべて)をユーザー空間にマップする必要があります。繰り返しますが、これは、そのようなコードにユーザー特権があることを意味するものではありません。

カーネル/ユーザー分割が必要なのはなぜですか?一部の設計者は、実際にはそれが必要であることに反対しています。マイクロカーネルアーキテクチャは、コードの最も高い特権セクションをできるだけ小さくし、すべての重要な操作をユーザー特権コードで実行するという考えに基づいています。なぜこれが良い考えであるかを検討する必要があります。これは単純な概念ではありません(利点と欠点の両方で有名です)。


0

メモリは2つの異なる領域に分かれています。

  • ユーザー空間。通常のユーザープロセスが実行される場所のセットです(つまり、カーネル以外のすべて)。カーネルの役割は、このスペースで実行されているアプリケーションを互いに干渉したり、マシンを管理したりすることです。
  • カーネルのコードが格納され、その下で実行されるカーネル空間。

ユーザー空間で実行されているプロセスはメモリの限られた部分にしかアクセスできませんが、カーネルはすべてのメモリにアクセスできます。ユーザー空間で実行されているプロセスもカーネル空間にアクセスできません。ユーザー空間プロセスは、カーネルによって公開されたインターフェイス(システムコール)を介してカーネルのごく一部にしかアクセスできません。プロセスがシステムコールを実行すると、ソフトウェア割り込みがカーネルに送信され、適切な割り込みハンドラーをディスパッチして続行します。ハンドラが終了した後の作業。


-7

Linuxでは、2つのスペースがあります。1つ目はユーザースペースで、もう1つはカーネルスペースです。ユーザー空間は、実行したいユーザーアプリケーションのみで構成されます。カーネルサービスとして、プロセス管理、ファイル管理、シグナル処理、メモリ管理、スレッド管理などがあり、非常に多くのサービスが存在します。アプリケーションをカーネルサービスのみと対話するユーザースペースからアプリケーションを実行する場合。そのサービスは、ハードウェアとカーネルの間に存在するデバイスドライバーと対話します。カーネルスペースとユーザースペースの分離の主な利点は、ユーザースペースに存在するすべてのユーザーアプリケーションのvirus.bcazによってセキュリティを確保でき、サービスがカーネルスペースに存在することです。これがLinuxがウイルスの影響を受けない理由です。


5
「カーネル」ではなく「カーネル」であるという事実に加えて、あなたの答えは完全に正しくはありません。現代のウイルス(そして現代ではWindows 98以降のすべてを意味します)は、「カーネルサービス」とはまったく対話せず、すべてがユーザー空間で行われます。Linuxにはそれほどウイルスがありません(もちろん、Linuxにはウイルスがあります)という事実は、Linuxにはかなり優れた権限管理があり、最も重要な事実は、ほとんどのLinuxユーザーが「omaigosh JustinBieber.NewSong.exe!私はそれをNAO !!! 1111のユーザーに聞かなければなりません。
alexclooze 2012年

3
また、LinuxはWindowsほど使用されていません。ウイルスを作成しても、ウイルスの作成者が望んでいるほどの損害は発生しません。ユーザー空間アプリケーションはカーネルサービスと通信せず、syscallsと呼ばれるカーネルによって提供される特別な関数を呼び出します。
alexclooze '26 / 10/26
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.