3. 5Исследование готовых файлов 5
Скачать 438.97 Kb.
|
7.Результаты исследований 7.1Исполняемый файл ОС Структура файла: У исполняемого файла, как результата нашей компиляции, есть два представления: он содержит program header (программный заголовок), описывающий сегменты, которые содержат информацию, используемую во время выполнения, и section header (заголовок разделов), описывающий разделы, которые содержат информацию для линковки и перемещения. Мы можем получить информацию о сегментах или разделах с помощью команд readelf -l или readelf -S соответственно. Заголовок ELF: Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00 Класс: ELF32 Данные: дополнение до 2, little endian Версия: 1 (current) OS/ABI: UNIX - System V Версия ABI: 0 Тип: EXEC (Исполняемый файл) Машина: Intel 80386 Версия: 0x1 Адрес точки входа: 0x100020 Начало заголовков программы: 52 (байт в файле) Начало заголовков разделов: 35116 (байт в файле) Флаги: 0x0 Размер этого заголовка: 52 (байт) Размер каждого заголовка программы: 32 (байт) Число заголовков программы: 2 Размер каждого заголовка раздела: 40 (байт) Число заголовков разделов: 7 Индекс записи в таблице разделов, указывающий на таблицу названий разделов: 6 Программные заголовки (в каждом описывается один сегмент) Заголовки разделов Все разделы находятся в первом сегменте (тип LOAD). Разделы:
Структура исполняемого файла описана в Таблица Структура исполняемого файла (MiniOS.bin), которая была получена в результате исследования файла в hex-редакторе. 8.Приложения8.1Архитектура компьютера8.2Режимы работы процессора8.2.1Реальный режим (Real Mode)Все инструкции 16-битные Адресация памяти — сегментная: 16-битный номер сегмента и 16-битное смещение внутри этого сегмента Размер каждого сегмента 64Кб Всего доступно 1Мб памяти В реальном режиме преобразование адреса происходит в соответствии со следующей формулой: physical address = 16 * segment + offset. Например для адреса 0xf000:fff0 преобразование выглядит так: 16 * 0xf000 + 0xfff0 = 0xf0000 + 0xfff0 = 0xffff0 8.2.2Защищенный режим (Protected Mode)Основной режим работы процессора Инструкции 32-битные Виртуальное адресное пространство Многозадачность Защита (изолирование задач, контроль доступа к памяти) 8.3АссемблерДля файлов с расширением “.s” (содержат код на ассемблере), используется компилятор ассемблерного кода Nasm. Документация по Nasm http://www.codenet.ru/progr/asm/nasm/ В NASM используется Intel-синтаксис записи инструкций. Предложение языка ассемблера NASM (строка программы) может состоять из следующих элементов: Метка Инструкция Операнды Комментарий Операнды отделяются между собой запятой. Перед строкой и после инструкции можно использовать любое количество пробельных символов. Комментарий начинается с точки с запятой, а концом комментария считается конец строки. В качестве инструкции может использоваться команда или псевдокоманда (директива компилятора). Если строка очень длинная, то её можно перенести на следующую, используя обратный слеш \, подобно тому, как это делается в языке Си. 8.3.1Команды работы с флагамиФлаг прерывания IF Этот флаг определяет, разрешены в данный момент прерывания или нет (о прерываниях тоже будет отдельная статья). Команда CLI сбрасывает флаг IF (запрещает прерывания). Команд STI устанавливает флаг IF в единицу (разрешает прерывания). 8.3.2Дерективы Nasm• Директива BITS указывает, код какой разрядности должен генерировать NASM: для процессора, работающего в 16-битном режиме, или для процессора в 32-битном режиме. Соответствующим синтаксисом будет BITS 16 или BITS 32. Наиболее вероятным использование директивы BITS представляется при написании 32-битного плоского бинарного файла. (Выходной формат bin по умолчанию предназначен для 16-битного режима, т.к. он наиболее часто используется для написания DOS.COM программ, DOS.SYS драйверов устройств, а также загрузчиков). • Директива SECTION (SEGMENT это абсолютно эквивалентный синоним) указывает, в какую секцию выходного файла будет ассемблирован код, который вы пишете. В некоторых объектных форматах количество и имена секций фиксированы; в других пользователь может сделать их столько, сколько захочет. Поэтому если вы захотите переключиться на секцию, которая в данный момент не существует, директива SECTION может либо вызвать сообщение об ошибке, либо создать новую секцию. Объектные форматы Unix и bin поддерживают стандартизованные имена секций: .text для кода, .data для данных и .bss для неинициализированных данных. Формат obj наоборот, не признает эти имена секций специальными и более того, удаляет ведущую точку в имени любой секции. • EXTERN: импорт символов из других модулей Директива EXTERN подобна директиве MASM EXTERN и ключевому слову extern в С: она используется для объявления символа, который определен в некотором другом модуле. • GLOBAL: Экспорт символов в другие модули Директива GLOBAL это обратная сторона EXTERN: если один модуль объявляет символ как EXTERN и ссылается на него, то для предотвращения ошибок компоновщика необходимо, чтобы некоторый другой модуль определил этот символ и объявил его как GLOBAL. 8.4Взаимодействие кода на ассемблере и кода на СиСоглашения, используемые для организации вызова. В GCC для архитектуры x86 при организации вызова используется следующее соглашение __cdecl: •Все параметры в функцию передаются через стек •Параметры, перемещаемые в стек, перечисляются справа налево. •Значение, возвращаемое функцией, помещается в EAX. Так что вызов функции d = func(a, b, c); будет выглядеть следующим образом push [c] push [b] push [a] call func mov [d], eax 8.5Ассемблерные вставки в код на СиGCC Inline Assembly — Встроенный ассемблер компилятора GCC, представляющий собой язык макроописания интерфейса компилируемого высокоуровнего кода с ассемблерной вставкой. 8.5.1ОсобенностиСинтаксис и семантика GCC Inline Assembly имеет следующие существенные отличия:
8.5.2Общая структура вставкиОбщая структура ассемблерной вставки выглядит следующим образом: asm [volatile] («команды и директивы ассемблера» : выходные параметры : входные параметры : изменяемые параметры); впрочем, существует и более короткая форма: asm [volatile] («команды ассемблера»); 8.5.3Синтаксис командОсобенностью ассемблера gas и компилятора gcc есть тот факт, что они используют непривычный для x86 синтаксис AT&T, который существенно отличается от синтаксиса Intel. Основные отличия:
8.5.4Ключевое слово volatileКомпилятор в результате оптимизации кода удаляет ассемблерные вставки, которые не изменяют значения переменных. Чтобы компилятор не удалил вставку, используется ключевое слово volatile. 8.5.5Пример вставкиasm volatile(" \ cli; \ mov %0, %%ecx; \ mov %1, %%esp; \ mov %2, %%ebp; \ mov %3, %%cr3; \ mov $0x12345, %%eax; \ sti; \ jmp *%%ecx " : : "r"(eip), "r"(esp), "r"(ebp), "r"(current_directory->physicalAddr)); 8.6Процесс работы загрузчикаBIOS Загружает в память по адресу 0x7c00 первый сектор устройства(MBR, размер 512 байт) и передает ему управление. BIOS и загрузчик ОС работают в реальном режиме. GRUB stage 1 Находится в MBR (в первом секторе). Используется только чтобы загрузить следующую часть и передать ей управление. При этом, размещение этих файлов кодируется в терминах цилиндр/головка/сектор, и значит на этом этапе еще не требуется распознавание типа файловой системы. GRUB stage 1.5 Включает в себя драйвер файловой системы (в нашем случае используется fat_stage1_5). Производит монтирование файловой системы активного раздела. Находит файлы следующей части загрузчика, загружает в память по адресу 0x8000 и передает им управление. Эта часть нужна, чтобы GRUB stage 2 был доступен в виде обычных файлов в файловой системе (для упрощения доступа к нему). GRUB stage 2 Получает информацию о машине от BIOS, читает конфигурационный файл. Выводит окно выбора загружаемой ОС. Производит загрузку ядра ОС в память, переводит процессор в защищенный режим и передает управление ядру ОС (состояние машины при старте ОС). 8.7Карта расположения загрузчика в памяти
8.8Состояние машины при старте ОСКогда ЗАГРУЗЧИК передает управление 32-битной операционной системе, машина ДОЛЖНА находиться в следующем состоянии:
Значения всех остальных регистров и флагов процессора не определены. Это, в частности, относится к:
Однако, загрузчику СЛЕДУЕТ оставить все регистры и флаги, не описанные выше, в том состоянии, в которое они были установлены BIOS. Другими словами, ОС должна быть в состоянии обратиться к BIOS после загрузки до тех пор, пока сама не перезапишет структуры данных BIOS. Кроме того, загрузчик ДОЛЖЕН оставить значения контроллера прерываний (PIC) теми, которые были установлены BIOS, даже если он изменил их в процессе переключения в защищенный режим. 8.99.Ссылки
|