OSDev http://osdev.su/ |
|
запись в память с выше 1MB (0010:0000h) http://osdev.su/viewtopic.php?f=6&t=698 |
Страница 4 из 5 |
Автор: | pavia [ 25 фев 2013, 19:38 ] |
Заголовок сообщения: | Re: запись в память с выше 1MB (0010:0000h) |
Код: jmp far 0:GoRMode Есть большое подозрения что баг в 0-селекторе сегмента. Перезагрузка сегмента кода происходит после загрузки в CS нового значения. Это выполняется дальним прыжком. Т.е по факту мы имеем GP. Которая отправляет нас в RM. Честно не знаю как тут процессор себя поведёт. |
Автор: | scuter [ 25 фев 2013, 19:52 ] |
Заголовок сообщения: | Re: запись в память с выше 1MB (0010:0000h) |
я кажись понял в чём проблема, после сброса флага PE код продолжает работать в 32-х битном дежиме т.е. получился BIG Real Mode или FLAT Real Mode а как его перевести обратно в 16-битный режим. http://wiki.osdev.org/Real_Mode тут показано как войти в режим Real Mode только вот не понял эту фразу (16-bit Protected Mode data selector) |
Автор: | pavia [ 25 фев 2013, 20:03 ] |
Заголовок сообщения: | Re: запись в память с выше 1MB (0010:0000h) |
Я бы отсюда взял бы код. http://sasm.narod.ru/docs/pm/pm_in/chap_10.htm |
Автор: | scuter [ 25 фев 2013, 21:41 ] |
Заголовок сообщения: | Re: запись в память с выше 1MB (0010:0000h) |
pavia писал(а): Я бы отсюда взял бы код. http://sasm.narod.ru/docs/pm/pm_in/chap_10.htm ага в boot он не помещается, и в добавок не работает. |
Автор: | phantom-84 [ 25 фев 2013, 21:58 ] |
Заголовок сообщения: | Re: запись в память с выше 1MB (0010:0000h) |
scuter писал(а): тут показано как войти в режим Real Mode только вот не понял эту фразу (16-bit Protected Mode data selector) Вы бы сразу поясняли, что это не вы написали. Селектор 28h должен выбирать соответствующий дескриптор.scuter писал(а): pavia писал(а): Я бы отсюда взял бы код. http://sasm.narod.ru/docs/pm/pm_in/chap_10.htm ага в boot он не помещается, и в добавок не работает. |
Автор: | phantom-84 [ 25 фев 2013, 22:13 ] |
Заголовок сообщения: | Re: запись в память с выше 1MB (0010:0000h) |
Дескрипторы 16-разрядных сегментов: Код: DF_DATA equ 10h DF_CODE equ 18h DF_DUALACTION equ 2 set CODE16,$-GDT desc 0F8000h,0FFFFh,DF_CODE+DF_DUALACTION set DATA16,$-GDT desc 0F8000h,0FFFFh,DF_DATA+DF_DUALACTION База (0F8000h) может быть любой. Еще не забудь флаг DF_PRESENT - у меня он добавляется дефолтом. |
Автор: | scuter [ 25 фев 2013, 22:58 ] |
Заголовок сообщения: | Re: запись в память с выше 1MB (0010:0000h) |
phantom-84 писал(а): scuter писал(а): тут показано как войти в режим Real Mode только вот не понял эту фразу (16-bit Protected Mode data selector) Вы бы сразу поясняли, что это не вы написали. Селектор 28h должен выбирать соответствующий дескриптор.писал его я только где то ошибся( может быть) phantom-84 писал(а): scuter писал(а): pavia писал(а): Я бы отсюда взял бы код. http://sasm.narod.ru/docs/pm/pm_in/chap_10.htm ага в boot он не помещается, и в добавок не работает. а куда ещё это тащить, кроме загрузочного фрагмента у меня ничего не запускается. phantom-84 писал(а): Дескрипторы 16-разрядных сегментов: Код: DF_DATA equ 10h DF_CODE equ 18h DF_DUALACTION equ 2 set CODE16,$-GDT desc 0F8000h,0FFFFh,DF_CODE+DF_DUALACTION set DATA16,$-GDT desc 0F8000h,0FFFFh,DF_DATA+DF_DUALACTION База (0F8000h) может быть любой. Еще не забудь флаг DF_PRESENT - у меня он добавляется дефолтом. а вот set и desc это какие то макросы? и как выглядит флаговая часть вот так? Код: code dw 0000111110011010b data dw 0000111110010010b пипец уже TSS_16 даже гружу но переходить в 16-битный режим не хочет Код: use16 cli ; Disable interrupts. ; Need 16-bit Protected Mode GDT entries! mov ax, 30h ; 16-bit Protected Mode data selector. mov ds, ax mov es, ax mov fs, ax mov gs, ax ; Disable paging (we need everything to be 1:1 mapped). mov eax, cr0 and eax, 0x7FFFFFFe ; Disable paging bit & enable 16-bit pmode. mov cr0, eax mov ax, 0 mov ds, ax mov es, ax mov ss, ax mov sp, 0x700 sti MOV BX, 7E00h MOV AX, 0201h ; читать 1 сектор с диска MOV DL, 0 ; читать с первого диска MOV DH, 0 ; стартовый номер головки MOV CX, 3 ; стартовый сектор с цилиндром INT 13h Код: CODE2 TSS_16, (TSS_16_end-TSS_16), 0000111110000001b Код: TSS_16:
.back_link dw 0 .SP0 dw 0 .SS0 dw 0FFFFh .SP1 dw 0 .SS1 dw 0FFFFh .SP2 dw 0 .SS2 dw 0FFFFh .CR3 dw 0 .IP dw GoRMode .EFLAGS dw 0 .AX dw 0 .CX dw 0 .DX dw 0 .BX dw 0 .SP dw 0 .BP dw 0 .SI dw 0 .DI dw 0 .ES dw 0 .CS dw 0 .SS dw 0 .DS dw 0 .FS dw 0 .GS dw 0 .LDT dw 0 .offset_andT dw 0 .IOPB dw 0 TSS_16_end: |
Автор: | scuter [ 25 фев 2013, 23:26 ] |
Заголовок сообщения: | Re: запись в память с выше 1MB (0010:0000h) |
во взял чужой GDT, результат аналогичный. Код: NULL_descr db 8 dup(0)
CODE_descr db 0FFh,0FFh,00h,00h,00h,10011010b,11001111b,00h DATA_descr db 0FFh,0FFh,00h,00h,00h,10010010b,11001111b,00h VIDEO_descr db 0FFh,0FFh,00h,80h,0Bh,10010010b,01000000b,00h |
Автор: | scuter [ 25 фев 2013, 23:53 ] |
Заголовок сообщения: | Re: запись в память с выше 1MB (0010:0000h) |
ура товарищи нашёл ошибку, она была синтаксическая джамп писал так jmp far 18:p_mode16 а надо было так jmp far 18h:p_mode16 |
Автор: | phantom-84 [ 26 фев 2013, 11:15 ] |
Заголовок сообщения: | Re: запись в память с выше 1MB (0010:0000h) |
scuter писал(а): phantom-84 писал(а): scuter писал(а): тут показано как войти в режим Real Mode только вот не понял эту фразу (16-bit Protected Mode data selector) Вы бы сразу поясняли, что это не вы написали. Селектор 28h должен выбирать соответствующий дескриптор.писал его я только где то ошибся( может быть) Цитата: а куда ещё это тащить, кроме загрузочного фрагмента у меня ничего не запускается. Так разберись сначала с этим.В RM не используется TSS. В PM тоже не постоянно. Я тебе показал, что лимит должен быть равен 0FFFFh, так какого фига ты в 7-ом байте пишешь 0Fh! |
Страница 4 из 5 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |