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


Управление памятью на х86-аппаратуре



При включении все процессоры Intel работают в реальном режиме адресации. Реальная адресация - это режим, совместимый с ранними Intel процессорами. По мере усложнения процессоров наследуемый код всегда использовался в новых процессорах для совмести­мости. В реальном режиме адресации процессор может выполнять программы, написан­ные для 8086 и 8088 с использованием тех же самых инструкций и, что гораздо важнее, с помощью того же метода адресации или преобразования адресов (address transla­tion). В результате преобразования адресов процессор получает доступ к системной па­мяти. Ранние процессоры 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.
314

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:

# проверка установлен ли # %ebx в EOF

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

598 599 600 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 625 626 627 628

jz do_move0 #.. когда у нас есть нижний

# загруженный zImage

#.. или в противном случае верхний загруженный bzlmage jmp end_move #... и продолжаем перемещение

do_move0: movw $0x100,

%ах
movw subw movw eld do_move: movw incb movw addw subw subw movw rep movsw empw

# начало сегмента назначения %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

# команда записи

movb outb call movb outb call

$0xDl, %al %al, $0x64 empty_8042

# A20 включена

$0xDF, %al %al, $0x60 empty_8042


Строки 723-739


Поделиться:



Популярное:

Последнее изменение этой страницы: 2016-03-25; Просмотров: 655; Нарушение авторского права страницы


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