OSDev http://osdev.su/ |
|
Два вопроса http://osdev.su/viewtopic.php?f=6&t=462 |
Страница 2 из 2 |
Автор: | phantom-84 [ 31 окт 2011, 20:42 ] |
Заголовок сообщения: | Re: Два вопроса |
Bargest писал(а): EDD же может не быть. Я сказал "первоочередной", а не "единственный".Насчет SS. Код покажи. По идее в длинном режиме все должно работать, как обычно. pavia писал(а): Для флешек, так как их скорее всего будут копировать один в один, то нужно проверка через запись. Для флешек такое вообще без надобности. Я не встречал поддержки загрузки с флешки без наличия EDD v3 (идентификация через device path table).
|
Автор: | Bargest [ 31 окт 2011, 21:06 ] |
Заголовок сообщения: | Re: Два вопроса |
GDT задаю пока хард-кодингом: Код: gdt64: ; This structure is copied to 1000h dq 0x0000000000000000 ; Null dq 0x0020980000000000 ; Code dq 0x0000900000000000 ; Data В Data как раз стоят биты P и S. Загрузка селектора: Код: use64 Start64: lgdt [GDTR64] lidt [IDTR64] mov rax, PML4E+8 ; Write-thru (Bit 3) mov cr3, rax xor ax, ax ; Clear segment regs mov ds, ax mov es, ax mov ss, ax mov fs, ax mov gs, ax mov ax, 16+00b mov ss, ax Уже тут слетает, как только пытаюсь загрузить из нулевого кольца селектор с RPL=0. (Последние две строчки добавлены для теста, в рабочем оригинале их естественно нет). А для 3 кольца создаю LDT: Код: ldt64: dq 0x0000000000000000 ; Null dq 0x0020F80000000000 ; Code dq 0x0000900000000000 ; Data И запихиваю в стек для iret селектор 16+111b. Проверку сегмента кода проходит, а вот со стеком вылетает. |
Автор: | pavia [ 31 окт 2011, 21:17 ] |
Заголовок сообщения: | Re: Два вопроса |
Bargest, не жиманничай давай код целиком. Не вижу тут GDTR64 LDTR, IRET в конце концов не вижу. Цитата: mov ax, 16+00b mov ss, ax Если тут вылетает, то скорее всего предел не правильно выставлен у GDT. |
Автор: | Bargest [ 31 окт 2011, 21:24 ] |
Заголовок сообщения: | Re: Два вопроса |
Полное описание таблиц дескрипторов: Код: ;----------------------------------------------------------------------------- GDTR64: ; Global Descriptors Table Register dw 256*8-1 ; limit of GDT (size minus one) dq 0x0000000000001000 ; linear address of GDT align 16 gdt64: ; This structure is copied to 1000h dq 0x0000000000000000 ; Null dq 0x0020980000000000 ; Code dq 0x0000900000000000 ; Data dq 0x0000000000000000 ; LDT Low, modified later dq 0x0000000000000000 ; LDT High, modified later dq 0x0000000000000000 ; TSS Low, modified later dq 0x0000000000000000 ; TSS High, modified later align 16 IDTR64: ; Interrupt Descriptor Table Register dw 256*16-1 ; limit of IDT (size minus one) (4096 bytes - 1) dq 0x0000000000000000 ; linear address of IDT LDT64Template: dq 0x0000000000000000 ; LDT Null dq 0x0020F80000000000 ; LDT code dq 0x0000900000000000 ; LDT data dq 0x0000000000000000 ; LDT reserv dq 0x0000000000000000 ; LDT reserv Для IRET делаю так: Код: pushfq pop rbx pushq 0 ; SS, тут и подставляю разные значения pushq StackTop ; RSP pushq rbx ; RFLAGS pushq 8+111b ; CS для третьего кольца, выборка из LDT pushq [Trip] ; RIP из временной переменной iretq Для LDT, динамическое создание дескриптора и загрузка селектора: Код: ;-----------------------------------------------------------------------------
; Create system segment descriptor ; In: rax - Base Addr ; rdi - Descriptor addr ; cl - Params ; dx - Limit ; ; Out: rdi - Next descriptor ;----------------------------------------------------------------------------- CreateSysDescriptor: push rax push ax mov ax, dx stosw ; store limit pop ax stosw ; 0-15 addr shr rax, 16 stosb ; 16-23 addr mov al, cl stosb ; store params xor al, al stosb ; store zero (G, high lim) shr rax, 8 stosb ; 24-31 addr shr rax, 8 stosd ; 32-63 addr xor rax, rax stosd ; reserved pop rax ret ; Create LDT descriptor mov rdi, 1000h+LDTSel mov dx, 8*5-1 mov cl, 82h ; LDT mov rax, LDT64Addr call CreateSysDescriptor |
Автор: | phantom-84 [ 31 окт 2011, 21:42 ] |
Заголовок сообщения: | Re: Два вопроса |
Установи флаг Writable для сегмента данных. |
Автор: | Bargest [ 31 окт 2011, 21:48 ] |
Заголовок сообщения: | Re: Два вопроса |
В доках пишут, что Цитата: The expand-down (E), writable (W), and accessed (A) type-field attributes are ignored. Однако попробовал. Как и следовало ожидать, не помогло. Хотя стоп. Какие-то продвижки есть... |
Автор: | pavia [ 31 окт 2011, 21:57 ] |
Заголовок сообщения: | Re: Два вопроса |
А почему у тебя нулевой дескриптор GDT пустой? Получается что SS.RPL<>CS.RPL |
Автор: | Bargest [ 31 окт 2011, 22:07 ] |
Заголовок сообщения: | Re: Два вопроса |
pavia, я пробовал и там описать дескрптор. Но это ж не валидный дескриптор. phantom-84, не знаю каким макаром, но оно более или менее сработало, не смотря на то, что написано в доках. Спасибо. Сейчас вылезает другая ошибка, которая наверно с этой мало связана. ;-------------------------------------- Н-да... Сделал так: Код: LDT64Template: dq 0x0000000000000000 ; LDT Null dq 0x0020F80000000000 ; LDT code dq 0x0000F20000000000 ; LDT data dq 0x0000000000000000 ; LDT reserv dq 0x0000000000000000 ; LDT reserv ;-------------- push 16+111b ; SS push StackTop ; RSP push rbx ; RFLAGS push 8+111b ; CS push rax ; RIP iret Теперь работает вроде бы. И чего тогда в доках бред пишут?.. |
Автор: | pavia [ 01 ноя 2011, 17:54 ] |
Заголовок сообщения: | Re: Два вопроса |
Цитата: не знаю каким макаром, но оно более или менее сработало Я вчера про RPL написал он и сработал. Ты установил равный RPL. Цитата: push 16+111b ; SS push StackTop ; RSP push rbx ; RFLAGS push 8+111b ; CS Правда я вчера немного не корректно выразился. Цитата: И чего тогда в доках бред пишут?.. Видимо гнали как можно скорее сделать, а документацию потом доделали.
|
Автор: | Bargest [ 01 ноя 2011, 22:45 ] |
Заголовок сообщения: | Re: Два вопроса |
Не, я не RPL выставил. RPL и до этого был, я раза по 3 все значения перебирал. Я выставил бит "Write" в дескрипторе сегмента данных. |
Страница 2 из 2 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |