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


Этот код представляет собой возвращение к старым процессорам Intel. В настройке менеджера памяти он выглядит немного неуместным.




arch/i386/boot/setup.S 790 # настройка gdt и idt

791 792 793 794 795 796 797

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

4Gb)

.word OxFFFF # 4Gb - (0x100000*0x1000
.word 0 # базовый адрес = 0

.word 0x9A00 # чтение-выполнение кода.word OxOOCF # гранулярность = 4096, 386

# (+5-й полубайт предела)

.word OxFFFF
# 4Gb

(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
997

998.word 0 # байт выравнивания

999 idt_48:


Архитектурно-зависимая инициализация памяти



 


 

.word
.word 0, 0
   
.word
gdt_48:  
.word gdt_end
.word 0, 0

 

# ограничение 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

 

movw $1, %ax # би
lmsw %ax # Bo
jmp flush_instr
   
flush _instr:
xorw %bx, %bx #
xorl %esi, %esi #
movw %cs, %si
subw $DELTA_INITSEG/
shll $4, %esi

Флаг для обозначения загрузки Указатель на код реального режима

%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; Просмотров: 636; Нарушение авторского права страницы


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