Linuxのメモリ管理スキーム(1)論理リニアアドレス住所

研究カーネル時間が長く、数日前、私は彼の思考整理と考えることができ、書き込み何かセグメントにも、厄介な準備ができて感じ、大きな画像メモリ管理を描いていません。無通信ではなく、適切な場所の周りに熟考人のブラインドは、それを指摘してくださいされています。

論理線形アドレスのアドレス機械語命令のメモリアドレスが発生し、論理アドレスがアクセスされることができるように、線形アドレスに変換する必要があり、その後、MMU(CPUのメモリ管理ユニット)を介して物理アドレスに変換されます。その後、デコンパイル、次の手順を参照してください後に我々は、gccでコンパイルしたシンプルなハローワールドプログラムを書きます:
   


  1. MOV 0x80495b0、%eaxに
コードをコピー


ここで0x80495b0メモリアドレスを使用すると、リニアアドレスを構成するために、暗黙のベースアドレスDSデータセグメントを追加する必要があり、論理アドレスです。それ0x80495b0は、データセグメントDS現在のタスク内で相殺されます。

<ignore_js_op>

におけるx86の保護モード、セグメント記述子情報(基線長、アクセス許可などのアドレスセグメント)8バイト、すなわち、情報の断片は、セグメントレジスタに直接に(わずか2バイトのセグメント・レジスタ)に格納することができません。インテルは、セグメント記述子レジスタストアに集中的に格納GDTまたはLDTにGDTまたはLDT(インデックス)のインデックス値を記述を設計しました。

Linuxの論理アドレスは線形アドレスに等しいです。なぜあなたは言うのですか?すべてのセグメントのLinux(ユーザ・コード・セグメント、ユーザデータセグメント、カーネル・コード・セグメント、カーネルデータセクション)ので、最初から線形アドレス0x00000000の、4Gの長さ、であるので、線形アドレス0x00000000の= +論理アドレス、線形に等しい論理アドレスアドレス。

このような状況下ではLinuxのみLDTを使用していないにかかわらず、ユーザーまたはカーネルタスクタスクの、GDTを使用します。GDTおよびセグメント記述子13及び12は__KERNEL_CS __KERNEL_DS、14であり、セグメント記述子15は__USER_CSと__USER_DSあります。そして__KERNEL_CS __KERNEL_DSを使用してカーネルタスクは、すべてのユーザーがタスクを共有し、各タスクに割り当てられたセグメント記述子を分離する必要がないと言うことです__USER_CS __USER_DS、。カーネルとユーザセグメント記述子は同じあるが、開始アドレスと長さ線形ディスクリプタが、DPL(記述子特権レベル)が同じではありません。__KERNEL_CS __KERNEL_DSとDPLは(ほとんどの特権)0である、__ USER_CS __USER_DSとDPLは3です。
情報REGを使用して、レジスタの現在の値を表示し、gdbデバッガを使用する場合:

  1. CS 0x73 115
  2. SSの0x7Bと123
  3. 123 0x7BとDS
  4. es             0x7b     123
复制代码


可以看到ds值为0x7b, 转换成二进制为 00000000 01111011,TI字段值为0,表示使用GDT,GDT索引值为 01111,即十进制15,对应的就是GDT内的__USER_DATA 用户数据段描述符。
从上面可以看到,Linux在x86的分段机制上运行,却通过一个巧妙的方式绕开了分段。Linux主要以分页的方式实现内存管理

 

转自:http://bbs.chinaunix.net/thread-2015599-1-1.html

おすすめ

転載: www.cnblogs.com/pipci/p/12392743.html