Доброе время суток! У меня проблема, я делаю переход в защищенной режим с ДОСа - всё гуд, но когда я хочу записать что-то в видеопамять - сразу ребут... в чём проблема? Вот код: Код (Text): format MZ heap 0 stack 0x800 entry _code:start include '..\include\pmode.inc' - описание структур code_descr = (code_desc-null_desc) full_descr = (full_desc-null_desc) video_descr = (video_desc-null_desc) segment _code use16 start: mov ax, _gdt mov ds, ax mov ax, 0x03 int 0x10 cli in al, 0x70 or al, 0x80 out 0x70, al in al, 0x92 or al, 0x02 out 0x92, al xor eax, eax mov ax, pmode shl eax, 0x04 add eax, pm_entry mov [code_desc.base_l], ax rol eax, 0x10 mov [code_desc.base_m], al xor eax, eax mov ax, ss shl eax, 0x04 mov [stack_desc.base_l], ax rol eax, 0x10 mov [stack_desc.base_m], al xor eax, eax mov ax, _gdt shl eax, 0x04 mov [gdtr+0x02], eax lgdt [gdtr] mov eax, cr0 or al, 1 mov cr0, eax jmp fword code_desc:pm_entry segment pmode use32 pm_entry: mov ax, video_descr mov es, ax mov byte [es:0x100], 'A' jmp $ code_size = ($-pm_entry) segment _gdt use16 gdt: null_desc desc_struc 0,0,0,0,0,0 full_desc desc_struc 0xffff,0,0,data_acc,0,0 code_desc desc_struc code_size-1,0,0,code_acc,0,0 stack_desc desc_struc 0x800-1,0,0,data_acc,0,0 video_desc desc_struc 0x4000-1,0x8000,0x0b,data_acc,0,0 gdt_size = ($-gdt) gdtr: dw gdt_size-1 dd 0
Какие значения имеют code_acc, data_acc? И ребут происходит именно при записи в видеопамять? Вообще, Bochs хорошо помогает в таких случаях.
Mika0x65 Код (Text): acc_present = 10000000b acc_cseg = 00011000b acc_dseg = 00010000b acc_expdown = 00000100b acc_conform = 00000100b acc_datawr = 00000010b data_acc = acc_present or acc_dseg or acc_datawr code_acc = acc_present or acc_cseg or acc_conform ребут происходит когда вообще пробую записать – на данный момент писал у видео память. Bochs – ни когда не пользовался, не знаю как и он у меня не стоит.
Great вполне возможно – не спорю, но может сейчас кто-то видит ошибку у меня в коде? буду очень благодарен
Очень жаль, но Bochs недодерживает загрузку с флешки - а мне надо именно с флешки, да и флопа у меня нету
video_descr = (video_desc-null_desc) мне кажецо что это не равно 20h и тут jmp fword code_desc:pm_entry надо jmp 10h:pm_entry вобщем похоже ты нимного не понимаешь что такое селектор
Freeman здесь ты ошибаешься - video_descr = 0x20, а code_descr = 0x10 Код (Text): jmp fword code_desc:pm_entry здесь я сделал ошибку, надо так: Код (Text): jmp fword code_descr:pm_entry уже выправил - но дальше ребут
AntiB Залей куда-нибудь образ флешки (если она не очень большая, если большая, то залей ту часть, где твой код есть, чтобы с этого образа можно было загрузиться), так проще разобрать будет.
знач напорол с дескриптораме. попробуй последние 2 байта каждого дескриптора делоть 0с0h,00h, а не 0,0
rei3er //offtop: а ты с АТА не разбирался? Не могу понять, как мне обнаружить правильно присутствие/отсутствие винчестеров на канале.
Mika0x65 у меня на флешке стоит ДОС а с под доса я уже запускаю прогу насчет оффтопа - если я не ошибаюсь, то надо сделать ресет девайса и потом смотреть если в ax = 00 то девайс есть, потом я брал айди девайса и тоже проверял если ax = 00 - то он есть и дальше уже работал, просто делаешь это в цикле и перебрать комбинации каналов Freeman СРАБОТАЛО!!!! СПАСИБО БОЛЬШОЕ
AntiB Я думаю, что твой код по переключению в PM запросто влезет в 512 байт. Сделай плоский бинарник, положи его в MBR и загрузись с него. BIOS грузит код из MBR по адресу 0x7C00, так что менять особо много не придется. Bochs запросто позволит загрузиться из такого файла. А сам бинарник можешь выложить, как я и сказал, куда-нибудь, сообщество (ну по крайней мере, я ) посмотрит. При чем здесь ax? Речь не идет про BIOS -- вопрос в том, как определить наличие/отсутсвие устройства без BIOS'а.
Mika0x65 просто при сбросе устройства - выставляются регистры и надо проверять и этот способ делается без BIOS - сам так делал, Pavia рассказал об этом, за что ему респект - где то на форуме должно быть даже мой вопрос http://www.wasm.ru/forum/viewtopic.php?id=20088 - 8 пост от Pavia
легко, тока я не буду делать MBR - если хочешь, исходники есть - переделаешь, а вот прогу - держи http://dump.ru/files/n/n4104231606/ Вопрос: а как работать с прерываниями в защищенному режиме? их надо включить? (их же отключаем перед переходом)
AntiB Хм, а что там сейчас переделывать, если все работает? Я прочитал это: http://wasm.ru/forum/viewtopic.php?pid=172103#p172103 Беда в том, что я не понимаю, как этот способ работает. Т.е. в стандарте подобного нет, что меня смущает. По прерываниям Great написал как-то статью, думаю, она может помочь.
Mika0x65 если записывать MBR - то нужна бинарник, а не MZ формат, ладно, не в этом суть ну не знаю - я этим способом пользовался - работает находил всё что тока мог найти читал, поприбивал – не вышло , вот сижу и думаю в чём проблема... Код (Text): format MZ heap 0 stack 0x800 entry _code:start include '..\include\pmode.inc' code_descr = (code_desc-null_desc) data_descr = (data_desc-null_desc) video_descr = (video_desc-null_desc) segment _code use16 start: mov ax, _gdt mov ds, ax mov ax, 0x03 int 0x10 cli in al, 0x70 or al, 0x80 out 0x70, al in al, 0x92 or al, 0x02 out 0x92, al xor eax, eax mov ax, pmode shl eax, 0x04 add eax, pm_entry mov [code_desc.base_l], ax rol eax, 0x10 mov [code_desc.base_m], al xor eax, eax mov ax, _data shl eax, 0x04 mov [data_desc.base_l], ax rol eax, 0x10 mov [data_desc.base_m], al xor eax, eax mov ax, ss shl eax, 0x04 mov [stack_desc.base_l], ax rol eax, 0x10 mov [stack_desc.base_m], al xor eax, eax mov ax, _gdt shl eax, 0x04 mov [gdtr+0x02], eax xor eax, eax mov ax, _idt shl eax, 0x04 mov [idtr+0x02], eax lgdt [gdtr] lidt [idtr] mov eax, cr0 or al, 1 mov cr0, eax jmp fword code_descr:pm_entry segment pmode use32 pm_entry: mov ax, data_descr mov ds, ax mov ax, video_descr mov es, ax in al, 0x70 and al, 0x7f out 0x70, al sti mov esi, msg int 0x01 jmp $ syscall_handler: pushad _puts: lodsb mov esi, [cursor] mov [es:edi*2], al inc [cursor] test al, al jnz _puts popad iretd exGP_handler: pop eax mov esi, gp int 0x01 iretd int8_handler: inc byte [es:0x00] jmp int_EOI int_EOI: push ax mov al, 0x20 out 0x20, al out 0xa0, al pop ax iretd dummy: iretd code_size = ($-pm_entry) segment _data use32 gp db '*** General Protection Fault ***', 0x00 msg db 'PMODE', 0x00 cursor dd 0x06 data_size = ($-gp) segment _gdt use16 gdt: null_desc desc_struc 0,0,0,0,0,0 code_desc desc_struc code_size-1,0,0,code_acc,0xc0,0 data_desc desc_struc data_size-1,0,0,data_acc,0xc0,0 stack_desc desc_struc 0x800-1,0,0,data_acc,0xc0,0 video_desc desc_struc 0x4000-1,0x8000,0x0b,data_acc,0xc0,0 gdt_size = ($-gdt) gdtr: dw gdt_size-1 dd 0 segment _idt use16 idt: exeption_01 idt_struc dummy,code_descr,0,trap_acc,0 exeption_02 idt_struc syscall_handler,code_descr,0,trap_acc,0 exeption_03 idt_struc dummy,code_descr,0,trap_acc,0 exeption_04 idt_struc dummy,code_descr,0,trap_acc,0 exeption_05 idt_struc dummy,code_descr,0,trap_acc,0 exeption_06 idt_struc dummy,code_descr,0,trap_acc,0 exeption_07 idt_struc dummy,code_descr,0,trap_acc,0 exeption_08 idt_struc dummy,code_descr,0,trap_acc,0 exeption_09 idt_struc dummy,code_descr,0,trap_acc,0 exeption_0a idt_struc dummy,code_descr,0,trap_acc,0 exeption_0b idt_struc dummy,code_descr,0,trap_acc,0 exeption_0c idt_struc dummy,code_descr,0,trap_acc,0 exeption_0d idt_struc exGP_handler,code_descr,0,trap_acc,0 exeption_0e idt_struc dummy,code_descr,0,trap_acc,0 exeption_0f idt_struc dummy,code_descr,0,trap_acc,0 exeption_10 idt_struc dummy,code_descr,0,trap_acc,0 exeption_11 idt_struc dummy,code_descr,0,trap_acc,0 exeption_12 idt_struc dummy,code_descr,0,trap_acc,0 exeption_13 idt_struc dummy,code_descr,0,trap_acc,0 exeption_14 idt_struc dummy,code_descr,0,trap_acc,0 exeption_15 idt_struc dummy,code_descr,0,trap_acc,0 exeption_16 idt_struc dummy,code_descr,0,trap_acc,0 exeption_17 idt_struc dummy,code_descr,0,trap_acc,0 exeption_18 idt_struc dummy,code_descr,0,trap_acc,0 exeption_19 idt_struc dummy,code_descr,0,trap_acc,0 exeption_1a idt_struc dummy,code_descr,0,trap_acc,0 exeption_1b idt_struc dummy,code_descr,0,trap_acc,0 exeption_1c idt_struc dummy,code_descr,0,trap_acc,0 exeption_1d idt_struc dummy,code_descr,0,trap_acc,0 exeption_1e idt_struc dummy,code_descr,0,trap_acc,0 exeption_1f idt_struc dummy,code_descr,0,trap_acc,0 irq_00 idt_struc int8_handler,code_descr,0,int_acc,0 irq_01 idt_struc int_EOI,code_descr,0,int_acc,0 idt_size = ($-idt) idtr: dw idt_size-1 dd 0 Код (Text): struc idt_struc op1,op2,op3,op4,op5 { .destoff dw op1 .destsel dw op2 .nparams db op3 .access db op4 .rsrv dw op5 } может кто-то поможет? найдет ошибку... если делаю sti - ребут, если нет - то всё гуд (если самого прерывание нету)
Что никто не знает? Я кажется всё верно сделал, но идет ребут Кто ни будь может дать рабочий пример? Заранее благодарен
trap_acc чему равен? Помимо этого: int 0x1 использовать нежелательно -- как-никак, EFLAGS.TF & DRx используют это прерывание.