Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология Образование Политология Производство Психология Стандартизация Технологии |
Управление памятью на х86-аппаратуре
При включении все процессоры Intel работают в реальном режиме адресации. Реальная адресация - это режим, совместимый с ранними Intel процессорами. По мере усложнения процессоров наследуемый код всегда использовался в новых процессорах для совместимости. В реальном режиме адресации процессор может выполнять программы, написанные для 8086 и 8088 с использованием тех же самых инструкций и, что гораздо важнее, с помощью того же метода адресации или преобразования адресов (address translation). В результате преобразования адресов процессор получает доступ к системной памяти. Ранние процессоры Intel имели 20-битовую адресную шину, через которую они могли адресовать до 64 Кб памяти. Это ограничение накладывалось и на код ранних систем. В реальном режиме адресации линейные адреса равны физическим адресам. По мере нашего продвижения по коду инициализации менеджера памяти мы увидим и другие особенности последних процессоров, используемые в аппаратных и более комплексных структурах вдобавок к программным. *■ Регистр адресов инструкций. Примеч. пер. 2 Регистр сохранения-восстановления. Примеч. пер. Архитектурно-зависимая инициализация памяти Код в setup. S выполняет несколько важных функций, связанных с инициализацией памяти. arch/i386/boot/setup.S 3 07 #define SMAP 0x534d4150 3 09 meme820: 310 xorl %ebx, %ebx # последовательный счетчик 311 movw $E820MAP, %di # указатель в списке записи 312 # так что мы можем иметь прямую запись в bios. 315 jmpe820: 316 movl $0x0000e820, %eax # е820, верхнее слово обнулено 317 movl $SMAP, %edx # ascii 'SMAP' 318 movl $20, %ecx # размер e820rec 319 pushw %ds # запись данных. 320 popw %es 321 int $0x15 # вызов 322 jc bail820 # сброс e801, если произошла неудача 323
324 cmpl $SMAP, %eax # проверка, возврата из NSMAP' 325 jne bail820 # сброс в е801 если произошла неудача 326 333 good820: 334 movb (E820NR), %al # до 32 элементов 335 cmpb $E820MAX/ %al 336 jnl bail820 337 338 incb (E820NR) 33 9 movw %di, %ax 340 addw $20, %ax 341 movw %ax, %di 342 again820:
343 cmpl $0, %ebx 344 jne jmpe820 345 bail820: Строки 307-345 Если посмотреть на этот блок кода, мы сначала увидим (в строке 321) вызов функции BIOS intl5h с ах= 0хе82 0. Она возвращает адрес и длину различных типов памяти, распознанных BIOS. Эта простая карта памяти представляет простой пул, из которого выбираются все страницы памяти в Linux. Как видно из рассмотренного Глава 8 • Загрузка ядра ранее кода, карту памяти можно получить тремя способами: 0хе820, 0x801 и 0x88. Все эти три метода совместимы с существующими BIOS и соответствующими платформами. arch/i386/boot/setup.S 595 # Теперь мы переносим систему в ее рабочее место, но проверяем # наличие большого ядра. В этом случае мы не должны его перемещать.. 597 testb $LOADED_HIGH/ %cs: loadflags
jz do_move0 #.. когда у нас есть нижний # загруженный zImage #.. или в противном случае верхний загруженный bzlmage jmp end_move #... и продолжаем перемещение do_move0: movw $0x100,
# начало сегмента назначения %cs, %bp # как SETUPSEG $DELTA_INITSEG/ %bp # как INITSEG %cs: start_sys_seg, %bx # начало сегмента источника %ax, %es # сегмент назначения %ah # вместо add ax, #0x100 %bx, %ds # сегмент-источник $0x100, %bx %di, %di %si, %si $0x800, %cx %bp, %bx # представим start_sys_seg > 0x200, # поэтому мы, возможно, читаем на одну строку больше # чем нужно, но никогда не перезаписываем INITSEG, так как # назначение - это минимум одна страница ниже источника j b do_move end_move: Строки 595-628 Этот код представляет собой образ ядра, созданный build, с и загруженный LILO. Он выполняется для сектора init (по адресу 0x9000), сектора setup (по адресу 0x9200) и сжатого образа. Образ изначально загружается по адресу 0x10000. Если он LARGE (> 0x7FF), он остается на месте; в противном случае перемещается в 0x1000. Архитектурно-зависимая инициализация памяти
arch/ i386/boot/setup.S # Попытка включения А20 через контроллер клавиатуры #endif /* CONFIG_X86_VOYAGER */ a20_kbc: call empty_8042 #ifndef CONFIG_X86_VOYAGER call a2 0_test # Только в случае работы BIOS jnz a20_done # но с отложенной реакцией. #endif # команда записи
$0xDl, %al %al, $0x64 empty_8042
$0xDF, %al %al, $0x60 empty_8042 Строки 723-739 Популярное:
|
Последнее изменение этой страницы: 2016-03-25; Просмотров: 685; Нарушение авторского права страницы