Перейти на главную   
  helloworld.ru - документация и книги по программированию  
helloworld.ru - документация и книги по программированию
    главная     хостинг    
Поиск по сайту:  
Смотрите также
Языки программирования
C#
MS Visual C++
Borland C++
C++ Builder
Visual Basic
Quick Basic
Turbo Pascal
Delphi
JavaScript
Java
PHP
Perl
Assembler
AutoLisp
Fortran
Python
1C

Интернет-технологии
HTML
VRML
HTTP
CGI
FTP
Proxy
DNS
протоколы TCP/IP
Apache

Web-дизайн
HTML
Дизайн
VRML
PhotoShop
Cookie
CGI
SSI
CSS
ASP
PHP
Perl

Программирование игр
DirectDraw
DirectSound
Direct3D
OpenGL
3D-графика
Графика под DOS

Алгоритмы
Численные методы
Обработка данных

Сис. программирование
Драйверы

Базы данных
MySQL
SQL

Другое

Хостинг


Друзья
demaker.ru
Реклама

Лучший хостинг. Аренда серверов




helloworld.ru

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
Все права защищены