При вызове пользовательского прерывания в защищённом режиме сразу вылетает исключение GP пишу на fasme не могу понять в чём глюк обработчики исключений прекрасно работают, а пользовательского прерывания нет пишу int 0x30 и сразу в GP дескриптор пользовательского прерывания загружен как надо проверено
уже неделю парю и немогу понять в чём дело всю документацию по intel на анг перерыл и причину найти не могу
DimoK, судя по всему, ты тоже пишешь ОСь (мог бы обрисовать ситуацию подробнее). Возможные проблемы: - неправильный дескриптор, возможно, неправильный DPL (покажи дескриптор и содержимое GDT); - не загружен TR; - ошибка в TSS (покажи его); - и вообще что угодно (покажи весь код целиком). P. S. Посмотри код ошибки #GP.
DPL=CPL=0 До многозадачности ещё не дошёл поэтому TSS нету и соответственно TR не загружен А всё остальное есть. Делал всё по документации Intel для Pentium 4 вот исходники файлик 1 Код (Text): ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Работа в реальном режиме ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;Сегмент стека use16 Stack_RM: times 0x100 : db 0 label Stack_RM_Top at $-1 ;Конец сегмента стека Stack_RM ;Сегмент данных use16 Data_RM: ;P,DPL,S и тип сегмента code equ 00001000b ;сегмент кода data equ 00000000b ;сегмент данных d_e_c_c equ 00000100b ; d_w_c_r equ 00000010b ;данные запись, код чтение access equ 00000001b ;доступен p equ 10000000b ; s equ 00010000b ; ;Атрибуты gdt_atr equ data or d_w_c_r or p or s ; 10010010b cs_atr equ code or d_w_c_r or p or s ; 10011010b ds_atr equ data or d_w_c_r or p or s ; 10010010b video_atr equ data or d_w_c_r or p or s ; 10010010b ss_atr equ data or d_w_c_r or d_e_c_c or p or s ; 10010110b idt_atr equ data or d_w_c_r or p or s ; 10010010b trap_atr equ 10001111b interrupt_atr equ 10001110b include 'RUS.inc' Data_RM_size=$-Data_RM ;размер сегмента данных ;Конец сегмента данных Data_RM ;Сегмент кода use16 Code_RM: ;Определение сегмента стека mov ax,Stack_RM mov ss,ax mov sp,Stack_RM_Top ;Определение сегмента данных push cs pop ds ;Очищаем экран: mov ax,3 int 0x10 ;Заменяем символы в знакогенераторе на Русские mov bp,RUS1 ; RUS1 - первая часть модифицируемых символов. mov bx,0x1000 ; AH - высота символов mov cx,0x30 ; 48 символов mov dx,0x80 ; 128 - номер первого модифицируемого символа mov ax,0x1100 ; ah=11h - номер функции прерывания BIOS int 10h модификации системного шрифта push cs pop es ;es=cs ;es:bp - адрес новых символов. int 0x10 ;вызов прерывания BIOS int 10h mov bp,RUS2 ; RUS2 - первая часть модифицируемых символов. mov bx,0x1000 ; AH - высота символов mov cx,0x20 ; 32 символа mov dx,0xe0 ; 224 - номер первого модифицируемого символа mov ax,0x1100 ; ah=11h - номер функции прерывания BIOS int 10h модификации системного шрифта push cs pop es ;es=cs ;es:bp - адрес новых символов. int 0x10 ;вызов прерывания BIOS int 10h ;Открываем линию А20 для 32-х битной адресации in al,0x92 or al,2 out 0x92,al ;Заполняем таблицу глобальных дескрипторов load_descr_gdt gdt_gdt, gdt+0x8200, gdt_size-1, 01000000b,gdt_atr load_descr_gdt gdt_cs, Code_PM+0x8200, Code_PM_size-1, 01000000b,cs_atr load_descr_gdt gdt_ds, Data_PM+0x8200, Data_PM_size-1, 01000000b,ds_atr load_descr_gdt gdt_es, 0x0b8000, 0x0ffff, 01000000b,video_atr load_descr_gdt gdt_ss, Stack_PM+0x8200, Stack_PM_size-1, 01000000b,ss_atr load_descr_gdt gdt_idt, idt+0x8200, idt_size-1, 01000000b,idt_atr load_descr_gdt gdt_exc, Exception+0x8200,Exception_size-1, 01000000b,cs_atr load_descr_gdt gdt_int, Interrupt+0x8200,Interrupt_size-1, 01000000b,cs_atr ;Загружаем gdtr xor eax,eax mov ax,cs shl eax,4 add eax,gdt mov [gdtr_base],eax lgdt [cs:gdtr] ;Запрещаем маскируемые прерывания cli ;Запрещаем немаскируемые прерывания in al,0x70 or al,0x80 out 0x70,al ;Устанавливаем для IRQ0-IRQ7 номера прерываний 20h-27h mov dx,0x20 ;master mov ah,0x20 call set_int_controller ;Устанавливаем для IRQ8-IRQ15 номера прерываний 28h-2Fh mov dx,0x0a0 ;slave mov ah,0x28 call set_int_controller ;Заполняем таблицу прерываний load_descr_idt exc00, exc_00-Exception, gdt_exc-gdt, trap_atr load_descr_idt exc01, exc_01-Exception, gdt_exc-gdt, trap_atr load_descr_idt exc02, exc_02-Exception, gdt_exc-gdt, trap_atr load_descr_idt exc03, exc_03-Exception, gdt_exc-gdt, trap_atr load_descr_idt exc04, exc_04-Exception, gdt_exc-gdt, trap_atr load_descr_idt exc05, exc_05-Exception, gdt_exc-gdt, trap_atr load_descr_idt exc06, exc_06-Exception, gdt_exc-gdt, trap_atr load_descr_idt exc07, exc_07-Exception, gdt_exc-gdt, trap_atr load_descr_idt exc08, exc_08-Exception, gdt_exc-gdt, trap_atr load_descr_idt exc09, exc_09-Exception, gdt_exc-gdt, trap_atr load_descr_idt exc0a, exc_0a-Exception, gdt_exc-gdt, trap_atr load_descr_idt exc0b, exc_0b-Exception, gdt_exc-gdt, trap_atr load_descr_idt exc0c, exc_0c-Exception, gdt_exc-gdt, trap_atr load_descr_idt exc0d, exc_0d-Exception, gdt_exc-gdt, trap_atr load_descr_idt exc0e, exc_0e-Exception, gdt_exc-gdt, trap_atr load_descr_idt exc0f, exc_0f-Exception, gdt_exc-gdt, trap_atr load_descr_idt exc10, exc_10-Exception, gdt_exc-gdt, trap_atr load_descr_idt exc11, exc_11-Exception, gdt_exc-gdt, trap_atr load_descr_idt exc12, exc_12-Exception, gdt_exc-gdt, trap_atr load_descr_idt exc13, exc_13-Exception, gdt_exc-gdt, trap_atr load_descr_idt exc14, exc_14-Exception, gdt_exc-gdt, trap_atr load_descr_idt exc15, exc_15-Exception, gdt_exc-gdt, trap_atr load_descr_idt exc16, exc_16-Exception, gdt_exc-gdt, trap_atr load_descr_idt exc17, exc_17-Exception, gdt_exc-gdt, trap_atr load_descr_idt exc18, exc_18-Exception, gdt_exc-gdt, trap_atr load_descr_idt exc19, exc_19-Exception, gdt_exc-gdt, trap_atr load_descr_idt exc1a, exc_1a-Exception, gdt_exc-gdt, trap_atr load_descr_idt exc1b, exc_1b-Exception, gdt_exc-gdt, trap_atr load_descr_idt exc1c, exc_1c-Exception, gdt_exc-gdt, trap_atr load_descr_idt exc1d, exc_1d-Exception, gdt_exc-gdt, trap_atr load_descr_idt exc1e, exc_1e-Exception, gdt_exc-gdt, trap_atr load_descr_idt exc1f, exc_1f-Exception, gdt_exc-gdt, trap_atr load_descr_idt timer, int_timer-Interrupt, gdt_int-gdt, interrupt_atr load_descr_idt keyboard, int_keyboard-Interrupt, gdt_int-gdt, interrupt_atr load_descr_idt dummy_iret0, dummy_iret_0-Interrupt, gdt_int-gdt, interrupt_atr load_descr_idt dummy_iret1, dummy_iret_0-Interrupt, gdt_int-gdt, interrupt_atr load_descr_idt dummy_iret2, dummy_iret_0-Interrupt, gdt_int-gdt, interrupt_atr load_descr_idt dummy_iret3, dummy_iret_0-Interrupt, gdt_int-gdt, interrupt_atr load_descr_idt dummy_iret4, dummy_iret_0-Interrupt, gdt_int-gdt, interrupt_atr load_descr_idt dummy_iret5, dummy_iret_0-Interrupt, gdt_int-gdt, interrupt_atr load_descr_idt dummy_iret6, dummy_iret_0-Interrupt, gdt_int-gdt, interrupt_atr load_descr_idt dummy_iret7, dummy_iret_1-Interrupt, gdt_int-gdt, interrupt_atr load_descr_idt dummy_iret8, dummy_iret_1-Interrupt, gdt_int-gdt, interrupt_atr load_descr_idt dummy_iret9, dummy_iret_1-Interrupt, gdt_int-gdt, interrupt_atr load_descr_idt dummy_ireta, dummy_iret_1-Interrupt, gdt_int-gdt, interrupt_atr load_descr_idt dummy_iretb, dummy_iret_1-Interrupt, gdt_int-gdt, interrupt_atr load_descr_idt dummy_iretc, dummy_iret_1-Interrupt, gdt_int-gdt, interrupt_atr load_descr_idt dummy_iretd, dummy_iret_1-Interrupt, gdt_int-gdt, interrupt_atr load_descr_idt int30h, int_30h-Interrupt, gdt_int-gdt, interrupt_atr ;Загружаем idtr xor eax,eax mov ax,cs shl eax,4 add eax,idt mov [idtr_base],eax lidt [cs:idtr] ;Переключаемся в защищённый режим mov eax,cr0 or eax,1 mov cr0,eax ;Загружаем селектор в регистр CS,DS,ES,SS mov ax,gdt_ds-gdt mov ds,ax mov ax,gdt_es-gdt mov es,ax mov ax,gdt_ss-gdt mov ss,ax mov esp,Stack_PM_Top db 0x66 db 0x0ea dd 0 dw gdt_cs-gdt ;Процедура перепрограммирует контроллер прерываний ; На входе: DX - порт контроллера прерыванght ; AH - начальный номер прерывания set_int_controller: mov al,11 out dx,al call pic_delay mov al,ah inc dx out dx,al call pic_delay mov al,4 out dx,al call pic_delay mov al,1 out dx,al call pic_delay mov al,0x0ff out dx,al dec dx ret pic_delay: jmp pd pd: ret ;Конец сегмента кода Code_RM файлик 2 Код (Text): use32 Align 4 ;Структура описывает дескриптор GDT struc descr_gdt { .limit dw 0 .base1 dw 0 .base2 db 0 .atr db 0 .lim_atr db 0 .base3 db 0 } Align 4 ;Таблица глобальных дескрипторов gdt: gdt_0 descr_gdt ;смещение 0x00 gdt_gdt descr_gdt ;смещение 0x08 gdt_idt descr_gdt ;смещение 0x10 gdt_cs descr_gdt ;смещение 0x18 gdt_ds descr_gdt ;смещение 0x20 gdt_es descr_gdt ;смещение 0x28 gdt_ss descr_gdt ;смещение 0x30 gdt_exc descr_gdt ;смещение 0x38 gdt_int descr_gdt ;смещение 0x40 ;Размер таблицы GDT gdt_size=$-gdt ;Структура для описания псевдо дескриптора gdtr label gdtr fword dw gdt_size-1 gdtr_base: dd 0 ;Макрос заполняет дескрипторы сегментов macro load_descr_gdt des,base_adr,limit,g_d_avl,type { ;Переопределяем указатели des.limit equ des des.base1 equ des+2 des.base2 equ des+4 des.atr equ des+5 des.lim_atr equ des+6 des.base3 equ des+7 ;Заполняем базу xor eax,eax mov eax,base_adr mov [des.base1],ax shr eax,16 mov [des.base2],al mov [des.base3],ah ;Заполняем лимит и флаги G,D,AVL xor eax,eax mov eax,limit mov [des.limit],ax shr eax,16 or al,g_d_avl mov [des.lim_atr],al ;Заполняем флаги P,DPL,S и тип сегмента xor eax,eax or al,type mov [des.atr],al } ;Структура описывает дескриптор IDT struc descr_idt { .offset1 dw 0 .selector dw 0 .no_use db 0 .type_atr db 0 .offset2 dw 0 } ;Таблица дескрипторов прерываний idt: ;Вентили исключений exc00 descr_idt exc01 descr_idt exc02 descr_idt exc03 descr_idt exc04 descr_idt exc05 descr_idt exc06 descr_idt exc07 descr_idt exc08 descr_idt exc09 descr_idt exc0a descr_idt exc0b descr_idt exc0c descr_idt exc0d descr_idt exc0e descr_idt exc0f descr_idt exc10 descr_idt exc11 descr_idt exc12 descr_idt exc13 descr_idt exc14 descr_idt exc15 descr_idt exc16 descr_idt exc17 descr_idt exc18 descr_idt exc19 descr_idt exc1a descr_idt exc1b descr_idt exc1c descr_idt exc1d descr_idt exc1e descr_idt exc1f descr_idt ;Вентили аппаратных прерываний timer descr_idt ;int 20h-irq0 keyboard descr_idt ;int 21h-irq1 dummy_iret0 descr_idt ;int 22h-irq2 dummy_iret1 descr_idt ;int 23h-irq3 dummy_iret2 descr_idt ;int 24h-irq4 dummy_iret3 descr_idt ;int 25h-irq5 dummy_iret4 descr_idt ;int 26h-irq6 dummy_iret5 descr_idt ;int 27h-irq7 dummy_iret6 descr_idt ;int 28h-irq8 dummy_iret7 descr_idt ;int 29h-irq9 dummy_iret8 descr_idt ;int 2ah-irq10 dummy_iret9 descr_idt ;int 2bh-irq11 dummy_ireta descr_idt ;int 2ch-irq12 dummy_iretb descr_idt ;int 2dh-irq13 dummy_iretc descr_idt ;int 2eh-irq14 dummy_iretd descr_idt ;int 2fh-irq15 ;Вентиль прерывания int30h descr_idt idt_size=$-idt label idtr fword dw idt_size-1 idtr_base: dd 0 ;Макрос заполняет дескрипторы прерываний macro load_descr_idt des,offset,selector,type_atr { ;Переопределяем указатели des.offset1 equ des des.selector equ des+2 des.type_atr equ des+5 des.offset2 equ des+6 ;Заполняем смещение xor eax,eax mov eax,offset mov [des.offset1],ax shr eax,16 mov [des.offset2],ax ;Заполняем селектор xor eax,eax mov eax,selector mov [des.selector],eax ;Устанавливаем атрибуты и тип вентиля xor eax,eax mov eax,type_atr mov [des.type_atr],eax } обработчики писать не буду там ничего особенного
Мда. Душераздирающее зрелище. Рано тебе еще ОСь писать. Разбирайся со своим кодом сам. Советую прикрутить к обработчикам исключений дампер регистров (и кода ошибки). P. S. Код лучше выкладывать в аттаче.
Щас с многозадачностью разберусь и всё пучком будет Мне надо то написать ось в которой хотя бы была консоль и работало одновременно пару простеньких программ типа Hello World
Советую прикрутить к обработчикам исключений дампер регистров (и кода ошибки). Ага, самое главное - cs:eip и байтов 8 по ним. Чтобы понять, где возникает проблема. И весь код, в том числе и вызов int 30h, обработчики.