Linux схема управления памятью (1) логический линейный адрес Адрес

Research Kernel время не долго, несколько дней назад обратили большое управление памятью картины, я чувствую себя слишком грязным, готов написать что - то сегменты можно считать рассортировать его мысль. не человек слепой размышлял вокруг нет связи, не место, пожалуйста , укажите это.

Логический линейный адрес Адрес Адрес памяти инструкции на машинном языке произошел, являются логическими потребностями адреса должны быть преобразован в линейный адрес, а затем через блок управления памятью (ЦП) ММЫ в физический адрес , чтобы иметь возможность получить доступ. Мы пишем простой привет мир программа, составленная с НКУ, после того, как затем декомпилировать см следующие инструкции:
   


  1. мы 0x80495b0,% е
Скопировать код


Здесь 0x80495b0 адрес памяти является логическим адресом, необходимо добавить неявный базовый адрес сегмента данных DS для того , чтобы представлять собой линейный адрес. Это 0x80495b0 смещена в пределах сегмента данных DS текущей задачи.

<Ignore_js_op>

в защищенном режиме х86, информацию (адрес сегмента длины базовой линии, разрешения и т.д.) дескриптора сегмента 8 байт, то есть, фрагменты информации , не могут быть сохранены непосредственно (только 2-байтовое сегмент регистра) в регистрах сегментов , Intel разработан дескриптор в GDT или LDT хранятся централизованно в дескрипторе сегмента регистра сохран ет значение индекса GDT или LDT (индекс).

Linux логический адрес равен линейному адресу. Почему вы говорите? Из - за все сегменты Linux (пользовательский сегмент кода, сегмент данных пользователя, сегмент коды ядра, раздел данных ядра) представляет собой линейный адрес 0x00000000 с самого начала, длиной 4G, так что линейный адрес 0x00000000 = + логический адреса, логический адрес , который совпадает с линейным адрес.

При таких обстоятельствах , Linux использовал только GDT, независимо от пользователя или задач ядра задачи, не использовать LDT. 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 и ЗПР составляет 3.
При использовании GDB отладчик, отображающий текущее значение регистра с использованием информации рег:

  1. CS 0x73 115
  2. сс 0x7B 123
  3. DS 0x7B 123
  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