Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология Образование Политология Производство Психология Стандартизация Технологии |
Исключение ошибки памяти на 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; Просмотров: 754; Нарушение авторского права страницы