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

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

ただいまの
回答率

89.22%

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

解決済

回答 2

投稿

  • 評価
  • クリップ 1
  • VIEW 3,020

strike1217

score 583

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

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

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をアクセスできるようにします。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2020/01/15 21:54 編集

    あ・・・
    すいません。
    別の本を調べたら、OSのメーカーがLDTを使用していない場合が多いそうです。
    なので、LDTはほとんどのOSでは使用されていないと考えて良いようです。

    CPUの機能としてLDTを提供しているだけで、使用するかどうかはOSを作る側に任されているようですね。
    ちなみに、Linuxは特権モードに移行する際のレジスタの変更はGDTを介して行っているようです。

    キャンセル

  • 2020/01/15 22:00

    CPL(現行特権レベル)の値は、CSセグメント・レジスタの下位2bitから参照しているので、GDTでできますね。

    割り込み処理ルーチンをマップしているセグメントディスクリプタとは、IDTのことでしょうか??
    あとは、TSSとか・・・
    このあたりですかね。

    キャンセル

  • 2020/01/15 22:22

    ありがとうございます。
    >割り込み処理ルーチンをマップしているセグメントディスクリプタとは、IDTのことでしょうか??
    IDTの中にあるゲートディスクリプタのことを指して言っていました。

    結局その機能をどう使うかはプログラマー次第なんですね。

    キャンセル

0

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

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

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/09/16 22:28

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

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

    キャンセル

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

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

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