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

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

新規登録して質問してみよう
ただいま回答率
85.31%
Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Q&A

解決済

2回答

1257閲覧

linux カーネルモード ユーザモード 切り替えについて

akiyama3284pga

総合スコア186

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

0グッド

0クリップ

投稿2022/02/20 02:17

学習中、疑問が出ました。

下記サイトでは、
https://milestone-of-se.nesuke.com/sv-basic/architecture/user-space-kernel-space/

コンテキストスイッチによりカーネルモードへ移行し、 それからシステムコールする。

とあります。

しかし、以下資料では、
https://www.ipa.go.jp/files/000056288.pdf

アプリケーションプログラムが呼び出すシステムコールにより、ソフトウェア割り込みが発生 し、CPUのモードがスーパバイザモード(カーネルモード)に遷移する。

とあります。

どちらかが間違っているのか、それともどちらもあっていて、表現の違い?なのか
そもそもコンテキストスイッチは何かきっかけがないと起動しないと思うので、
いきなりコンテキストスイッチによりカーネルモードへ移行し、というのは納得ができません。

また、コンテキストスイッチについて
一つ目のサイトで、

ユーザモードとカーネルモードの切り替えは、マルチタスク OS の実行プロセスの切り替えでも利用される Context Switch によって実施

という一文があり、これが自分の理解を混乱させています。
システムコール==svc"割り込み"なのだから、その際にコンテキストスイッチが機能してシステムコールの処理として、何らかのハードなどを操作するカーネル空間のプロセスに切替られるのではないのか。
ではそのコンテキストスイッチをどのように実施しているのか説明が欲しい。
もしシステムコールによる割り込みがきっかけなのであれば、2つ目の資料の方が正しいと思う。

もしくは、contextswitchには2通りの全く別の機能(プロセスを切り替える機能とcpuの動作モードを切り替える機能)があるという認識でよろしいのでしょうか。

かなり混乱しており、文もまとまりがなく申し訳ございません。
何かヒントなど頂ければ幸甚でございます。<(_ _)>

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

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

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

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

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

guest

回答2

0

ベストアンサー

全文読んでませんが、表現の違いだけでは無いでしょうか。

コンテキストスイッチとは、コンテキストが切り替わると言うことだけの意味です。
ただし、ハードウェア割込ないしソフトウェア割込をきっかけに発生するので、一旦カーネルモードに切り替わることになります。
参考:コンテキストスイッチ - Wikipedia

1つめのページの文章の意味が取りにくいのであれば、読むのをやめてはどうでしょうか。

投稿2022/02/20 03:21

otn

総合スコア86293

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

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

akiyama3284pga

2022/02/20 04:24 編集

いつもありがとうございます。 otn様のご回答を踏まえ自分の中で再解釈してみました。 --------------------------------------------------------------------------- 割り込みが発生すると必ずコンテキストスイッチが起きる。 何故かと言えば、割り込みするということは今のプロセスを停止して別のプロセスを実行するということなので、その切替をしなくてはいけないから。 それで、何故コンテキストスイッチのために、カーネルモードに一旦切り替わる必要があるのかというと、 カーネルでしか扱えない割り込み処理をするかどうかということは関係なく、コンテキストスイッチそのものがカーネルが持つ機能であり、つまりカーネルモードでしか扱えない機能であるから。 普段常に行われている時間によるプロセススイッチも、タイマ割り込みとそれにより起動するコンテキストスイッチで行われており、つまりその都度一旦カーネルモードになっている。 どんなプロセスからもカーネルモードにできてはまずいので、システムコールというAPIを通してのみカーネルモードに遷移できるようにしておき、そこでAPIの処理に沿った利用方法でのみコンテキストスイッチを行い、該当の処理のためのプロセスを行う。 なぜ各プロセスからcpuをカーネルモードに遷移させることができるかというと、各プロセスのページテーブルにカーネル本体がロードされているメモリ領域への仮想アドレスを保持しているから。(両モード時のページテーブルは分離されており、システムコールによりカーネルモードになった瞬間しかその仮想アドレスにはアクセスできないため、悪質プロセスからカーネルを保護している。) ---------------------------------------------------------------------------- 長々と申し訳ございません。 これから深く踏み込んで学習していきたいため、この辺りのことはしっかり腑に落としておきたいと考えております。
guest

0

システムコールから呼び出したハンドラ内でコンテキストスイッチを発動させる、とかんがえればどうでしょう

投稿2022/02/20 03:14

y_waiwai

総合スコア88163

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

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

y_waiwai

2022/02/21 23:02

ハードウエア的に、CPUに割り込みが起きると、スーパパイザモードになり、割り込みから戻るとユーザモードとなります で、このCPUのスーパパイザモードがカーネルモードか、といえば、それは違います コンテキストスイッチ、ってのはその言葉の通り、環境の切り替えです。 スーパバイザモード下で、MMUの切り替え、スタック、メモリマップの切り替え、その他様々な環境の切り替えを行い、カーネルモードとなります スーパバイザモードに移行しないとカーネルモードになりえませんが、スーパバイザモードだからといってカーネルモードではない、ですね
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問