[過去ログ] C言語なら俺に聞け 152 (1002レス)
前次1-
抽出解除 必死チェッカー(本家) (べ) 自ID レス栞 あぼーん

このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
952
(1): (ワッチョイ 5a61-JGwf) 2019/08/14(水)14:20 ID:meO8Vw3B0(1/3)調 AAS
>>951
一応、x86系(IA32)で、仮想アドレスというと大体ページングの方をさし、
セグメントの方は、二部分アドレス、などということが多いことは多い。
954: (ワッチョイ 5a61-JGwf) 2019/08/14(水)15:01 ID:meO8Vw3B0(2/3)調 AAS
>>949
記憶に頼って書くので、少し間違いがあるかもしれないが、IA32では、
・仮想アドレスの4KBの領域が1ページと呼ばれる。
・それぞれのページの先頭アドレスには好きな物理アドレスを割り付けることが
 出来る。また、ページごとに、R,W,E 属性などを ON/OFF できる。
 Read/Write/Execute ができるかどうかを指定できるということ。
・1024個のページのをまとめてテーブルにして、そこにそれぞれのページの
 上記情報をまとめて書く。このテーブルは連続した4MBの仮想アドレス領域
 に対応している。このテーブルは、1ページあたりが4バイトになっていて、
 「エントリ」と呼ばれる。4バイトのエントリが1024個集まって1つの
 テーブルを形作り、「ページテーブル」という。ページテーブル自体も
 また4KBになっていて、ページのサイズと同じになっている。
・さらに、このページテーブルの先頭アドレスを1024個分まとめて書いた配列があり、
 ページディレクトリと呼ばれる。既に述べたようにページテーブルが仮想アドレス
 4MB分を管理するので、1024個分まとまると 4MB * 1024 = 4GB 分を管理
 することができるようになる。これで2^32=4GBに相当するので32BITのアドレス
 空間全てを管理できるようになる。
・ページテーブルの中には、物理アドレスを割り付けないページを作ることも出来る。
・ページディレクトリも、ページテーブルを割り付けないエントリが有っても良い。
・ページディレクトリが置かれた物理アドレスは、CPUの特殊な専用レジスタの中に
 入れられる。
・ぺージディレクトリ、ページテーブルの情報は、メモリアクセスを伴うマシンご命令を
 実行する際に必ず必要になるので、高速化するため、TLB(Translation Lookaside Buffer
 、アドレス変換バッファ)という専用のキャッシュ領域に格納されて、とても高速に
 処理できるようになっている。TLBのキャッシュをクリアして再度構築する(読み込む)
 には、結構時間がかかるといわれており、これがOSのプロセス(タスク)切り替えの
 大きなオーバーヘッドを生むといわれている。
955: (ワッチョイ 5a61-JGwf) 2019/08/14(水)15:11 ID:meO8Vw3B0(3/3)調 AAS
>>949
なお、WindowsやLinuxでは、セグメンテーションの方は積極的には
ほとんど使っておらず、意味がある使い方をしているのはページングの方だけ。
だから、デファクトスタンダードのOSは、ほぼ全てページングだけを使っている
と言っても過言では無い。セグメンテーションは、スタック領域(esp,ebp)の
ためだけにはやや意味のある使い方がなされる場合があるかも知れない。
というのはスタック領域については、CPUの保護がちょっとだけ強く保護できる
仕組みを持っているが、それがセグメンテーションの仕組みを使っているから。
例えば、仮想アドレス領域の一部だけをスタック領域にして、そこからはみ出た
場合には保護例外を発生させたいような場合には、セグメンテーションが利用できる。
上手く使えば、スタックの自動伸張にも使えないことも無い。ただし、
自動伸張にか関してはそんなに上手く使いこなせる仕組みでも、そんなに
効率が上げられる訳でもない。再帰関数の何度も呼びすぎてスタック
を使いすぎた場合にプログラマにエラーを表示するような目的には
使おうと思えば使える。
前次1-
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル

ぬこの手 ぬこTOP 0.042s