Когда говорят, что 3 программы (исполняемые файлы) загружаются в память, расположение могло бы выглядеть примерно так:
сопроводительный текст http://img97.imageshack.us/img97/3460/processesm.jpg
У меня есть следующие вопросы:
Понятие Виртуальной памяти ограничено пользовательскими процессами? Поскольку, я задаюсь вопросом, где Ядро операционной системы, Драйверы живут? Как его расположение памяти? Я хочу знать больше о памяти стороны ядра. Я знаю, что его конкретная операционная система делает Ваш выбор (окна/Linux).
Является понятие Виртуальной памяти основанием для каждого процесса? Я имею в виду, это корректный, чтобы я сказал что 4 ГБ process1 + 4 ГБ process2 + 4 ГБ process3 = 12 ГБ виртуальной памяти (для всех процессов). Это не звучит правильным. Или от пространства в общей сложности 4 ГБ 1 ГБ взят ядром и отдыхом, 3 ГБ совместно используются черно-белые все процессы.
Они говорят на машине на 32 бита в 4 ГБ адресного пространства. Половина из него (или позже 1 ГБ) занята ядром. Я вижу в этой схеме, что "Виртуальная память ядра" занимает 0xc0000000 - 0xffffffff (= 1 ГБ). Они говорят об этом? или это - что-то еще? Просто хочу подтвердить.
Что точно делает Kernel Virtual Memory
из каждого из этих процессов содержат? Каково его расположение?
Когда мы делаем IPC, мы говорим об общей памяти. Я не вижу памяти, совместно использованной этими процессами. Где это живет?
Ресурсы (файлы, реестры в окнах) глобальны ко всем процессам. Так, таблица ресурса/дескриптора файла должна быть в некотором глобальном пространстве. Какая область, в которой был бы?
Где я могу знать больше об этом материале стороны ядра.
Когда система использует виртуальную память, ядро также использует виртуальную память. Windows будет использовать верхние 2 ГБ (или 1 ГБ, если вы указали переключатель / 3 ГБ в загрузчике Windows) для собственного использования. Это включает в себя код ядра, данные (или, по крайней мере, данные, которые выгружаются - это верно, Windows может выгружать части адресного пространства ядра на жесткий диск) и таблицы страниц.
Каждый процесс имеет собственное адресное пространство виртуальной машины. Когда происходит переключение процесса, таблицы страниц обычно заменяются таблицей страниц другого процесса. Это просто сделать на процессоре x86 - достаточно изменить базовый адрес таблицы страниц в регистре управления CR3
. Все адресное пространство 4 ГБ заменено таблицами, заменяющими совершенно другое адресное пространство 4 ГБ.При этом обычно существуют области адресного пространства, которые разделяются между процессами. Эти области помечаются в таблицах страниц специальными флагами, которые указывают процессору, что эти области не нужно аннулировать в резервном буфере преобразования процессора .
Как я упоминал ранее, код ядра, данные и сами таблицы страниц должны где-то находиться. Эта информация находится в адресном пространстве ядра. Возможно, что некоторые части кода ядра, данных и таблиц страниц могут быть при необходимости выгружены на диск. Некоторые части считаются более важными, чем другие, и никогда не меняются местами.
См. (3)
Это зависит от обстоятельств. Совместно используемая память пользовательского режима расположена в адресном пространстве пользовательского режима. Части адресного пространства режима ядра также могут быть разделены между процессами. Например, нередко код ядра используется всеми процессами в системе. Где находится это воспоминание, неточно. Здесь я использую произвольные адреса, но общая память, расположенная по адресу 0x100000
в одном процессе, может быть расположена по адресу 0x101000
внутри другого процесса. Две страницы в разных адресных пространствах с совершенно разными адресами могут указывать на одну и ту же физическую память.
Я не понимаю, что вы здесь имеете в виду. Дескрипторы открытых файлов не являются глобальными для всех процессов. Файловая система, хранящаяся на жестком диске, является глобальной для всех процессов.В Windows дескрипторы файлов управляются ядром, а объекты хранятся в адресном пространстве ядра и управляются диспетчером объектов ядра.
Для систем на базе Windows NT я бы порекомендовал Windows Internals, 5ed Марка Руссиновича и Дэвида Соломона
Ответ на комментарий:
И теперь эти 3 ГБ совместно используются ч / б { {1}} процессов? или у каждого процесса есть 4 ГБ места?
Это зависит от ОС. Некоторые ядра (например, микроядро L4
) используют одну и ту же таблицу страниц для нескольких процессов и разделяют адресные пространства с помощью сегментации . В Windows каждый процесс получает свои собственные таблицы страниц. Помните, что даже если у каждого процесса может быть свое собственное виртуальное адресное пространство, это не означает, что физическая память всегда разная. Например, образ для kernel32.dll
, загруженный в процессе A, используется совместно с kernel32.dll
в процессе B. Большая часть адресного пространства ядра также используется совместно между процессами.
Почему у каждого процесса есть виртуальная память ядра ?
Лучший способ подумать об этом - спросить себя: «Как бы работало ядро, если бы оно не выполнялось с использованием виртуальной памяти?» В этой гипотетической ситуации каждый раз, когда ваша программа вызвала переключение контекста в ядре (скажем, вы сделали системный вызов), виртуальная память должна была быть отключена, пока ЦП выполнялся в пространстве ядра. За это нужно платить, и за повторное включение, когда вы снова переключаетесь в пользовательское пространство, придется заплатить.
Кроме того, предположим, что пользовательская программа передала указатель на некоторые данные для своего системного вызова. Этот указатель является виртуальным адресом. У вас отключена виртуальная память, поэтому этот указатель необходимо преобразовать в физический адрес, прежде чем ядро сможет что-либо с ним сделать. Если бы у вас была включена виртуальная память, вы бы получили ее бесплатно благодаря блоку управления памятью на ЦП.Вместо этого вам придется вручную переводить адреса в программном обеспечении. Я мог бы описать всевозможные примеры и сценарии (некоторые связаны с оборудованием, некоторые - с обслуживанием таблиц страниц и т. Д.), Но суть в том, что гораздо проще иметь однородную схему управления памятью. Если пользовательское пространство использует виртуальную память, будет проще написать ядро, если вы сохраните эту схему в пространстве ядра. По крайней мере, таков мой опыт.
будет только один экземпляр ядра ОС , верно? тогда почему каждый процесс имеет отдельное виртуальное пространство ядра?
Как я упоминал выше, довольно большая часть этого адресного пространства будет совместно использоваться между процессами. В пространстве ядра есть данные для каждого процесса, которые выгружаются при переключении контекста между процессами, но многие из них используются совместно, потому что есть только одно ядро.