Главная страница
Навигация по странице:

  • Программные заголовки

  • 3. 5Исследование готовых файлов 5


    Скачать 438.97 Kb.
    Название3. 5Исследование готовых файлов 5
    Дата12.09.2018
    Размер438.97 Kb.
    Формат файлаdocx
    Имя файла1. MiniOS doc.docx
    ТипДокументы
    #50456
    страница6 из 6
    1   2   3   4   5   6

    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).

    Разделы:

    • .text — содержит исполняемые инструкции программы

    • .data — в этом разделе инициализируются глобальные и локальные переменные

    • .rodata — содержит константные значения, этот раздел «только для чтения»

    • .bss — раздел неинициализированных глобальных и локальных переменных, то есть заполненных нулями.

    • .eh_frame — информация, необходимая для frame-unwinding во время обработки исключений (облегчает отладку, можно убрать компилированием с флагом -fno-asynchronous-unwind-tables)

    • .shstrtab — содержит таблицу названий разделов

    Структура исполняемого файла описана в Таблица Структура исполняемого файла (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 имеет следующие существенные отличия:

    • GCC не интерпретирует никак содержимое ассемблерной вставки.

    • Служит явное описание интерфейса с ассемблерной вставкой.

    • Даёт компилятору возможность свободы выбора регистров.

    • Позволяет явно указать на имеющиеся побочные действия ассемблерного кода.

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

    8.5.2Общая структура вставки


    Общая структура ассемблерной вставки выглядит следующим образом:

    asm [volatile] («команды и директивы ассемблера» : выходные параметры : входные параметры : изменяемые параметры);

    впрочем, существует и более короткая форма:

    asm [volatile] («команды ассемблера»);

    8.5.3Синтаксис команд


    Особенностью ассемблера gas и компилятора gcc есть тот факт, что они используют непривычный для x86 синтаксис AT&T, который существенно отличается от синтаксиса Intel. Основные отличия:

    1. Порядок операндов: Операция Источник,Приёмник.

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

    3. Явное задание размеров операндов в суффиксах команд: b-byte, w-word, l-long, q-quadword. В командах типа movl %edx,%eax это может показаться излишним, однако является весьма наглядным средством, когда речь идёт о incl (%esi) или xorw $0x7,mask

    4. Названия констант начинаются с $ и могут быть выражением. Например movl $1,%eax

    5. Значение без префикса означает адрес. Например:
      movl $123,%eax — записать в %eax число 123,
      movl 123,%eax — записать в %eax содержимое ячейки памяти с адресом 123,
      movl var,%eax — записать в %eax значение переменной var,
      movl $var,%eax — загрузить адрес переменной var

    6. Для косвенной адресации необходимо использовать круглые скобки. Например movl (%ebx),%eax — загрузить в %eax значение переменной, по адресу находящемуся в регистре %ebx

    7. SIB-адресация: смещение(база, индекс, множитель)

    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Карта расположения загрузчика в памяти


    • 0 to 4K-1
      BIOS and real mode interrupts

    • 0x07BE to 0x07FF
      Partition table passed to another boot loader

    • down from 8K-1
      Real mode stack

    • 0x2000 to ?
      The optional Stage 1.5 is loaded here

    • 0x2000 to 0x7FFF
      Command-line buffer for Multiboot kernels and modules

    • 0x7C00 to 0x7DFF
      Stage 1 is loaded here by BIOS or another boot loader

    • 0x7F00 to 0x7F42
      LBA drive parameters

    • 0x8000 to ?
      Stage2 is loaded here

    • The end of Stage 2 to 416K-1
      Heap, in particular used for the menu

    • down from 416K-1
      Protected mode stack

    • 416K to 448K-1
      Filesystem buffer

    • 448K to 479.5K-1
      Raw device buffer

    • 479.5K to 480K-1
      512-byte scratch area

    • 480K to 512K-1
      Buffers for various functions, such as password, command-line, cut and paste, and completion.

    • The last 1K of lower memory
      Disk swapping code and data

    8.8Состояние машины при старте ОС


    Когда ЗАГРУЗЧИК передает управление 32-битной операционной системе, машина ДОЛЖНА находиться в следующем состоянии:

    • %eax
      Должен содержать число '0x2BADB002'; наличие этого значения сигнализирует о том, что управление было передано от совместимого мультизагрузчика (в отличие от других загрузчиков, которые также могут использоваться).

    • %ebx
      Должен содержать 32-битный физический адрес специальной структуры (Таблица Multiboot information structure), подготовленной загрузчиком.

    • %cs
      Должен указывать на сегмент кода с соответствующими правами доступа к памяти. Значение может лежать в пределах от '0' до '0xFFFFFFFF'.

    • %ds,%es,%fs,%gs,%ss
      Должны указывать на сегменты данных с соответствующими правами доступа к памяти. Значение может лежать в пределах от '0' до '0xFFFFFFFF'.

    • 'A20 gate'
      Должна быть включена.

    • %cr0
      31 бит (PG) должен быть сброшен. 0 бит (PE) должен быть установлен. Значение остальных битов не определено.

    • %eflags
      17 бит (VM) должен быть сброшен. 9 бит (IF) должен быть сброшен. Значение остальных битов не определено.

    Значения всех остальных регистров и флагов процессора не определены. Это, в частности, относится к:

    • %esp
      ОС ДОЛЖНА создать свой собственный стек сразу после получения управления.

    • 'GDTR'
      Хотя сегментные регистры установлены, регистр таблицы глобальных дескрипторов может содержать недействительное значение, поэтому ОС НЕ ДОЛЖНА загружать какие-либо сегментные регистры (даже пытаться перегружать теми же значениями) до тех пор, пока не создаст свою собственную таблицу GDT.

    • 'IDTR'
      ОС не ДОЛЖНА разрешать аппаратные прерывания, пока не настроит свою IDT.

    Однако, загрузчику СЛЕДУЕТ оставить все регистры и флаги, не описанные выше, в том состоянии, в которое они были установлены BIOS. Другими словами, ОС должна быть в состоянии обратиться к BIOS после загрузки до тех пор, пока сама не перезапишет структуры данных BIOS. Кроме того, загрузчик ДОЛЖЕН оставить значения контроллера прерываний (PIC) теми, которые были установлены BIOS, даже если он изменил их в процессе переключения в защищенный режим.

    8.9

    9.Ссылки


    1. James Molloy, руководство по созданию ОС
      оригинал http://www.jamesmolloy.co.uk/tutorial_html/
      перевод http://rus-linux.net/MyLDP/kernel/toyos/sozdaem-unix-like-os.html

    2. Статьи по разработке и устройству ОС
      http://www.iakovlev.org/

    3. Документация по компилятору Nasm
      http://biguniverse.narod.ru/nasm.pdf


    1   2   3   4   5   6


    написать администратору сайта