Доброго времени суток! Помогите пожалуйста с загрузчиком OС при тестировании кода на Oracle VM выводится строка Starting OS и возникает ошибка как мне понять что за ошибка и как ее исправить???? прошу сильно не пинать я в этом новичек... Код (Text): use16 org 7C00h ;org 100h start: jmp 0000h:entr ;теперь CS=0, IP=0x7c00 entr: ;--------------------------------------------------------- macro zPR { cli ; Запретить прерывания ; Запретить(NMI) in al,70h or al,80h out 70h,al } macro rPR {; разрешить(NMI) in al,70h and al,07Fh out 70h,al sti ; разрешить прерывания } macro A20 {; Открыть линию A20 in al,92h or al,2 out 92h,al } macro pMode { mov eax,cr0 or al,1 mov cr0,eax } macro tex t{ mov edi,0B8000h; mov esi,t int 20h } ;--------------------------------------------------------- mov al,12h int 10h push cs pop ds A20 ;Загрузить адрес и размер GDT в GDTR lgdt [gdtr] ;Загрузить адрес и размер IDT в IDTR lidt [idtr] ;----------------------------------- zPR ; Переключиться в защищённый режим pMode ; jmp 00001000bm_entry ;32-битная адресация use32 ;Точка входа в защищенный режим pm_entry: mov ax,cs mov ds,ax mov es,ax rPR ; вывод на экран tex msg ; jmp $ ret msg db 'Starting OS',0 exit2: ;обработчик int cld loo1: lodsb test al,al stosb mov al,7 stosb jnz loo1 ;jmp ex1 iretd ;IDT idt: dd 0,0 ;0 dd 0,0 ;1 dd 0,0 ;2 dd 0,0 ;3 dd 0,0 ;4 dd 0,0 ;5 dd 0,0 ;6 dd 0,0 ;8 dd 0,0 ;9 dd 0,0 ;10 dd 0,0 ;11 dd 0,0 ;12 dd 0,0 ;13 dd 0,0 ;14 dd 0,0 ;15 dd 0,0 ;16 dd 0,0 ;17 dd 0,0 ;18 dd 0,0 ;19 dd 0,0 ;20 dd 0,0 ;21 dd 0,0 ;22 dd 0,0 ;23 dd 0,0 ;24 dd 0,0 ;25 dd 0,0 ;26 dd 0,0 ;27 dd 0,0 ;28 dd 0,0 ;29 dd 0,0 ;30 dd 0,0 ;31 dw exit2, 08h, 1000111000000000b, 0;32 dw exit2, 08h, 1000111000000000b, 0 ; 33 idt_size equ $ - gdt idtr: dw idt_size - 1 dd idt ;GDT. gdt: db 8 dup (0) ; (10h) Code segment, read/execute, nonconforming dw 0FFFFh dw 0 db 0 db 10011010b db 11001111b db 0 ; (18h) Data segment, read/write, expand down dw 0FFFFh dw 0 db 0 db 10010010b db 11001111b db 0 gdt_size equ $ - gdt gdtr: dw gdt_size - 1 dd gdt ;------------------------------------------------------------------------ times 510-($-start) db 00h db 055h, 0AAh
Лог бокса: Код (Text): 00002227327e[CPU0 ] write_virtual_checks(): no write access to seg 00002227327i[CPU0 ] CPU is in protected mode (active) 00002227327i[CPU0 ] CS.d_b = 32 bit 00002227327i[CPU0 ] SS.d_b = 16 bit 00002227327i[CPU0 ] | EAX=00000053 EBX=00000000 ECX=00000000 EDX=00000000 00002227327i[CPU0 ] | ESP=0000ffd0 EBP=00000000 ESI=00007c4d EDI=000b8000 00002227327i[CPU0 ] | IOPL=0 id vip vif ac vm RF nt of df if tf sf zf af PF cf 00002227327i[CPU0 ] | SEG selector base limit G D 00002227327i[CPU0 ] | SEG sltr(index|ti|rpl) base limit G D 00002227327i[CPU0 ] | CS:0008( 0001| 0| 0) 00000000 000fffff 1 1 00002227327i[CPU0 ] | DS:0008( 0001| 0| 0) 00000000 000fffff 1 1 00002227327i[CPU0 ] | SS:0000( 0005| 0| 0) 00000000 0000ffff 0 0 00002227327i[CPU0 ] | ES:0008( 0001| 0| 0) 00000000 000fffff 1 1 00002227327i[CPU0 ] | FS:0000( 0005| 0| 0) 00000000 0000ffff 0 0 00002227327i[CPU0 ] | GS:0000( 0005| 0| 0) 00000000 0000ffff 0 0 00002227327i[CPU0 ] | EIP=00007c5c (00007c5c) 00002227327i[CPU0 ] | CR0=0x00000011 CR1=0 CR2=0x00000000 00002227327i[CPU0 ] | CR3=0x00000000 CR4=0x00000000 00002227327i[CPU0 ] >> stosb byte ptr es:[edi], al : AA 00002227327e[CPU0 ] exception(): 3rd (13) exception with no resolution, shutdown status is 00h, resetting
От себя хочу сказать, что не нужно все тянуть в первичный загрузчик. У него другие задачи. И не нужно выкладывать код, делающие много чего, не локализовав место ошибки. Код создается поэтапно, данная ошибка появляется на определенном этапе, а не как результат сочетания действий.
Если не сложно Phantom_84 то объясните пожалуйста: - Где Вы взяли лог бокса? (а то я как-то не могу у себя в файле VBox.log найти подобных строк) - что этот лог значит? (а то я три недели назад начал изучать FASM и еще неочень разбираюсь в FASMe...) Если знаете то может посоветуете хорошие учебники по работе железа и написания OS на ASM (хочу в идеале выучить работу ПК на низком уровне)
я как-то еще не-очень понял как в первичном загрузчике загрузить вторичный загрузчик с USB флешки на которой помимо первичного загрузчика есть другие файлы... насколько я понимаю то вторичный загрузчик нужно записывать на флешке сразу после первичного загрузчика и потом в первичном с помощью BIOS считывать вторичный загрузчик. Только как..? Обычно я решаю свои проблемы сам? и не особо пользуюсь форумами. Но так как с ASM не нашел толковых учебников то только догадываюсь о месте ошибке вот и выклал весь код чтоб наверняка Если я смогу локализовать место ошибки то я и смогу разобраться как ее устранить...
vova65 1. Рекомендуется до вызова прерывания и процедур настроить стек. 2. После перехода в защищенный режим стековый сегмент уже обязательно надо настроить. 2. Ошибки проще всего искать в Bochs. 3. По поводу основной ошибки. Она элементарная легко найдёшь в отладчике. 4. Ошибок много так что фантом прав не надо спешить.
Это лог не виртуал бокса, а просто бокса (bochs'а) По-моему все предельно понятно. Общий смысл: "пишешь в сегмент, недоступный для записи, командой stosb". Pavia прав. Ты должен все что используешь настроить сам: сегментные регистры, указатель стека, указатель инструкций, флаг прерываний, флаг направления и т.д. и т.п.
Образ флешки - копипаст всех секторов в файл. Но в эмуляторах обычно не используется понятие "образ флешки". Жесткий диск, флоппик, CD/DVD. Совсем рядом была соответствующая тема.
Помогите пожалуйста разобраться что это за ошибка и как ее исправить... Код (Text): 00044174192i[CPU0 ] CPU is in protected mode (active) 00044174192i[CPU0 ] CS.d_b = 32 bit 00044174192i[CPU0 ] SS.d_b = 16 bit 00044174192i[CPU0 ] EFER = 0x00000000 00044174192i[CPU0 ] | RAX=000000006000007f RBX=0000000000007e00 00044174192i[CPU0 ] | RCX=0000000000000002 RDX=0000000000000000 00044174192i[CPU0 ] | RSP=0000000000007c00 RBP=0000000000007c00 00044174192i[CPU0 ] | RSI=00000000000e32f8 RDI=000000000000ffac 00044174192i[CPU0 ] | R8=0000000000000000 R9=0000000000000000 00044174192i[CPU0 ] | R10=0000000000000000 R11=0000000000000000 00044174192i[CPU0 ] | R12=0000000000000000 R13=0000000000000000 00044174192i[CPU0 ] | R14=0000000000000000 R15=0000000000000000 00044174192i[CPU0 ] | IOPL=0 id vip vif ac vm RF nt of df IF tf sf zf af pf cf 00044174192i[CPU0 ] | SEG selector base limit G D 00044174192i[CPU0 ] | SEG sltr(index|ti|rpl) base limit G D 00044174192i[CPU0 ] | CS:0008( 0001| 0| 0) 00000000 ffffffff 1 1 00044174192i[CPU0 ] | DS:0008( 0001| 0| 0) 00000000 ffffffff 1 1 00044174192i[CPU0 ] | SS:0000( 0005| 0| 0) 00000000 0000ffff 0 0 00044174192i[CPU0 ] | ES:0008( 0001| 0| 0) 00000000 ffffffff 1 1 00044174192i[CPU0 ] | FS:0000( 0005| 0| 0) 00000000 0000ffff 0 0 00044174192i[CPU0 ] | GS:0000( 0005| 0| 0) 00000000 0000ffff 0 0 00044174192i[CPU0 ] | MSR_FS_BASE:0000000000000000 00044174192i[CPU0 ] | MSR_GS_BASE:0000000000000000 00044174192i[CPU0 ] | RIP=0000000000007e32 (0000000000007e32) 00044174192i[CPU0 ] | CR0=0x60000011 CR2=0x0000000000000000 00044174192i[CPU0 ] | CR3=0x00000000 CR4=0x00000000 00044174192i[CPU0 ] 0x0000000000007e32>> jmp .-2 (0x00007e32) : EBFE 00044174192e[CPU0 ] exception(): 3rd (13) exception with no resolution, shutdown status is 00h, resetting
vova65 Я так понял по логам это у тебя тройная-ошибка. Прерывания ты разрешаешь, а обрабатывать не обрабатываешь.
Два варианта. 1) Не разрешать прерывания. 2) Настроить контролёр прерываний, повесть обработчики прерываний по крайней мере заглушки и разрешить прерывания.
vova65 Ничего процесс обучения человека идет во первых по кривой во вторых ступенчато. Так что как только прочитали теорию её надо пробовать пока не забыли. И по хорошему повторить это через несколько дней. Тогда знания будут накапливаться. А если ближе к существу то, что конкретно не поняли? Тут у меня приведено краткое описание. http://www.wasm.ru/forum/viewtopic.php?pid=423397#p423397
vova65 Тут пример того, как подменить карту символов, но сам вывод строки через int 10h. Просто замените на вывод в b8000h.
что значит строка лога...??? Код (Text): 00046603999e[CPU0 ] fetch_raw_descriptor: GDT: index (7f3f) fe7 > limit (1f)