ситуация такая: страничная организация я загружаю код планировщика в память и хочу его прицепить к прерыванию таймера код действительно загружается в память, т. к. проверял делая jmp в него цеплять к прерыванию старался так: по нулевому физическому адресу + 8*4(1Ch*4) ставил указатель на расположение в памяти кода планировщика(ставил, как логический адрес, так и физический) заматил, что General Protection вылазит при включении прерываний, в инструкции (sti) я тогда решил проинициализировать все векторы прерываний, сделал, что бы они ссылались на процедуру с единственной командой(iret) но #GP появлялся снова и снова... может, в PM по другому устанавливаются обработчики ?
Ну может и есть. Более того при идентичном отображении там скорее всего находится таблица векторов прерываний. Вот только проблема в том, что в РМ вместо нее должна использоваться таблица дескрипторов прерываний. Автору топика не мешало бы подучить мат. часть. Вообще странно, как можно использовать "страничную организацию" и ничего не знать про организацию обработки прерываний в РМ.
хорошо с этим всё понятно... А вот при страничной адресации, в таблицу дескрипторов какой адрес нужно загружать: физический или логический ? У меня практики работы с этим дескриптором нету, так что простите за тупой вопрос всё ли я правильно сделал(код ниже) ? возникает #GP при прерываниее на int 0 проверил это поставив jmp $ до него дело не дошло... Code (Text): mov eax, 0x3007 mov [0x00101000 + 3*4], eax ; планировщик lidt fword [IDTR] int 0 sti ... IDT: dw 0x100C, 8, 1000111000000000b, 0x0010 ; int 0 => лин. адрес: 0x0010100C ...
Hell_Knight Виртуальный, какойже есчо. Вначале матчасть изучают, потом тока пишут ось или тп., совсем обнаглели.
обновил пост выше... З.Ы. читал статейки от Broken Sword'a (про защищенный режим) еще книжку Таненбаума и бегло пролистал про прерывания))) моё упущение...
Во я НУП!!!! Ну конечно же!!!!! Какой 0x0010100C ???? Когда нужно заливать туда 0x3000(кталог №0, страница №3 смещение 0) !!!! З.Ы. пока сюда не отпостил, так и не обратил как-то внимание на это)))) весь день над этим дескриптором сижу... всё никак не привыкну к страничной организации
ну об этом тоже захватил краем глаза... =) я решил сделать выбор на 8h (IRQ 0) я использую страницы по 4кб та у которой адрес: 31..22 смещение в каталоге 21..12 смещение в таблице страниц 11..0 смещение
В РМ лучше сместить обработчики прерываний с номера 8 на минимум номер 32. Это обычная 32-разрядная страничная адресация. В ней только один каталог страниц. То что находится на уровень ниже в терминологии Интел называется таблицами страниц.
хм... странно, не с того не с сего снова стало возникать #GP после инструкции sti... с чего бы это ? я даже вынес IDT для удобства в отдельную страницу так удобнее контролировать его... я структуру IDT не трогал, может опять дело с TLB ? но тогда каким образом можно поправить ситуацию ?
вот планировщик, задаётся: Code (Text): mov eax, 0x3107 ; G глобальная страница + стандартные параметры mov [0x00101000 + 3*4], eax ; планировщик (0x3000) вот IDT где хранится: Code (Text): mov eax, 0x9107 ; IDT (G глобальная страница + стандартные параметры) mov [0x00101000 + 9*4], eax ; 0x9000 вот IDT инициализирую и загружаю 8-ой обработчик Code (Text): ; загрузка IDTR mov edi, 0x9000 ; страница №9 (указываем на начало IDT) xor eax, eax mov ecx, 100*2 rep stosd ; забиваем нулями mov edx, 8*8 mov edi, 0x9000 add edi, edx ; указываем на 8-ой элемент IDT (для INT 8) mov esi, IDT mov ecx, 8 rep movsb ; заливаем подготовленный элемент на 8-ой элемент в IDT lidt fword ptr IDTR вот собственно сам элемент, указывающий на 8-ой обработчик Code (Text): IDT: dw 0x3000, 0x0000, 1000111000000000b, 0x0000 ; указываем на 0x3000, т. е код планировщика вот кусок памяти для загрузки в IDTR Code (Text): IDT_size equ 100*8 IDTR dw IDT_size-1 dd 0x00009000 подскажите пожалуйста почему не работают прерывания ? после команды sti возникает #GP раньше работало, щас что-то перестало... может опять какая-то фигня со всякими кэшами и т. п. ?
если бы я знал как этот код получить... у меня просто VMware выкидывает ошибку, что мол останавливаю тебя и всё... никаких error code нету... у меня страничная адресация, не юзаю cs