Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Исключение ошибки памяти на PowerPC



Обработчик ошибок страниц на PowerPC do_page_f ault () вызывается в результате ошибки инструкции или сохранения данных. Из-за разницы между версиями процес­соров PowerPC коды ошибок имеют немного различный формат, но несут одну и ту же информацию. Наибольший интерес представляют биты с проблемной операцией и биты,


Резюме



означающие наступление ошибки защиты. Обработчик ошибки страницы PowerPC do_page_f ault () не инициирует ошибку oops.

На PowerPC код метки no_context совмещен с меткой bad_area и находится в функции bad__page_f ault (), завершающейся порождением ошибки сегментации. Эта функция также имеет функцию восстановления, которая просматривает exception_ table.

Резюме

В этой главе мы начали с обзора концепций, связанных с управлением памятью. Затем мы описали реализацию каждой из концепций. Первой рассмотренной концепцией были страницы, являющиеся для ядра базовой единицей управления памятью. Также мы рас­смотрели слежение ядра за страницами. Затем мы обсудили зоны памяти, отделяющие память от аппаратных ограничений. Далее мы обсудили фреймы страниц и алгоритмы выделения и освобождения памяти в Linux, называемые системой близнецов.

После этого мы рассмотрели основы управления страницами и фреймами страниц, обсудили выделение памяти меньшего, чем у страницы, размера, реализуемое с помощью выделения выделителя секций. Таким образом, мы подошли к обсуждению kmalloc () и функциям выделения ядром памяти. Мы проследили выполнение функций вплоть до то­го, как они взаимодействуют с выделителем секций. На этом мы закончили обсуждение структур управления памятью.

После рассмотрения структур и алгоритмов управления памятью мы поговорили об управлении памятью процесса пользовательского пространства. Управление памятью процесса отличается от управления памятью в ядре. Мы обсудили расположение памяти для процесса и как ее отдельные части разделены и отображаются в память. Далее во вре­мя обсуждения процесса управления памятью мы представили вашему вниманию концеп­цию ошибок страниц обработчика прерываний, который занимается обработкой исчез­нувших из памяти страниц.

Проект: отображение памяти процесса

Теперь мы рассмотрим, как память выглядит для нашей собственной программы. Этот проект состоит из объяснения программы пользовательского пространства, иллюст­рирующей, как размещаются объекты в памяти. Для этого проекта мы создали простую разделяемую библиотеку и программу пользовательского пространства, применяющую ее функции. Из этой программы мы распечатаем расположение некоторых переменных и сравним его с отображением процесса для определения того, где размещаются пере­менные и функции.

Первым шагом является создание разделяемой библиотеки. Разделяемая библиотека может состоять из одной функции, которая будет вызываться из главной программы. Мы



Глава 4 • Управление памятью


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

lkpsinglefоо.с mylibfoo() {

int libvar;

printf(" variable libvar \t location: Ox%x\n", fclibvar); }

Откомпилируем и скомпонуем singlef оо. с в разделяемую библиотеку:

#lkp> gcc -с lkpsinglefоо.с

#lkp> gcc lkpsinglefоо.с -о liblkpsinglefoo.so -shared -lc

-shared и -lc - это флаги опций сборщика. Опция -shared требует, чтобы был создан разделяемый объект, который может быть объединен с другими объектами. Флаг -1с указывает, что при сборке будет произведен поиск библиотеки С1.

Эти команды генерируют файл 1 inklks ingle foo. so. Для того чтобы его исполь­зовать, нужно скопировать его в /lib.

Следующее главное приложение вызывает собранную нами библиотеку:

lkpmem.c

#include < fcntl.h> int globalvarl; int globalvar2 = 3; void mylocalfoo() {

int functionvar;

printf(" variable functionvar \t location: Ox%x\nH/ fcfunctionvar); }

int mainO {

void *localvarl = (void *)malloc(2048)

printf(" variable globalvarl \t location: Ox%x\n", & globalvarl);

printf(" variable globalvar2 \t location: Ox%x\n", & globalvar2);

printf(" variable localvarl \t location: Ox%x\n", blocalvarl);

mylibfoo();

mylocalfoof);

while(1);

return(0);

1 Библиотеки libc. Примеч. науч. ред.


Упражнения



}

Откомпилируем lkmem. с следующим образом:

#lkp> gcc -о lkpmem lkpmem.c -llkplibsinglefoo

Во время выполнения lkmem вы можете увидеть информацию о размещении в памя­ти различных переменных. Функция блокируется с помощью while (1) и не возвращает значения. Это позволит вам получить РШ процесса и получить карту памяти. Для этого нужно ввести следующую команду:

#lkp>./lkpmem

#lkp> ps aux | grep lkpmem

#lkp> cat /proc/< pid> /maps

Облачает сегмент памяти, в котором находится переменная.

Упражнения

1. Почему программы, реализуемые из одного исполнимого файла, не могут разделять сегменты памяти?

2. Как будет выглядеть стек следующей функции после трех итераций?

fоо(){ int a; foo()

}

Если она продолжится, какая может возникнуть проблема?

3. Заполните значениями описатель vm_area_s true t, соответствующий карте памя­ти, приведенной на рис. 4.11.

4. Как связаны между собой страницы и секции?

5. Тридцатидвухбитовые системы Linux при загрузке не используют среднюю дирек­торию страниц. Вместо этого эффективно используется двухуровневая таблица страниц. Первые 10 бит виртуального адреса соответствуют отступу в глобальной директории страниц (PGD). Вторые 10 бит соответствуют отступу в таблице страниц (РТЕ). Оставшиеся 12 бит соответствуют отступу страницы.

Какой размер в Linux имеет страница? К скольким страницам может обратиться задача? К какому объему памяти?

6. Как связаны зоны памяти и страницы?

7. Чем на аппаратном уровне «реальные» адреса отличаются от «виртуальных»?


Глава



Ввод-Вывод

В этой главе:

? 5.1 Как работает оборудование: шины, мосты, порты и интерфе)

? 5.2 Устройства

? Резюме

? Проект: создание драйвера параллельного порта

? Упражнения



Глава 5 • Ввод-Вывод


Я

дро Linux представляет собой набор кода, который выполняется на одном или нескольких процессорах. Для остальной системы с помощью аппаратной под­держки предоставляется процессорный интерфейс. На самом нижнем, машинно-за­висимом уровне ядро общается с этими устройствами с помощью простых ассемб­лерных инструкций. Эта глава раскрывает взаимоотношения ядра с окружающим оборудованием, с акцентом на файловый ввод-вывод и аппаратные устройства. Мы продемонстрируем, как ядро Linux связывает вместе аппаратную и программную часть начиная с наивысшего уровня виртуальной системы до нижних уровней фи­зической записи битов информации.

Глава начинается с обзора ядра компьютера, процессора и подключения к ядру остальной аппаратуры. Также обсуждается концепция шин, включая то, как они свя­зывают процессор с другими элементами системы (такими, как память). Также мы представим вашему вниманию устройства и контроллеры, используемые на плат­формах х86 и PowerPC.

Имея базовое понимания компонентов системы и их связей, мы сможем присту­пить к анализу слоев программного обеспечения начиная с приложений для операци­онной системы и кончая специфическими блочными устройствами, используемыми для хранения, - жесткими дисками и их контроллерами. Несмотря на то что концеп­ция файловой системы не раскрывается до следующей главы, мы рассмотрим доста­точно для того, чтобы опуститься до уровня обобщенного блочного устройства и, что самое главное, методов связи блочных устройств, очереди запросов.

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

Переходя к аппаратуре, мы увидим, как интерфейсы обобщенного блочного драйвера связаны со специфическим блочным драйвером, что позволяет программ­ному обеспечению управлять различными аппаратными устройствами. И наконец, в нашем путешествии с уровня приложений на уровень ввода-вывода мы коснемся аппаратного ввода-вывода, необходимого для контроллера диска и продемонстриру­ем вашему вниманию другие примеры ввода-вывода и драйверов устройств из этой книги.

Затем мы обсудим другой важный тип устройств - символьные устройства и чем они отличаются от блочных и сетевых устройств. Также мы рассмотрим важ­ность других устройств - контроллера DMA, таймера и терминального устройства.


Поделиться:



Популярное:

Последнее изменение этой страницы: 2016-03-25; Просмотров: 719; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.018 с.)
Главная | Случайная страница | Обратная связь