Перейти на главную   
  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.4. Данные управления памятью в таблице процессов

Ниже приводится краткое описание некоторых данных, содержащихся в таблице процессов, которые используются для управления памятью: [Это должно быть документировано значительно лучше. Необходима значительно большая детализация]

  • Ограничения на память процесса: ulong start_code, end_code, end_data, brk, start_stack;
  • Определение нарушения страницы: ulong min_flt, maj_flt, cmin_flt, cmaj_flt;
  • Локальная таблица дескриптора: struct desc_struct ltd[32] представляет собой локальную таблицу дескриптора задачи.
  • rss количество резидентных страниц.
  • swappable: если - 0, тогда страницы процесса не замещаются.
  • kernel_stack_page: указатель на страницу, размещенную при распараллеливании.
  • saved_kernel_stack: V86 режим работы.
  • struct tss
  • Сегмент стека esp0 указатель на стек ядра (kernel_stack_page)
    ss0 сегмент стека ядра (0х10)
    esp1 = ss1 = esp2 = ss2 = 0
    неиспользуемые привилегированные уровни.
  • Секторы сегмента: ds = es = fs = gs = ss = 0x17, cs = 0x0f все указатели на сегменты в текущем ltd[].
  • cr3: указывает на директорию страниц для данного процесса.
  • ltd: _LTD(n) селектор для LTD текущей задачи.

6.5. Инициализация памяти

В start_kernel (main.c) имеются 3 переменные, связанные с инициализацией памяти:

  • memory_start начинается от 1MB. Изменяется посредством инициализации устройства.
  • memory_end конец физической памяти: 8MB, 16MB и т.д.
  • low_memory_start конец кода и данных ядра, загружаемых первоначально.

Каждое устройство при инициализации по-своему берет memory_stsrt и возвращает измененное значение, если оно выделяет пространство начиная с memory_stsrt (просто захватывая его). paging_init() инициализирует таблицы страниц в swapper_pg_dir (начинающиеся с 0хс0000000), чтобы накрыть всю физическую память начиная с memory_start и кончая memory_end. В действительности первые 4МВ обрабатываются в startup_32 (head.s). memory_start увеличивается, если добавляется какая-либо новая page_tables. При пребывании по обращению по пустому указателю в ядре первая страница обнуляется.

В shed_init() ltd и tss дескрипторы задачи task[0] устанавливаются в GDT, и загружаются в TR и DTR (единственный случай, когда это делается явно). TRAP GATE (0х80) устанавливается для system_call(). Флаг вложенной задачи сбрасывается при подготовке к переходу в пользовательский режим. Таймер включается. task_struct для task[0] в полном объеме появляется в.

Далее с помощью mem_init() создается mem_map, чтобы отражать текущее использование физических страниц. Это состояние, которое отражается в карте физической памяти, описанной в предыдущем разделе.

Linux переходит в пользовательский режим посредством iret после сохранения в стеке ss, esp и т.п. Естественно, что сегменты пользователя для task[0] управляются прямо через сегменты ядра, т.о. выполнение продолжается точно с того места, где оно было прервано.

task[0]:

  • pg_dir = swapper_pg_dir, что означает, что управление адресами происходит только в области от 3GB до 3GB + high_memory/
  • LTD[1] = код пользователя, base=0xc0000000, size=640K
  • LTD[2] = данные пользователя, base=0xc0000000, size=640K

Первый вызов exec() устанавливает входы LTD для task[1] в пользовательские значения с base=0x0, limit= TASK_SIZE = 0xc0000000. Согласно этому ни один процесс не видит сегменты ядра пока находится в пользовательском режиме.


[ Назад | Оглавление | Далее ]









helloworld.ru © 2001-2021
Все права защищены