カーネル空間とユーザー空間の違いは何ですか?カーネルスペース、カーネルスレッド、カーネルプロセス、カーネルスタックは同じ意味ですか?また、なぜこの差別化が必要なのですか?
カーネル空間とユーザー空間の違いは何ですか?カーネルスペース、カーネルスレッド、カーネルプロセス、カーネルスタックは同じ意味ですか?また、なぜこの差別化が必要なのですか?
回答:
本当に単純化答えは、カーネルがカーネル空間で実行され、通常のプログラムはユーザ空間で実行することです。ユーザー空間は基本的にサンドボックスの一種です-ユーザープログラムを制限するため、他のプログラムやOSカーネルが所有するメモリ(および他のリソース)を乱用することはできません。これにより、マシンのクラッシュなどの悪いことを行う能力が制限されます(ただし、通常は完全になくなるわけではありません)。
カーネルはオペレーティングシステムの中核です。通常は、すべてのメモリとマシンハードウェア(およびマシン上のその他すべて)にフルアクセスできます。マシンをできるだけ安定に保つには、通常、最も信頼できる、十分にテストされたコードのみをカーネルモード/カーネルスペースで実行する必要があります。
スタックはメモリの別の部分にすぎないため、当然、残りのメモリと一緒に分離されます。
ランダムアクセスメモリ(RAM)は、論理的に、すなわち2つの別個の領域に分けることができる- 。カーネル空間とユーザ空間(物理アドレス RAMのは、実際に分割されていないだけで仮想アドレス、このすべてによって実装MMU)
カーネルは、それを利用できるメモリの一部で実行されます。カーネルはメモリのすべての部分にアクセスできるため、メモリのこの部分には通常のユーザーのプロセスから直接アクセスできません。カーネルの一部にアクセスするには、ユーザー・プロセスが呼び出し、すなわち事前に定義されたシステムを使用する必要がありopen
、read
、write
など。また、C
のようなライブラリ関数printf
呼び出しシステムコールwrite
ターンインチ
システムコールは、ユーザープロセスとカーネルプロセス間のインターフェースとして機能します。アクセス権は、ユーザーが無意識のうちにカーネルを乱用するのを防ぐために、カーネルスペースに配置されます。
したがって、システムコールが発生すると、ソフトウェア割り込みがカーネルに送信されます。CPUは、一時的に制御を関連する割り込みハンドラルーチンに渡すことができます。割り込みによって停止されたカーネルプロセスは、割り込みハンドラルーチンがそのジョブを終了した後に再開されます。
カーネルスペースと仮想スペースは、仮想メモリの概念です。Ram(実際のメモリ)がカーネルスペースとユーザースペースに分割されるわけではありません。各プロセスには、カーネルとユーザー空間に分割された仮想メモリが与えられます。
つまり、「ランダムアクセスメモリ(RAM)は、カーネル空間とユーザー空間という2つの異なる領域に分割できます。」間違っている。
&「カーネルスペースvsユーザースペース」について
プロセスが作成され、その仮想メモリがユーザー空間とカーネル空間に分割されると、ユーザー空間領域にはデータ、コード、スタック、プロセスのヒープが含まれ、カーネル空間にはプロセスのページテーブルなどが含まれます。 、カーネルデータ構造、カーネルコードなど。カーネルスペースコードを実行するには、制御をカーネルモードに移行する必要があり(システムコールに0x80ソフトウェア割り込みを使用)、カーネルスタックは基本的にカーネルスペースで実行中のすべてのプロセス間で共有されます。
CPUリングは最も明確な違いです
x86保護モードでは、CPUは常に4つのリングのいずれかにあります。Linuxカーネルは0と3のみを使用します。
これは、カーネル対ユーザーランドの最もハードで高速な定義です。
Linuxがリング1および2を使用しない理由:CPU特権リング:リング1および2が使用されないのはなぜですか?
現在のリングはどのように決定されますか?
現在のリングは、次の組み合わせで選択されます。
グローバル記述子テーブル:GDTエントリのメモリ内テーブル。各エントリにはPrivl
、リングをエンコードするフィールドがあります。
LGDT命令は、アドレスを現在の記述子テーブルに設定します。
セグメントは、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 0x80
かsyscall
カーネルを知らせるために。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
これが発生すると、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
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呼び出しを行う具体的なベアメタルの例です。
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でテストされたコードスニペット。
カーネルスペースとユーザースペースは、特権オペレーティングシステム機能と制限付きユーザーアプリケーションの分離です。この分離は、ユーザーアプリケーションがコンピューターを攻撃するのを防ぐために必要です。古いユーザープログラムがランダムデータをハードドライブに書き込んだり、別のユーザープログラムのメモリスペースからメモリを読み取ったりするのは悪いことです。
ユーザー空間プログラムはシステムリソースに直接アクセスできないため、オペレーティングシステムのカーネルがプログラムに代わってアクセスを処理します。ユーザー空間プログラムは通常、システムコールを介してオペレーティングシステムにこのような要求を行います。
カーネルスレッド、プロセス、スタックは同じことを意味するものではありません。これらは、ユーザー空間の対応物と同様に、カーネル空間の構成要素です。
各プロセスには、ページテーブルを介して物理メモリにマップする独自の4 GBの仮想メモリがあります。仮想メモリは、主に2つの部分に分割されます。プロセスを使用する場合は3 GB、カーネルを使用する場合は1 GBです。作成する変数のほとんどは、アドレス空間の最初の部分にあります。その部分はユーザー空間と呼ばれます。最後の部分はカーネルが存在する場所であり、すべてのプロセスに共通です。これはカーネルスペースと呼ばれ、このスペースのほとんどは、ブート時にカーネルイメージがロードされる物理メモリの開始位置にマップされます。
アドレス空間の最大サイズは、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間でプロセスを分散するのを助けるなどがあります。
簡単に言うと、カーネルはカーネルスペースで実行され、カーネルスペースはすべてのメモリとリソースにフルアクセスできます。メモリは、カーネル用とユーザー独自のプロセス用の2つの部分に分かれています。(ユーザー空間)は通常のプログラムを実行します。スペースはカーネルスペースに直接アクセスできないため、カーネルからリソースを使用するように要求します。syscall(glibcで事前定義されたシステムコール)
異なる「ユーザースペースはカーネルの単なるテストロード」を簡素化するステートメントがあります...
明確にするために:プロセッサアーキテクチャにより、CPUはカーネルモードとユーザーモードの 2つのモードで動作でき、ハードウェア命令により、1つのモードから別のモードに切り替えることができます。
メモリは、ユーザー空間またはカーネル空間の一部としてマークできます。
CPUがユーザーモードで実行されている場合、CPUはユーザー空間にあるメモリのみにアクセスできますが、CPUがカーネルスペース内のメモリにアクセスしようとすると、「ハードウェア例外」が発生します。カーネルモードで実行されているCPUが直接アクセスできる場合、カーネル空間とユーザー空間の両方に...
カーネルスペースとは、メモリスペースはカーネルのみが操作できることを意味します。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)
Linuxカーネルとは、カーネルモードで実行されるすべてのものを指し、いくつかの異なる層で構成されています。最下層では、カーネルはHALを介してハードウェアと対話します。中間レベルでは、UNIXカーネルは4つの異なる領域に分かれています。4つの領域のうちの最初の領域は、キャラクターデバイス、生および調理済みTTY、および端末処理を処理します。2番目の領域は、ネットワークデバイスドライバー、ルーティングプロトコル、およびソケットを処理します。3番目の領域は、ディスクデバイスドライバー、ページおよびバッファーキャッシュ、ファイルシステム、仮想メモリ、ファイルの名前付けとマッピングを処理します。4番目と最後の領域は、プロセスのディスパッチ、スケジューリング、作成、終了、および信号処理を処理します。この上に、システムコール、割り込み、トラップを含むカーネルの最上位層があります。このレベルは、下位レベルの各機能へのインターフェースとして機能します。プログラマーは、さまざまなシステムコールと割り込みを使用して、オペレーティングシステムの機能を操作します。
INカーネル領域は、Linuxカーネルが実行されるメモリの部分(Linuxの場合は上部1 GBの仮想空間)であり、ユーザースペースはユーザーアプリケーションが実行されるメモリの部分(Linuxの場合は下部3 GBの仮想メモリ)です。以下のリンクを参照してください:)
http://learnlinuxconcepts.blogspot.in/2014/02/kernel-space-and-user-space.html
カーネル空間とユーザー空間は論理的な空間です。
最近のプロセッサのほとんどは、さまざまな特権モードで実行するように設計されています。x86マシンは、4つの異なる特権モードで実行できます。
また、特定の機械語命令は、特定の特権モードで実行されます。
この設計により、システムを保護するか、実行環境をサンドボックス化します。
カーネルは、ハードウェアを管理し、システムの抽象化を提供するコードの一部です。したがって、すべての機械語命令にアクセスできる必要があります。そして、これは最も信頼できるソフトウェアです。したがって、最高の特権で実行する必要があります。また、リングレベル0が最も特権的なモードです。したがって、リングレベル0はカーネルモードとも呼ばれます。
ユーザーアプリケーションは、サードパーティベンダーが提供するソフトウェアの一部であり、完全に信頼することはできません。悪意のある人が、すべての機械語命令に完全にアクセスできた場合、システムをクラッシュさせるコードを書くことができます。したがって、アプリケーションには、限られた一連の命令へのアクセスを提供する必要があります。また、リングレベル3は最も特権の少ないモードです。したがって、すべてのアプリケーションはそのモードで実行されます。したがって、そのリングレベル3はユーザーモードとも呼ばれます。
注:リングレベル1と2を取得していません。これらは基本的に中間の特権を持つモードです。したがって、デバイスドライバーコードがこの特権で実行される可能性があります。私の知る限り、Linuxはカーネルコードの実行とユーザーアプリケーションにそれぞれリングレベル0と3のみを使用します。
したがって、カーネルモードで発生するすべての操作は、カーネルスペースと見なすことができます。また、ユーザーモードで発生する操作はすべてユーザー空間と見なすことができます。
正解は次のとおりです。カーネル空間やユーザー空間などはありません。プロセッサ命令セットには、ページテーブルマップのルートなどの破壊的なものを設定したり、ハードウェアデバイスのメモリにアクセスしたりするための特別な権限があります。
カーネルコードには最高レベルの特権があり、ユーザーコードには最低レベルの特権があります。これにより、ユーザーコードによるシステムのクラッシュ、他のプログラムの変更などが防止されます。
一般に、カーネルコードは、ユーザーコードとは異なるメモリマップに保持されます(ユーザー空間が互いに異なるメモリマップに保持されるのと同じように)。これが「カーネルスペース」と「ユーザースペース」の用語の由来です。しかし、それは厳格な規則ではありません。たとえば、x86では間接的に割り込み/トラップハンドラーを常にマップする必要があるため、カーネルの一部(または一部のOSすべて)をユーザー空間にマップする必要があります。繰り返しますが、これは、そのようなコードにユーザー特権があることを意味するものではありません。
カーネル/ユーザー分割が必要なのはなぜですか?一部の設計者は、実際にはそれが必要であることに反対しています。マイクロカーネルアーキテクチャは、コードの最も高い特権セクションをできるだけ小さくし、すべての重要な操作をユーザー特権コードで実行するという考えに基づいています。なぜこれが良い考えであるかを検討する必要があります。これは単純な概念ではありません(利点と欠点の両方で有名です)。
メモリは2つの異なる領域に分かれています。
ユーザー空間で実行されているプロセスはメモリの限られた部分にしかアクセスできませんが、カーネルはすべてのメモリにアクセスできます。ユーザー空間で実行されているプロセスもカーネル空間にアクセスできません。ユーザー空間プロセスは、カーネルによって公開されたインターフェイス(システムコール)を介してカーネルのごく一部にしかアクセスできません。プロセスがシステムコールを実行すると、ソフトウェア割り込みがカーネルに送信され、適切な割り込みハンドラーをディスパッチして続行します。ハンドラが終了した後の作業。
Linuxでは、2つのスペースがあります。1つ目はユーザースペースで、もう1つはカーネルスペースです。ユーザー空間は、実行したいユーザーアプリケーションのみで構成されます。カーネルサービスとして、プロセス管理、ファイル管理、シグナル処理、メモリ管理、スレッド管理などがあり、非常に多くのサービスが存在します。アプリケーションをカーネルサービスのみと対話するユーザースペースからアプリケーションを実行する場合。そのサービスは、ハードウェアとカーネルの間に存在するデバイスドライバーと対話します。カーネルスペースとユーザースペースの分離の主な利点は、ユーザースペースに存在するすべてのユーザーアプリケーションのvirus.bcazによってセキュリティを確保でき、サービスがカーネルスペースに存在することです。これがLinuxがウイルスの影響を受けない理由です。