Что делает Виртуальную память Ядра каждого процесса, содержат?

Когда говорят, что 3 программы (исполняемые файлы) загружаются в память, расположение могло бы выглядеть примерно так:

сопроводительный текст http://img97.imageshack.us/img97/3460/processesm.jpg

У меня есть следующие вопросы:

  1. Понятие Виртуальной памяти ограничено пользовательскими процессами? Поскольку, я задаюсь вопросом, где Ядро операционной системы, Драйверы живут? Как его расположение памяти? Я хочу знать больше о памяти стороны ядра. Я знаю, что его конкретная операционная система делает Ваш выбор (окна/Linux).

  2. Является понятие Виртуальной памяти основанием для каждого процесса? Я имею в виду, это корректный, чтобы я сказал что 4 ГБ process1 + 4 ГБ process2 + 4 ГБ process3 = 12 ГБ виртуальной памяти (для всех процессов). Это не звучит правильным. Или от пространства в общей сложности 4 ГБ 1 ГБ взят ядром и отдыхом, 3 ГБ совместно используются черно-белые все процессы.

  3. Они говорят на машине на 32 бита в 4 ГБ адресного пространства. Половина из него (или позже 1 ГБ) занята ядром. Я вижу в этой схеме, что "Виртуальная память ядра" занимает 0xc0000000 - 0xffffffff (= 1 ГБ). Они говорят об этом? или это - что-то еще? Просто хочу подтвердить.

  4. Что точно делает Kernel Virtual Memory из каждого из этих процессов содержат? Каково его расположение?

  5. Когда мы делаем IPC, мы говорим об общей памяти. Я не вижу памяти, совместно использованной этими процессами. Где это живет?

  6. Ресурсы (файлы, реестры в окнах) глобальны ко всем процессам. Так, таблица ресурса/дескриптора файла должна быть в некотором глобальном пространстве. Какая область, в которой был бы?

  7. Где я могу знать больше об этом материале стороны ядра.

22
задан claws 15 March 2010 в 19:24
поделиться

1 ответ

  1. Когда система использует виртуальную память, ядро ​​также использует виртуальную память. Windows будет использовать верхние 2 ГБ (или 1 ГБ, если вы указали переключатель / 3 ГБ в загрузчике Windows) для собственного использования. Это включает в себя код ядра, данные (или, по крайней мере, данные, которые выгружаются - это верно, Windows может выгружать части адресного пространства ядра на жесткий диск) и таблицы страниц.

  2. Каждый процесс имеет собственное адресное пространство виртуальной машины. Когда происходит переключение процесса, таблицы страниц обычно заменяются таблицей страниц другого процесса. Это просто сделать на процессоре x86 - достаточно изменить базовый адрес таблицы страниц в регистре управления CR3 . Все адресное пространство 4 ГБ заменено таблицами, заменяющими совершенно другое адресное пространство 4 ГБ.При этом обычно существуют области адресного пространства, которые разделяются между процессами. Эти области помечаются в таблицах страниц специальными флагами, которые указывают процессору, что эти области не нужно аннулировать в резервном буфере преобразования процессора .

  3. Как я упоминал ранее, код ядра, данные и сами таблицы страниц должны где-то находиться. Эта информация находится в адресном пространстве ядра. Возможно, что некоторые части кода ядра, данных и таблиц страниц могут быть при необходимости выгружены на диск. Некоторые части считаются более важными, чем другие, и никогда не меняются местами.

  4. См. (3)

  5. Это зависит от обстоятельств. Совместно используемая память пользовательского режима расположена в адресном пространстве пользовательского режима. Части адресного пространства режима ядра также могут быть разделены между процессами. Например, нередко код ядра используется всеми процессами в системе. Где находится это воспоминание, неточно. Здесь я использую произвольные адреса, но общая память, расположенная по адресу 0x100000 в одном процессе, может быть расположена по адресу 0x101000 внутри другого процесса. Две страницы в разных адресных пространствах с совершенно разными адресами могут указывать на одну и ту же физическую память.

  6. Я не понимаю, что вы здесь имеете в виду. Дескрипторы открытых файлов не являются глобальными для всех процессов. Файловая система, хранящаяся на жестком диске, является глобальной для всех процессов.В Windows дескрипторы файлов управляются ядром, а объекты хранятся в адресном пространстве ядра и управляются диспетчером объектов ядра.

  7. Для систем на базе Windows NT я бы порекомендовал Windows Internals, 5ed Марка Руссиновича и Дэвида Соломона

Ответ на комментарий:

И теперь эти 3 ГБ совместно используются ч / б { {1}} процессов? или у каждого процесса есть 4 ГБ места?

Это зависит от ОС. Некоторые ядра (например, микроядро L4 ) используют одну и ту же таблицу страниц для нескольких процессов и разделяют адресные пространства с помощью сегментации . В Windows каждый процесс получает свои собственные таблицы страниц. Помните, что даже если у каждого процесса может быть свое собственное виртуальное адресное пространство, это не означает, что физическая память всегда разная. Например, образ для kernel32.dll , загруженный в процессе A, используется совместно с kernel32.dll в процессе B. Большая часть адресного пространства ядра также используется совместно между процессами.

Почему у каждого процесса есть виртуальная память ядра ?

Лучший способ подумать об этом - спросить себя: «Как бы работало ядро, если бы оно не выполнялось с использованием виртуальной памяти?» В этой гипотетической ситуации каждый раз, когда ваша программа вызвала переключение контекста в ядре (скажем, вы сделали системный вызов), виртуальная память должна была быть отключена, пока ЦП выполнялся в пространстве ядра. За это нужно платить, и за повторное включение, когда вы снова переключаетесь в пользовательское пространство, придется заплатить.

Кроме того, предположим, что пользовательская программа передала указатель на некоторые данные для своего системного вызова. Этот указатель является виртуальным адресом. У вас отключена виртуальная память, поэтому этот указатель необходимо преобразовать в физический адрес, прежде чем ядро ​​сможет что-либо с ним сделать. Если бы у вас была включена виртуальная память, вы бы получили ее бесплатно благодаря блоку управления памятью на ЦП.Вместо этого вам придется вручную переводить адреса в программном обеспечении. Я мог бы описать всевозможные примеры и сценарии (некоторые связаны с оборудованием, некоторые - с обслуживанием таблиц страниц и т. Д.), Но суть в том, что гораздо проще иметь однородную схему управления памятью. Если пользовательское пространство использует виртуальную память, будет проще написать ядро, если вы сохраните эту схему в пространстве ядра. По крайней мере, таков мой опыт.

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

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

25
ответ дан 29 November 2019 в 05:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: