Обмен, подкачка, сегментация и виртуальная память в архитектуре x86 PM

25554
jacks

Что ж, это может показаться распространенным или уже заданным вопросом, но после поиска различных книг, онлайн-уроков и даже здесь, в SU, я все еще озадачен тем, как эти четыре зверя работают вместе в системе с защищенным режимом x86.

Какую правильную терминологию можно использовать при обсуждении этих вещей?

Насколько я понимаю, все эти 4 понятия совершенно разные, но они связаны, когда мы говорим о защите памяти. Вот где это испортилось для меня!

Я начну с обмена в первую очередь.

Swaping:

Процесс должен находиться в физической памяти для выполнения. Процесс может быть временно перенесен из физической памяти в резервное хранилище, а затем возвращен в память для продолжения выполнения.

Это особенно относится к средам многозадачности, где несколько процессов должны выполняться одновременно, и, следовательно, реализован планировщик ЦП, который решает, какой процесс следует перенести в резервное хранилище.

Пейджинг: он же простой пейджинг:

Предположим, что у процесса есть все адреса, которые он использует / получает в диапазоне от 0 до 16 МБ, скажем. Мы можем назвать это логическим адресным пространством процесса, так как адреса генерируются процессом.

Обратите внимание, что этим определением логическое адресное пространство процесса может отличаться от пространства другого процесса, так как процесс может быть больше или меньше.

Теперь мы разделим это логическое адресное пространство процесса на блоки одинакового размера, называемые страницами . Также разделите физическую память на блоки фиксированного размера, называемые кадрами .

По определению логический адрес = страница №: смещение на этой странице

Когда процесс выбирается для выполнения планировщиком процессора, его страницы загружаются из резервного хранилища во все доступные кадры памяти.

Обратите внимание, что все страницы, принадлежащие этому процессу, загружаются в память перед передачей управления этому процессу из планировщика. Когда этот процесс должен быть перенесен в резервное хранилище, все его страницы сохраняются в резервном хранилище.

Резервное хранилище разделено на блоки фиксированного размера, которые имеют тот же размер, что и кадры физической памяти.

Это облегчает процесс обмена, так как мы меняем страницу, а не байты. Это уменьшает фрагментацию в резервном хранилище, поскольку нам не нужно находить место для некоторых байтов, вместо этого мы смотрим, доступно ли пространство для страницы или нет.

Техника подкачки также уменьшает фрагментацию физической памяти, поскольку мы сохраняем страницу в памяти.

В основной памяти должно быть место для всех страниц, принадлежащих процессу, чтобы загрузить этот процесс в память для выполнения. Если есть место только для нескольких страниц этого процесса, тогда какой-то другой процесс (т.е. все страницы, принадлежащие процессу) должен быть перенесен в резервное хранилище, и тогда только все страницы процесса, который должен быть выполнен, должны быть загружены в память.

Таким образом, техника подкачки дает лучшую производительность, чем простая замена.

Таким образом, подкачка позволяет нам запускать несколько процессов без покупки слишком большого количества памяти, вместо этого мы можем работать с небольшим объемом памяти (этот объем должен быть таким, чтобы все страницы самой большой программы / процесса, который должен быть запущен на ПК) может быть загружен в память - т.е. вы должны знать, сколько памяти требует ваша программа, прежде чем запускать ее.) плюс дополнительное хранилище резервных копий, обычно на диске, которое имеет гораздо меньшую стоимость для гораздо большей емкости, чем основная память.

Таким образом, подкачка + разбиение по страницам позволяют эффективно управлять памятью, чтобы в системе можно было запустить несколько процессов.

Спрос-пейджинг:

Но физическая память, установленная в системе, не обязательно должна соответствовать требованиям процесса. Также необходимо запустить несколько процессов.

Решение состоит в том, чтобы загрузить только некоторые страницы процесса в память, и когда процесс обращается к адресу на странице, которой нет в памяти, генерируется сбой страницы, и ОС загружает эту страницу по требованию, чтобы процесс мог продолжить выполнение, Это экономит время на загрузку всех страниц этого процесса перед передачей управления ему - как это было в случае пейджинга + подкачки.

Этот метод хранения только частей процесса в памяти и хранения в резервном хранилище, например на диске, называется подкачкой по требованию .

Таким образом, пейджинг по требованию = пейджинг + свопинг + сохраняют только некоторые страницы (не все) процесса в памяти.


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

Теперь мои вопросы:

  1. как именно термины виртуальной памяти и виртуального адресного пространства (или линейного адресного пространства) связаны с поиском страниц по требованию в контексте защищенного режима x86.

  2. Является ли «виртуальная память процесса» правильным термином или виртуальная память определена для всех процессов, работающих в настоящее время в многозадачной системе?

  3. Прав ли я в: виртуальной памяти, доступной для процесса == самый высокий адрес в виртуальном адресном пространстве (он же линейное адресное пространство) процесса + 1?

  4. Речь идет о сегментации: в защищенном режиме x86 нам говорят, что каждый процесс может иметь виртуальное адресное пространство 4 ГБ (VAS), это означает, что поскольку в архитектуре x86 присутствует сегментация, мы можем разделить этот VAS на два или более сегмента., В x86 Flat модельмы создаем сегменты в VAS процесса, и все они точно перекрываются, поэтому эффективно отключается сегментация - сегментов нет. Но затем, если, скажем, по виртуальному адресу в VAS какого-либо процесса присутствуют некоторые инструкции процессора, возможно, что мы перезаписываем эти инструкции при выделении памяти (в этом VAS) или при создании переменных или массивов. Как мы гарантируем, что этого не произойдет. Защитные биты в дескрипторе не различают ч / б области, так как в плоском режиме все сегменты перекрываются. Этот бит может только предотвратить чтение кода или выполнение данных, и это также только потому, что сегменты доступны через селекторы.

  5. или это что-то вроде того, что каждый сегмент рассматривается как его собственный VAS. Но в этом случае общая виртуальная память (или общая VAS), доступная для процесса в плоском режиме, будет тогда: «количество сегментов, принадлежащих процессу, x виртуальная память для одного сегмента». Для защищенного режима x86 это будет означать 6 x 4 ГБ = 24 ГБ VAS! предполагая 6 сегментов, указанных CS, DS, ES, GS, FS, SS регистрами. Это правильно ?

  6. Каким образом среда, поддерживающая простой пейджинг (не пейджинг по требованию), но не виртуальную память, обеспечит защиту ч / б различных сегментов в модели плоской памяти? У нас есть два случая - одна система задач и система многозадачности.

ОБНОВЛЕНИЕ: 2012-07-29

Так что, если я правильно понимаю:

Виртуальная память является концепцией, и она реализована на архитектуре x86 с использованием технологии пейджинга по требованию + некоторые защитные биты (в частности, бит U и бит W).

Таким образом, VAS процесса делится на страницы, которые затем используются в поисковой подкачке страниц.

Механизм виртуальной памяти имеет два основных применения в многозадачной среде:

  1. Размер программы может превышать объем физической памяти, доступной для нее. Операционная система хранит те части программы, которые в данный момент используются, в основной памяти, а остальная часть - на диске. Это реализуется путем пейджинга по требованию, где каждая страница имеет соответствующий «текущий бит» и «бит доступа» в своей записи таблицы страниц.

  2. Обеспечить защиту памяти, предоставив каждому процессу свое собственное виртуальное адресное пространство, чтобы один процесс не мог получить доступ к VAS другого процесса . Это реализуется с помощью некоторых защитных битов, связанных с каждой страницей . В частности, «бит пользователя / супервизора - бит U», бит W чтения / записи »в записи таблицы страниц используются для защиты доступа к странице .

Виртуальная память полезна как в однозадачной системе, так и в многозадачной системе. Для однозадачных систем релевантно только использование # 1.

Защита доступа к странице имеет 2 аспекта : защита на уровне привилегий и защита от записи . Они реализуются битом U (для prviledge) и битом W (для записи) соответственно. Эти биты присутствуют в записи таблицы страниц для этой страницы.

Защита памяти имеет 2 аспекта : защита программ от доступа друг к другу и защита программ от перезаписи, если сегменты перекрываются в VAS этого процесса / программы.

Теперь первая проблема решается с помощью VAS или концепции виртуальной памяти, но как насчет второй ?

Схема защиты доступа к странице не мешает последней, насколько я знаю. Таким образом, техника виртуальной памяти не предотвращает перезапись самими программами, если сегменты перекрываются в VAS процесса.

Но мне кажется, что даже защита на уровне сегментов не может предотвратить последнюю (перезаписывающуюся) проблему защиты памяти.

Процессор x86 всегда оценивает защиту на уровне сегмента перед выполнением проверки защиты на уровне страницы - независимо от того, плоская она или многосегментная модель - поскольку в процессоре x86 невозможно отключить сегментацию.

Рассмотрим сценарий плоской модели:

Рассмотрим виртуальный адрес, указанный CS: off. Теперь DS: off будет также ссылаться на тот же виртуальный адрес, что и CS: off, если значение «off» в обоих случаях одинаково. Это верно и для СС: выключено также.

Это также означает, что страница, в которой находится этот виртуальный / линейный адрес, рассматривается блоком подкачки как просто страница, так как она не знает о сегментации.

Предположим, что все сегменты программы в плоском режиме принадлежат к одному и тому же уровню привилегий, скажем, ring0.

Что будет, если мы попытаемся записать или выполнить данные в CS: off = DS: off = SS: off.

Предположим, что этот адрес не относится к коду ОС, отображенному в VAS процесса. Пожалуйста, просто оставьте ОС для простоты, я говорю о защите на аппаратном уровне!

Сначала будет проходить защита на уровне сегментов, затем будут проходить проверки на уровне привилегий при доступе к этой странице (странице, содержащей CS: выкл. Или DS: выкл. Или SS: выкл.), Поскольку здесь все сегменты принадлежат к одной и той же привилегии, но как насчет W бит для этой страницы. Это должно быть установлено в 1, чтобы разрешить записи, в противном случае, скажем, сегмент данных не сможет делать записи на своей странице. Так что это означает, что эта страница также доступна для записи.

Это означает, что мы можем читать / записывать / выполнять данные по этому виртуальному (линейному) адресу: CS: off = DS: off = SS: off.?

Я не понимаю, как аппаратное обеспечение x86 может обеспечить защиту в этом случае в случае перекрытия сегментов.

4

1 ответ на вопрос

3
Dougvj

Okay so admittedly there were alot of terms flying around and confusing wording, but I will do my best to answer. As far as I could tell you are correct in most of your understading, but there are some points to go over.

It is important to understand how paging and virtual memory work from a hardware context. Paging would prove impractical without hardware support because processes must be agnostic as to how the memory is laid out, and the operating system should not have to use software to babysit every process on the system. That's where the Memory Management Unit (MMU) comes in. This unit basically is programmed by the operating system to arrange pages in a virtual address space and can be controled at will by the operating system. The operating system can tell the unit which pages are actually in physical RAM, and which pages are not loaded yet or are swapped out.

So, how do we keep programs from messing with this memory management stuff? Something we call protection. We can keep processes sandboxed so that they do not interefere with the operating system and other processes. The confusion as to why all of these terms are thrown around together stems from the fact that they are indeed interconnected. The privelages that code have are specified by the page table. The page table tells the MMU how a virtual space is laid out and also tells the MMU whether a page is A) present B) is read/write C) is allowed to execute code and D) what privilege level (ring) the code on said page can execute.

When the scheduler schedules a process, the page table is not recreated, no new memory needs to be arranged, the Operating System simply tells the MMU to use a different page table, which is a O(1) process, or in other words, not dependent on the size of the process or how much memory it uses. Entire processes are rarely swapped in and out of memory at once, usually it is only pages at a time, so the term "swapping" is often clarified as "page swapping."

Okay so with that background, I will attempt to answer each of your questions:

  1. Linear Address Space simply means that you can access things from 0 to 2^32. No need for fancy segmentation as was necessary in the days of 16-bit processors. Virtual memory simply means that the linear address space of a process is defined not by main memory but by the Operating System, this means that the operating system can arrange pages arbitrarily in this address space, placing itself at a high level and the process at a lower level for example. Additionally the processor can specify which parts of this virtual address space are accessable by what privileges. The operating system (kernel) is loaded in every virtual address space so that the processes can do system calls and so that there is someplace to go when they are preempted. They cannot, however, read or write to this area because that is marked by the OS as "privileged code only." They can only accesses it via system call mechanisms in the processor (ie software interrupts). Demand paging simply means that process expects certain parts of this virtual address space to have specific content (perhaps a file, or even parts of itself), but it isnt really there, the OS has marked the area "not present" in the page table. When the process finally does access this area, because it is not present, the CPU throws a fault which is trapped by the OS. The OS then is smart enough to load that page and restart the process where it left off. The result is that the process is not even aware of the hiccup and things are only loaded as they are demanded, saving memory.

  2. Virtual Memory is the name of this entire mechanism of specifying page tables and thier protection, as well as the pages possibly being on another medium like a disk, therefore paging. Virtual Memory is probably the catchall term for your title, excepting perhaps segmentation. When referring to a specific process, I would personally use something like "Virtual address space of a process," since that unambiguosly refers to the virtual memory layout of a specific process.

  3. No. As I mentioned earlier, the OS can arbitrarily map real memory to any location in the virtual address space of a process. That means that it could, for example, have a situation where the process code is at address 0x0, but the heap (growing down) starts at 0xFFFFFFF, clear on the otherside of the address space. There may actually be constraints on where things are mapped due to device drivers needing specific address areas for hardware, but for the purpose of understanding virtual memory, there is no restriction.

  4. Segmentation is simply an addressing scheme. In the 286, it was also used as the mechanism for implementing protection, but that proved to be too inflexible and so in 32-bit processors protection is always done with paging (though as I understand, the 286 protection schemes are retained for when paging is disabled). Since protection is defined by the paging mechanism, segmentation doesnt cause any more or less risk to overwriting data than in a flat memory mode. With most executable file formats, the code segment is clearly separated from the data segment. As we can expect the code to never change, the operating system generally marks the pages of the code segment as read only, thus any attempt to write to code causes a fault and the program exits. This will never occur if all variables and arrays are allocated via the stack or heap in a modern operating system. If, however, the program starts poking around outside of this, it will crash before it is able to overwrite any code. A greater risk (and one which use to be a big problem) is having your stack overwritten in a buffer overrun. Some could take advantage of this to put code on the stack and then cause it to be executed unauthorizedly. As a fix, a new bit was placed in the page table "No eXecute" (NX) bit. This prevents a page from ever being executed.

  5. This is not at all true. The segments simply act as pointers to an area (segment) of the original 2^32 bytes of address space. The idea behind this originally was that it would keep pointers smalle, since you could have a segment pointer and a pointer inside that segment that was smaller than the entire address space. For example, in the 286 (a 16-bit processor) it made sense to keep pointers at 16-bits, yet this presented a problem because the 286 could address 2^24 bytes of memory. The solution? Use segmentation. A segment could be 2^16 bytes large and they could point anywhere in the address space. Then when code had to operate, it would use 16-bit pointers for within that segment only. This was faster and more eifficient. When 32-bit processors came out this mechanism was not longer neccessary, but since it was used so much by code prior and programmers were used to them, they kept segmentation. Newer 64-bit processors do not use segmentation at all.

  6. Confusion here is the fact that virtual memory is the term for many of these different mechanisms. Virtual Memory is required for multitasking for protection of one process from another processes address space. Paging, and by extension preemptive multitasking, is only possible with virtual memory features. Many of these features, however, can be effectively disabled. Perhaps you dont want address translation? Then map every page to itself. Perhaps you dont want memory protection but want address translation? Then give all privileges to every page. In DOS and other single processor systems, a confusion arises when one refers to "protected mode." Usually this refers to 32-bit mode as opposed to 16-bit real mode, so despite the name it does not necessarily mean that protection is used, only that in that mode it can be enabled. There are probably many single process systems that run in this "protected mode" but do not use virtual memory nor protection. The original Xbox is a good example of that. There can be a slight increase in performance when all these features are disabled. However, in DOS it still may be advantageous to use many of these features. The most notable is page swapping, since in the early days when DOS was ubiquitious, RAM was hard to come by and therefore any mechanism that saved on RAM was welcomed and well used. Protection had its advantages in single process systems as well, since it could prevent the program from crashing in an ugly manner, allow for better debugging, and prevented data corruption due to bad hardware access.

I hope this answers your question.

Ладно, становится понятнее. :) Но я не получил ваш ответ на мои вопросы № 4 и № 6. Что касается вопроса № 4, см. Мое обновление 2012-07-29. Что касается Q # 6, я спросил его, потому что некоторые среды [DPMI] (http://en.wikipedia.org/wiki/DOS_Protected_Mode_Interface) (те, которые запускают приложения на ring0, а сами работают на чистой DOS), не поддерживает виртуальную память, но поддерживает разбиение по страницам. Я не понял, насколько полезен пейджинг в таком случае, особенно если в системе присутствует однозадачная среда, например, DOS? jacks 12 лет назад 0
@jacks Я изменил ответ, чтобы попытаться ответить на эти вопросы лучше. Краткая версия такова: перезапись кода предотвращается, если кодовые страницы доступны только для чтения; DPMI не всегда означает, что защита или разбиение на страницы включены, но иногда это делается для экономии памяти и предотвращения страшных сбоев. Dougvj 12 лет назад 0
Это означает, что без использования * виртуальной памяти пейджинг бесполезен. Не так ли? Относительно * "аппаратное обеспечение x86 может обеспечить защиту по этому вопросу в случае перекрытия сегментов" *, кажется, что без поддержки ОС, то есть, скажем, мы выполняем нашу программу в ring0 без ОС, т.е. наше приложение является ядром, как приложение., Тогда в аппаратном обеспечении x86 нет ничего, что может помешать нам * выполнить * данные и * записать * в сегмент кода. Это ОС, которая наряду с аппаратной поддержкой x86, не позволяет этому радоваться. Я прав? jacks 12 лет назад 0
Это верно, хотя наше приложение ring0 может действовать как ОС и настраивать правильные механизмы защиты, чтобы предотвратить это, оно действительно будет полезно только для отладки, а не для реальной безопасности. Перестановка страниц была бы полезна для экономии памяти, но ее было бы нетривиально реализовать для одного приложения. Dougvj 12 лет назад 0
Понял. :) Я буду исследовать больше на эту тему и посмотрим, есть ли что-то, что меня смущает. jacks 12 лет назад 0