|
6.2. Физическая памятьНиже представлена карта физической памяти перед тем, как будет выполнен любой процесс. Левый столбец представляет начальный адрес инструкции, отмеченные значения являются приблизительными. Средний столбец включает в себя название инструкции. Крайний правый столбец представляет имя соответствующей процедуры или переменной или комментарий входа. 0x110000 свободна memory_end или high_memory mem_map mem_init() inode_table inode_init() ннформ. устройства device_init()+ 0x100000 добав. pg_tables paging_init() 0x0A0000 не используется 0x060000 свободна low_memory_start 0x006000 код ядра + данные floppy_track_buffer bad_pg_table занято page_fault_handlers для bad_page уничтожения процесса, если он находится вне памяти. 0x002000 pg0 первая таблица страниц в ядре 0x001000 swapper_pg_dir каталог страниц ядра 0x000000 нулевая страница + устройство, захватывающее память (main.c): profil_buffer, con_init, psaux_init, rd_init, scsi_dev_init. Заметьте, что не вся память помечена как FREE или RESERVRVED (mem_init). Страницы, помеченные как RESERVED принадлежат ядру и никогда не освобождаются или переставляются. 6.3. Память пользовательского процесса0xc0000000 невидимое ядро не используется начальный стек место для расширения стека 4 страницы 0x60000000 стабильно записанные биьлиотеки brk не используется распределенная память end_data не инициализированные данные end_code инициализированные данные 0x00000000 текст Как сегмент кода, так и сегмент данных в каждом случае размещаются в области от 0х00 - 3GB. Обычно программа контроля равильности использования страниц do_wp_page проверяет, чтобы процесс не производил запись в область кода. Однако, если перехватить SEGV сигнал, то появляется возможность писать в область кода, инициируя возникновение COPY-ON-WRITE. Программа управления do_no_page гарантирует, что ни одна новая страница, выделенная процессу, не будет принадлежать ни исполняемой области, ни разделяемой библиотеке, ни стеку, ни попадет внутрь brk значения. Пользовательский процесс может сбросить свое brk значение посредством вызова sbrk(). Это то, что делает malloc(), когда это необходимо. Части текста и данных размещаются в отдельных страницах, если не установлена опция -N компилятора. Адреса загрузки разделяемой библиотеки обычно сами берутся из разделяемого пространства. Такой адрес лежит между 1.5GB и 3GB за исключением особых случаев. своппируемая стабильная страницы кода Y Y страницы информации Y N? стек Y N pg_dir N N кодовая/информационная page_table N N стек page_table N N task_struct N N kernel_stack_frame N N shlib page_table N N несколько shlib страниц Y Y? [Что означают отметки в виде вопроса? Должны ли они означать вашу неуверенность или альтернативность решения?] Стек, разделяемые библиотеки и данные слишком удалены друг от друга, чтобы перекрываться одной таблицей страниц. Все page_tables ядра разделяются всеми процессами и поэтому не приведены в списке. Перемещаются только грязные страницы. Чистые страницы могут заниматься, таким образом процесс может читать их снова из исполняемой области в случае такой необходимости. Обычно разделяются только чистые страницы. Грязная страница перестает разделяться в случае распараллеливания пока родитель или потомок не станет снова производить в нее запись. |
helloworld.ru © 2001-2021 Все права защищены |
|
|