質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
アーキテクチャ

アーキテクチャとは、情報システム(ハードウェア、OS、アプリケーション、ネットワーク等)の設計方法、設計思想、設計思想に基づいて構築されたシステム構造をアーキテクチャと呼びます

Q&A

解決済

2回答

6284閲覧

プロセスのカーネルモードへの移行について

strike1217

総合スコア651

アーキテクチャ

アーキテクチャとは、情報システム(ハードウェア、OS、アプリケーション、ネットワーク等)の設計方法、設計思想、設計思想に基づいて構築されたシステム構造をアーキテクチャと呼びます

0グッド

1クリップ

投稿2016/09/16 10:07

ユーザーが作ったプロセスは通常ユーザーモードで動作していますが、
プロセスがシステムコールを発行するとプロセス自身がカーネルモードに移行するんですか??

自分は今まで
ユーザーモードで動作するプロセスがシステムコールを発行するとカーネルモードで動作しているプロセスに処理を依頼するのだと思っていたのですが・・・

Linuxカーネル第3版の本に”プロセス自身がユーザーモードからカーネルモードへと移行する。カーネルがユーザーの要求を満たした後、再びユーザーモードに戻る”というようなことが書いてありました。

もしかして自分の理解は間違っていましたか??
1つのプロセス内に2つの動作を切り変えながら動いているのですか??
システムコールを発行する瞬間のみカーネルモードに変わるのですか??
システムコールラッパーのあたりに入ってくるとカーネルモードに変わってくるんですか??

なぜカーネルモードに移行する必要があるのでしょうか??
プロセス自信がカーネルモードに移行できるならわざわざシステームコールなどという概念はそもそも必要なくても良いので?
”システームコールはユーザーモードとカーネルモードの橋渡しをする役割を担う”というのを読んだことがあります。
そうなるとシステムコールとは何でしょう??
と色々考えてしまうのです。

またユーザーモードとカーネルモードはそれぞれCPUのモードだと書いてありました。
CPUのモードということはハードウェア的にモードを切り替えているということですか??
どうやって実現しているのでしょうか?
今までソフトウェア的にモードを使い分けていると思っていました。
リアルモードと保護モードはMMUのon/offでできそうですが・・・

どなたか教えてください!

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

こんにちは。

もしかして自分の理解は間違っていましたか??

ですね。
yubaさんの言う通りユーザ・モードからソフトウェア割り込みをかけてカーネル・モードへ移行します。その時、どのプロセスがCPUを使っているのか、カーネルは管理してますが、呼び出し元のプロセスがCPUを使っているものとしています。別のプロセスがCPUを使っているとして管理することもできる筈ですが、そんなことをする意味がないです。また、元のプロセスからの要求で直接実行しているのでその紐付けを維持しておいた方が合理的と思います。CPU使用率も分かりやすい値にできますし。(直接実行しているのならカーネル・モードでの実行時間もプロセスの実行時間に含めたいですよね。)

逆にハードウェア割り込みの時もカーネル・モードへ移行しますが、ハードウェア割り込みがかかった時に実行していたプロセスの実行が継続しているとはしません。無関係なので当たり前ですが。

なぜカーネルモードに移行する必要があるのでしょうか??

特権モードを切り替えるためです。ユーザ・モードで実行されているプログラムはユーザが作ったプログラムなので何をするか分かりません。ユーザ・モードでなんでもかんでも出来るようにすると1つのアプリがちょっと悪さするだけでシステム全体を落とせる脆弱なシステムとなります。
しかし、信頼性の高いプログラム(カーネルやデバイス・ドライバ)だけには特権を与えて必要な処理をできるようにします。そのためにカーネル・モードが存在します。

つまり、プロセスはユーザ・モードでは主にユーザ・プログラムを実行し、システム・コールによりカーネル・モードへ移行してカーネルやデバイス・ドライバのプロクラムを実行すると言うことです。

またユーザーモードとカーネルモードはそれぞれCPUのモードだと書いてありました。

CPUのモードということはハードウェア的にモードを切り替えているということですか??

その通りです。ハードで保護しないとユーザ・プログラムが簡単に破ることができてしまいます。

どうやって実現しているのでしょうか?

今までソフトウェア的にモードを使い分けていると思っていました。
リアルモードと保護モードはMMUのon/offでできそうですが・・・

そんな感じです。メモリ空間の切り替えが主ですのでMMUで切り替えます。ユーザ・モードではアクセスできなかったメモリやI/Oをアクセスできるようにします。

投稿2016/09/16 12:49

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

strike1217

2016/09/16 13:25

ふむふむ・・・なるほど・・・ プロセスがカーネルモードで動作しているプロセスにシステムコールを使用して処理を依頼しているのではないんですか??
strike1217

2016/09/16 13:33

あ、 あたかも、プロセスとして見るとカーネルモードで動作しているプロセスに処理を依頼しているように見えるが、 CPU側からして見てみれば、ユーザーモードで動作していたプロセスがカーネルモードで動作している別のプロセスが割り込んできて、あたかもプロセスがユーザーモードからカーネルモードに変化しているように見えるということですかね?
Chironian

2016/09/16 14:13

なぜに、カーネル・モードでの処理が「プロセス」で実行されていると思うのでしょうか? カーネル・モードでの処理の多くは割り込みハンドラーで処理されてます。 システム・コールもソフトウェア割り込みにて普通に割り込みハンドラーにて処理されます。優先順位制御を適切に実行すれば問題ないです。 また、プロセスの主な目的はメモリ空間の保護ですから、カーネル・モードだけで動作するプロセスは意味がありません。(メモリ空間を保護しようがない。) カーネル・モードのスレッドへ処理を依頼するケースはあると思います。しかし、全ての要求を一々カーネル・モードのスレッドへ依頼しているということもありえません。無駄に重くなるだけですから。
strike1217

2016/09/16 14:27

カーネルモードだけで動作するプロセスは存在しないのですか! ほぇぇぇぇ・・ だんだん分かってきたかなぁ・・? 割り込みハンドラとは割り込みを処理・制御するためにメモリ上に待機しているプログラム ですよね? これはカーネルモードのみで動作するのではないのですか??
strike1217

2016/09/16 14:29

ん? メモリ上で待機しているハンドラが実行中のプロセスに組み込まれる。 ということではないですよね? すいません。 まだよくわかってないです・・・
Chironian

2016/09/16 15:31

> 割り込みハンドラとは割り込みを処理・制御するためにメモリ上に待機している > プログラムですよね? > これはカーネルモードのみで動作するのではないのですか?? その通りですよ。システム・コールでソフトウェア割り込みを発生し、この時点でカーネル・モードへ移行します。そして、そのまま処理するのですから、カーネル・モードのみの実行でよいですよ。 > メモリ上で待機しているハンドラが実行中のプロセスに組み込まれる。 > ということではないですよね? よく意味が分かりません。「割り込みハンドラが実行中のプロセスに組み込まれる」なんてことはありません。実行中のプロセスが保留されて、割り込みハンドラに制御が移るだけです。 ↓にハードウェア割り込みの概要解説がありました。 http://www.kumikomi.net/archives/2009/11/post_23.php?page=5 ソフトウェア割り込みの場合も流れは同じです。通常の処理ルーチン実行中にソフトウェア割り込み命令に到達したら、ハードウェア割り込みが発生したのと同様な処理を行います。 上記サイトは特権モードなど無いような小さなCPUの話ですが、特権モードがある場合は割り込みが発生したタイミングでカーネル・モードへ切り替わります。
strike1217

2016/09/17 01:16

ああ なるほど わかりました。 ありがとうございます。
kazuyakazuya

2020/01/09 03:51

システムコールを読んだ時点で特権に~・・・ についてですが ゲートディスクリプタによって低特権から高特権のセグメントに 制限された形で(割り込み処理ルーチンならコードだから) 実行できるようになる。 なので・・・ ①システムコールが呼ばれる ②システムコールの中のINT命令(ソフトウエア割り込み)が呼ばれる (プロテクトモードではINT ソフトウエア割り込みでそのままアクセスできないから 事前に用意したゲートディスクリプタを仲介する) で、このゲートディスクリプタにアクセスした時点で 特権がリング3→リング0みたいに なるのだと思うのですが そもそも、割り込み処理ルーチンをマップしている セグメントディスクリプタは どこになるのでしょうか? GDTのLDTのどちらでしょうか? (タスクごとに変わるの内容というわけではないからLDTではない?)
strike1217

2020/01/15 12:44 編集

最近のLinuxはINT命令は古いので使われてないですよね。 割り込みに関して、自分の持っている本には載っていませんが・・・ 「GDTもしくはLDTを読み取ります。」と書かれているので使い分けは不明ですが、両方使われているようです。 ロングモードとプロテクトモードの割り込み処理はゲート・ディスクリプタを使用していますが、少しだけ異なるようです。
strike1217

2020/01/15 12:55 編集

あ・・・ すいません。 別の本を調べたら、OSのメーカーがLDTを使用していない場合が多いそうです。 なので、LDTはほとんどのOSでは使用されていないと考えて良いようです。 CPUの機能としてLDTを提供しているだけで、使用するかどうかはOSを作る側に任されているようですね。 ちなみに、Linuxは特権モードに移行する際のレジスタの変更はGDTを介して行っているようです。
strike1217

2020/01/15 13:00

CPL(現行特権レベル)の値は、CSセグメント・レジスタの下位2bitから参照しているので、GDTでできますね。 割り込み処理ルーチンをマップしているセグメントディスクリプタとは、IDTのことでしょうか?? あとは、TSSとか・・・ このあたりですかね。
kazuyakazuya

2020/01/15 13:22

ありがとうございます。 >割り込み処理ルーチンをマップしているセグメントディスクリプタとは、IDTのことでしょうか?? IDTの中にあるゲートディスクリプタのことを指して言っていました。 結局その機能をどう使うかはプログラマー次第なんですね。
guest

0

ソフトウェア割り込みってのを使っています。
割り込みというのはCPUの機能で、あるイベントが発生したらいつでも実行中のプログラムを一時中断してこのアドレスからのプログラムを実行せよ、というイベントハンドラをCPUに予約しておけるのです。
このイベントというのは外部デバイスからの入力があったなどのハードウェアイベントの他、プログラムがソフトウェア的に発生させるイベントもあります。後者でハンドラが呼び出されるのがソフトウェア割り込み。

システムコールが発行されると、それを処理するOSの関数(ユーザーランドで実行されています)はこのソフトウェア割り込みを発生させます。ハンドラにはあらかじめカーネルランドのコードが登録されており、カーネルランドのコードは処理が終わったら制御を返してくる、という流れになります。

投稿2016/09/16 10:17

yuba

総合スコア5568

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

strike1217

2016/09/16 13:28

ユーザーモードで動作しているプロセスがカーネルモードで動作しているプロセスに変化しているということですか? ユーザーモードで動作しているプロセスがカーネルモードで動作しているプロセスにシステームコールを介して処理を依頼しているのではないということでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問