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

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

ただいまの
回答率

89.96%

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

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 2,583

strike1217

score 579

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

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

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

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

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

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

0

こんにちは。

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

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

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

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

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

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

またユーザーモードとカーネルモードはそれぞれCPUのモードだと書いてありました。 
CPUのモードということはハードウェア的にモードを切り替えているということですか?? 

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/09/16 23:29

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

    すいません。
    まだよくわかってないです・・・

    キャンセル

  • 2016/09/17 00:31

    > 割り込みハンドラとは割り込みを処理・制御するためにメモリ上に待機している
    > プログラムですよね?
    > これはカーネルモードのみで動作するのではないのですか??

    その通りですよ。システム・コールでソフトウェア割り込みを発生し、この時点でカーネル・モードへ移行します。そして、そのまま処理するのですから、カーネル・モードのみの実行でよいですよ。

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

    よく意味が分かりません。「割り込みハンドラが実行中のプロセスに組み込まれる」なんてことはありません。実行中のプロセスが保留されて、割り込みハンドラに制御が移るだけです。

    ↓にハードウェア割り込みの概要解説がありました。
    http://www.kumikomi.net/archives/2009/11/post_23.php?page=5

    ソフトウェア割り込みの場合も流れは同じです。通常の処理ルーチン実行中にソフトウェア割り込み命令に到達したら、ハードウェア割り込みが発生したのと同様な処理を行います。
    上記サイトは特権モードなど無いような小さなCPUの話ですが、特権モードがある場合は割り込みが発生したタイミングでカーネル・モードへ切り替わります。

    キャンセル

  • 2016/09/17 10:16

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

    キャンセル

0

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/09/16 22:28

    ユーザーモードで動作しているプロセスがカーネルモードで動作しているプロセスに変化しているということですか?

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

    キャンセル

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

  • ただいまの回答率 89.96%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る