Кто инициализирует IDT, ядро ​​или процессор?

Это из Википедии ...

Таблица дескрипторов прерываний (IDT) - это структура данных, используемая архитектурой x86 для реализации таблицы векторов прерываний. IDT используется процессором для определения правильного ответа на прерывания и исключения ... В процессоре 8086 IDT находится в фиксированной ячейке памяти от адреса 0x0000 до 0x03ff ...

Это взято с http://www.linuxjournal.com/article/4048?page=0,1

Когда вызывается start_kernel (находится в /usr/src/linux/init/main.c), он вызывает trap_init (находится в /usr/src/linux/kernel/traps.c). trap_init устанавливает IDT с помощью макроса set_trap_gate (находится в /usr/include/asm/system.h) и инициализирует таблицу дескрипторов прерывания, как показано в таблице «Offset Descriptionis».

Я очень сбит с толку, потому что эти два описания кажутся противоположными ... Первое говорит, что IDT связана с процессором и не зависит от ядра (на самом деле она даже не находится внутри ядра). Во втором говорится, что ядро ​​Linux инициализирует IDT и реализует код для ISR, а весь код для ISR находится внутри ядра.

Кроме того, когда устройство генерирует прерывание для ЦП, за выполнение процедур обработки прерывания отвечает ядро ​​или процессор? Пожалуйста, объясните мне это ... Заранее спасибо


person pflz    schedule 26.02.2011    source источник


Ответы (3)


Я предполагаю, что это ядро ​​загружает и инициализирует IDT. < strong> [Источник]

Помните, что прежде чем ядро ​​разрешит прерывания, оно должно загрузить начальный адрес таблицы IDT в регистр idtr и инициализировать все записи этой таблицы. Это действие выполняется при инициализации системы.

IDT инициализируется и используется подпрограммами BIOS, пока компьютер все еще работает в реальном режиме. Однако как только Linux вступает во владение, IDT перемещается в другую область ОЗУ и инициализируется во второй раз, поскольку Linux не использует никаких подпрограмм BIOS.

Ознакомьтесь со следующими ссылками:

person Saurabh Gokhale    schedule 26.02.2011
comment
@Vivek: Спасибо! Так что это вам помогло. ? - person Saurabh Gokhale; 26.02.2011
comment
Да, это было ... хотя, у меня есть еще одно сомнение ... что происходит, когда устройство делает IRQ. ЦП останавливает и сохраняет выполнение и ищет IDT. Как ядро ​​сообщает процессору, что IDT, который ему нужно найти, - это тот, который он загрузил, а не тот, который указан в BIOS? - person pflz; 26.02.2011
comment
Ядро сообщает ЦП, выполняя инструкцию LIDT, чтобы указать новую IDT. Ядро не знает, настроили ли IDT BIOS или ядро. Ядро просто использует таблицу, загруженную последней с LIDT. - person srking; 14.06.2011

BIOS устанавливает начальную IDT, которая используется BIOS и загрузчиками. Его также можно использовать в 16-битных операционных системах, поскольку он стандартизирует аппаратный интерфейс, такой как инструкция INT 10h, которая обрабатывает некоторый видеовыход. Когда 32- или 64-битное ядро ​​загружается, оно должно указать свою собственную IDT, чтобы переключиться в защищенный режим.

person jonbooz    schedule 01.03.2011

IDT состоит из ряда адресов функций прерывания в некоторой области памяти.

IDT по умолчанию устанавливается BIOS при загрузке системы.

Когда ядро ​​загружается, оно обычно устанавливает свое собственное.

person Nubok    schedule 26.02.2011