Роберт Лав - Разработка ядра Linux

Тут можно читать онлайн Роберт Лав - Разработка ядра Linux - бесплатно полную версию книги (целиком) без сокращений. Жанр: comp-programming, издательство Издательский дом Вильямс, год 2006. Здесь Вы можете читать полную версию (весь текст) онлайн без регистрации и SMS на сайте лучшей интернет библиотеки ЛибКинг или прочесть краткое содержание (суть), предисловие и аннотацию. Так же сможете купить и скачать торрент в электронном формате fb2, найти и слушать аудиокнигу на русском языке или узнать сколько частей в серии и всего страниц в публикации. Читателям доступно смотреть обложку, картинки, описание и отзывы (комментарии) о произведении.
  • Название:
    Разработка ядра Linux
  • Автор:
  • Жанр:
  • Издательство:
    Издательский дом Вильямс
  • Год:
    2006
  • Город:
    Москва
  • ISBN:
    5-8459-1085-4
  • Рейтинг:
    3.67/5. Голосов: 91
  • Избранное:
    Добавить в избранное
  • Отзывы:
  • Ваша оценка:
    • 80
    • 1
    • 2
    • 3
    • 4
    • 5

Роберт Лав - Разработка ядра Linux краткое содержание

Разработка ядра Linux - описание и краткое содержание, автор Роберт Лав, читайте бесплатно онлайн на сайте электронной библиотеки LibKing.Ru

В книге детально рассмотрены основные подсистемы и функции ядер Linux серии 2.6, включая особенности построения, реализации и соответствующие программны интерфейсы. Рассмотренные вопросы включают: планирование выполнения процессов, управление временем и таймеры ядра, интерфейс системных вызовов, особенности адресации и управления памятью, страничный кэш, подсистему VFS, механизмы синхронизации, проблемы переносимости и особенности отладки. Автор книги является разработчиком основных подсистем ядра Linux. Ядро рассматривается как с теоретической, так и с прикладной точек зрения, что может привлечь читателей различными интересами и потребностями.

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

Разработка ядра Linux - читать онлайн бесплатно полную версию (весь текст целиком)

Разработка ядра Linux - читать книгу онлайн бесплатно, автор Роберт Лав
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

Процесс имеет право доступа только к действительным областям памяти. Более того, на область памяти могут быть установлены права только для чтения или запрет на выполнение. Если процесс обращается к адресу памяти, который не находится в действительной области памяти, или доступ к действительной области выполняется запрещенным образом, то ядро уничтожает процесс с ужасным сообщением "Segmentation Fault" (ошибка сегментации).

Области памяти могут содержать следующую нужную информацию.

• Отображение выполняемого кода из выполняемого файла в область памяти процесса, которая называется сегментом кода ( text section ).

• Отображение инициализированных переменных из выполняемого файла в область памяти процесса, которая называется сегментом данных ( data section ).

• Отображение страницы памяти, заполненной нулями, в область памяти процесса, которая содержит неинициализированные глобальные переменные и называется сегментом bss [79] Термин "BSS" сложился исторически и является достаточно старым. Он означает block started by symbol ( блок, начинающийся с символа ). Неинициализированные переменные в выполняемом файле не хранятся, поскольку с ними не связано никакого значения. Тем не менее стандарт языка С требует, чтобы неинициализированным переменным присваивалось определенное значение по умолчанию (обычно все заполняется нулями). Поэтому ядро загружает переменные (без их значений) из выполняемого файла в память и отображает в эту память нулевую страницу, тем самым переменным присваивается нулевое значение без необходимости зря тратить место в объектном файле на ненужную инициализацию. ( bss section ). Нулевая страница памяти (zero page, страница памяти, заполненная нулями) — это страница памяти, которая полностью заполнена нулевыми значениями и используется, например, для указанной выше цели.

• Отображение страницы памяти, заполненной нулями, в память процесса, которая используется в качестве стека процесса пространства пользователя (не нужно путать со стеком процесса в пространстве ядра, который является отдельной структурой данных и управляется и используется ядром).

• Дополнительные сегменты кода, данных и BSS каждой совместно используемой библиотеки, таких как библиотека libc и динамический компоновщик, которые загружаются в адресное пространство процесса.

• Все файлы, содержимое которых отображено в память.

• Все области совместно используемой памяти.

• Все анонимные отображения в память, как, например, связанные с функцией malloc() [80] В более новых версиях библиотеки glibc функция malloc() реализована через системный вызов mmap() , а не через вызов brk() . .

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

Дескриптор памяти

Ядро представляет адресное пространство процесса в виде структуры данных, которая называется дескриптором памяти . Эта структура содержит всю информацию, которая относится к адресному пространству процесса. Дескриптор памяти представляется с помощью структуры struct mm_struct, которая определена в файле [81] Между дескриптором процесса, дескриптором памяти и соответствующими функциями существует тесная связь. Поэтому структура struct mm_struct и определена в заголовочном файле sched.h . .

Рассмотрим эту структуру с комментариями, поясняющими назначение каждого поля.

struct mm_struct {

struct vm_area_struct *mmap; /* список областей памяти */

struct rb_root mm_rb; /* красно-черное дерево

областей памяти */

struct vm_area_struct *mmap_cache; /* последняя использованная

область памяти */

unsigned long free_area_cache; /* первый незанятый участок

адресного пространства */

pgd_t *pgd; /* глобальный каталог страниц */

atomic_t mm_users; /* счетчик пользователей адресного

пространства */

atomic_t mm_count; /* основной счетчик использования */

int map_count; /* количество областей памяти */

struct rw_semaphore mmap_sem; /* семафор для областей памяти */

spinlock_t page_table_lock; /* спин-блокировка

таблиц страниц */

struct list_head mmlist; /* список всех структур mm_struct */

unsigned long start_code; /* начальный адрес сегмента кода */

unsigned long end code; /* конечный адрес сегмента кода */

unsigned long start_data; /* начальный адрес сегмента данных */

unsigned long end_data; /* конечный адрес сегмента данных */

unsigned long start_brk; /* начальный адрес сегмента "кучи" */

unsigned long brk; /* конечный адрес сегмента "кучи" */

unsigned long start_stack; /* начало стека процесса */

unsigned long arg_start; /* начальный адрес

области аргументов */

unsigned long arg_end; /* конечный адрес

области аргументов */

unsigned long env_start; /* начальный адрес

области переменных среды */

unsigned long env_end; /* конечный адрес

области переменных среды */

unsigned long rss; /* количество физических страниц памяти */

unsigned long total_vm; /* общее количество страниц памяти */

unsigned long locked_vm; /* количество заблокированных страниц

памяти */

unsigned long def_flags; /* флаги доступа, используемые

по умолчанию */

unsigned long cpu_vm_mask; /* маска отложенного переключения

буфера TLB */

unsigned long swap_address; /* последний сканированный адрес */

unsigned dumpable:1; /* можно ли создавать файл core? */

int used_hugetlb; /* используются ли гигантские

страницы памяти (hugetlb)? */

mm_context_t context; /* данные, специфичные для аппаратной

платформы */

int core_waiters; /* количество потоков, ожидающих на

создание файла core */

struct completion *core_startup_done; /* условная переменная начала

создания файла core */

struct completion core_done; /* условная переменная завершения

создания файла core */

rwlock_t ioctx_list_lock; /* блокировка списка асинхронного

ввода-вывода (AIO) */

struct kioctx *ioctx_list; /* список асинхронного ввода-вывода (AIO) */

struct kioctx default_kioctx; /* контекст асинхронного ввода-

вывода, используемый по умолчанию */

};

Поле mm_users— это количество процессов, которые используют данное адресное пространство. Например, если одно и то же адресное пространство совместно используется двумя потоками, то значение поля mm_usersравно двум. Поле mm_count — это основной счетчик использования структуры mm_struct. Наличие пользователей структуры, которым соответствует поле mm_users, приводит к увеличению счетчика mm_countна единицу. В предыдущем примере значение поля mm_countравно единице. Когда значение поля mm_usersстановится равным нулю (т.е. когда два потока завершатся), только тогда значение поля mm_countуменьшается на единицу. Когда значение поля mm_count становится равным нулю, то на соответствующую структуру mm_structбольше нет ссылок, и она освобождается, Поддержка двух счетчиков позволяет ядру отличать главный счетчик использования ( mm_count) от количества процессов, которые используют данную структуру ( mm_users).

Читать дальше
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать


Роберт Лав читать все книги автора по порядку

Роберт Лав - все книги автора в одном месте читать по порядку полные версии на сайте онлайн библиотеки LibKing.




Разработка ядра Linux отзывы


Отзывы читателей о книге Разработка ядра Linux, автор: Роберт Лав. Читайте комментарии и мнения людей о произведении.


Понравилась книга? Поделитесь впечатлениями - оставьте Ваш отзыв или расскажите друзьям

Напишите свой комментарий
x