Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология Образование Политология Производство Психология Стандартизация Технологии |
Этот код представляет собой возвращение к старым процессорам Intel. В настройке менеджера памяти он выглядит немного неуместным.
arch/i386/boot/setup.S 790 # настройка gdt и idt
lidt idt_48 # загрузка idt с 0, 0 xorl %еах, %eax # вычисление gdt_base movw %ds, %ax # (Преобразование %ds: gdt в линейный ptr) shll $4, %еах addl $gdt, %eax movl %еах, (gdt_48+2) lgdt gdt_48 # загрузка в gdt соответствующего значения 981 982 983 984 985 986 987 988 989 990 gdt: .fill GDT__ENTRY_BOOT_CS, 8, 0
.word OxFFFF # 4Gb - (0x100000*0x1000 .word 0x9A00 # чтение-выполнение кода.word OxOOCF # гранулярность = 4096, 386 # (+5-й полубайт предела)
(0x100000*0x1000 = 4Gb) Глава 8 • Загрузка ядра Формирование 20-битового физического адреса в режиме реальной адресации Intel Процессор Intel 8088 в оригинальном IBM PC имел только 20 линий адресации [0...19]. Это позволяло системе адресовать до 1 Мб плюс приблизительно 64 Кб внутренней памяти (от 0 до 0xl0_FFEF), но физически (через шину) последние 64 Кб адресуемой памяти были на самом деле первыми 64 Кб реальной памяти! Внутри процессора 20-битовый адрес формировался из 16-битового сегмента селектора и 16-битового сегмента отступа. Селектор сдвигался на 4 байта и добавлялся к отступу, расширяя его на 4 бита. Сумма этих регистров равнялась физическому адресу, видимому через шину. Например, для получения высших адресов мы загружаем в сегмент селектора (CS, DS, ES и т. д.) значение OxFFFF, а значение OxFFFF в регистр индекса (SI, DI и т. д.). Внутри процессора сегмент селектора сдвигается на 4 бита и добавляется к отступу. OxFFFF сдвигается на 4 6nTa=0x0F_FFF0 Добавляется oTCTyn+0x00_FFFF Внутренняя cyMMa=0xl0_FFEF Внешний физический aflpec=0x00_FFEF В результате физический адрес равен сегментному селектору со значением 0x0000 и отступу со значением OxFEFF (0000: FFEF). Доступ к наивысшему адресу и выше спустит нас в OxFFEF. Некоторые написанные для этого процессора программы зависят от этого 20-битового циклического поведения. Представленные процессоры Intel 286 и более поздние с более широкими шинами адресов использовали реальную адресацию для сохранения совместимости с 8088 и 8086. Режим реальной адресации не учитывал потребностей старых, зависящих от циклического 20-битового эффекта программ. Была добавлена сигнальная дорожка А20М# для имитации этой «особенности» ранних процессоров. Получение этого сигнала маскировало сигнал А20 для доступа к нижней памяти. Для включения и выключения сигнала А20 использовался логический вентиль. Оригинальный дизайн получения этого сигнала предусматривал использование дополнительного ввода-вывода от контроллера клавиатуры, управляемого портами ввода-вывода 0x60 и 0x64. Позднее был разработан «быстрый вентиль А20», использовавший порт 0x92, встроенный в материнскую плату. Так как все процессоры х86 сбрасываются в реальном режиме адресации, при загрузке имеет смысл включить режим А20 одним из двух доступных способов. 991.word 0 # базовый адрес = 0 992.word 0x9200 # чтение-запись данных 993.word OxOOCF # гранулярность = 4096, 386 994 # (+5-й полубайт предела) 995 gdt_end: 996.align 4 998.word 0 # байт выравнивания 999 idt_48: Архитектурно-зависимая инициализация памяти
# ограничение idt = 0 # основа idt = 0L # байт выравнивания - gdt - 1 # ограничение gdt # основа gdt (заполняется позже) Строки 790-797 Структуры и данные для временных GDT и ЮТ компилируются в конце setup. S. Эти таблицы реализованы в своей простейшей форме. Строки 981-1006 Эти строки являются откомпилированными значениями временного GDT, который имеет код и описатель данных, каждый из которых соответствуют 4 Гб памяти, начиная с 0x00. ГОТ инициализируется в 0x00 и заполняется позднее. На этом этапе разворачивания менеджера памяти для платформы Intel одной из важнейших фаз является переход в защищенный режим. В этой точке аппаратура начинает построение пространства виртуальных адресов для операционной системы. Защищенный режим Метод управления памятью Intel называется защищенным режимом. Защита относится к множеству независимых сегментированных адресных пространств, защищенных друг от друга. Другой половиной менеджера памяти Intel являются страницы и их преобразование. Системные программисты могут использовать различные комбинации сегментации с разделением на страницы, однако Linux использует плоскую модель, где сегментация не учитывается. В плоской модели каждый процесс может адресовать полное 32-битовое пространство (4 Гб).
arch/i386/boot/setup.S
Флаг для обозначения загрузки Указатель на код реального режима %si Глава 8 • Загрузка ядра Строки 830-831 Установка бита РЕ в слове состояния машины для входа в защищенный режим. Инструкция jmp начинает выполнение в защищенном режиме. Строки 834-839 Сохранение 32-битового указателя в защищенном режиме для распаковки и загрузки ядра позже в startup_32 (). Вспомните, что в реальном режиме адресации код выполняется с помощью 16-битовых инструкций. Текущий файл компилируется с помощью ассемблерной директивы. codel6, включающей данный режим, также известный как 16-битовый модуль в Intel Programmer's Reference. Для перехода от 16-битового модуля к 32-битовому модулю архитектура Intel (и магия ассемблера) позволяет строить 32-битовые инструкции в 16-битовом модуле. Построение и выполнение 32-битового перехода: arch/i3 8б/boot/setup.S 841 # переход к startup_32 в arch/i38б/kernel/head.S 842 # 843 # ПРИМЕЧАНИЕ. Для большой загрузки ядра в верхнюю память нужно 844 # jmpi 0x100000, _ BOOT_CS
846 # но мы еще не загрузили регистр CS, так что размер по умолчанию 847 # отступа задачи до сих пор 16-битовый. 848 # Однако при использовании префиксного операнда (Охбб) процессор 849 # корректно получит наш 48-битовый указатель. (INTeL 80386 850 # Programmer's Reference Manual, Mixing 16-bit and 32-bit code, 851 # страница 16-6) 852.byte 0x66, Oxea # prefix + jmpi-opcode 853 code32: .long 0x1000 # устанавливается в 0x100000 854 # для большого ядра 855.word __ BOOT_CS Строка 852 Эта строка строит 32-битовую инструкцию перехода. После выполнения перехода система использует временный GDT, а код выполняется в 32-битовом защищенном режиме начиная с метки startup_32 в arch/i386 /kernel/ head. s, строка 57. Защищенный режим До этого момента обсуждение подбиралось к моменту, когда система Intel становится готовой к настройке страниц. По мере нашего продвижения по коду head. S мы увидели, Популярное:
|
Последнее изменение этой страницы: 2016-03-25; Просмотров: 673; Нарушение авторского права страницы