OSDev

для всех
Текущее время: 09 дек 2019, 05:20

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 20 ]  На страницу Пред.  1, 2
Автор Сообщение
 Заголовок сообщения: Re: Два вопроса
СообщениеДобавлено: 31 окт 2011, 20:42 

Зарегистрирован: 10 май 2007, 11:33
Сообщения: 1204
Bargest писал(а):
EDD же может не быть.
Я сказал "первоочередной", а не "единственный".

Насчет SS. Код покажи. По идее в длинном режиме все должно работать, как обычно.

pavia писал(а):
Для флешек, так как их скорее всего будут копировать один в один, то нужно проверка через запись.
Для флешек такое вообще без надобности. Я не встречал поддержки загрузки с флешки без наличия EDD v3 (идентификация через device path table).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Два вопроса
СообщениеДобавлено: 31 окт 2011, 21:06 

Зарегистрирован: 31 окт 2011, 18:20
Сообщения: 230
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. Проверку сегмента кода проходит, а вот со стеком вылетает.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Два вопроса
СообщениеДобавлено: 31 окт 2011, 21:17 
Аватара пользователя

Зарегистрирован: 16 май 2007, 23:46
Сообщения: 1120
Bargest, не жиманничай давай код целиком. Не вижу тут GDTR64 LDTR, IRET в конце концов не вижу.

Цитата:
mov ax, 16+00b
mov ss, ax

Если тут вылетает, то скорее всего предел не правильно выставлен у GDT.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Два вопроса
СообщениеДобавлено: 31 окт 2011, 21:24 

Зарегистрирован: 31 окт 2011, 18:20
Сообщения: 230
Полное описание таблиц дескрипторов:
Код:
;-----------------------------------------------------------------------------
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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Два вопроса
СообщениеДобавлено: 31 окт 2011, 21:42 

Зарегистрирован: 10 май 2007, 11:33
Сообщения: 1204
Установи флаг Writable для сегмента данных.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Два вопроса
СообщениеДобавлено: 31 окт 2011, 21:48 

Зарегистрирован: 31 окт 2011, 18:20
Сообщения: 230
В доках пишут, что
Цитата:
The expand-down (E), writable (W), and accessed (A) type-field attributes are ignored.

Однако попробовал. Как и следовало ожидать, не помогло.
Хотя стоп. Какие-то продвижки есть...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Два вопроса
СообщениеДобавлено: 31 окт 2011, 21:57 
Аватара пользователя

Зарегистрирован: 16 май 2007, 23:46
Сообщения: 1120
А почему у тебя нулевой дескриптор GDT пустой?
Получается что SS.RPL<>CS.RPL


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Два вопроса
СообщениеДобавлено: 31 окт 2011, 22:07 

Зарегистрирован: 31 окт 2011, 18:20
Сообщения: 230
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

Теперь работает вроде бы. И чего тогда в доках бред пишут?..


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Два вопроса
СообщениеДобавлено: 01 ноя 2011, 17:54 
Аватара пользователя

Зарегистрирован: 16 май 2007, 23:46
Сообщения: 1120
Цитата:
не знаю каким макаром, но оно более или менее сработало

Я вчера про RPL написал он и сработал. Ты установил равный RPL.

Цитата:
push 16+111b ; SS
push StackTop ; RSP
push rbx ; RFLAGS
push 8+111b ; CS


Правда я вчера немного не корректно выразился.

Цитата:
И чего тогда в доках бред пишут?..
Видимо гнали как можно скорее сделать, а документацию потом доделали.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Два вопроса
СообщениеДобавлено: 01 ноя 2011, 22:45 

Зарегистрирован: 31 окт 2011, 18:20
Сообщения: 230
Не, я не RPL выставил. RPL и до этого был, я раза по 3 все значения перебирал. Я выставил бит "Write" в дескрипторе сегмента данных.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 20 ]  На страницу Пред.  1, 2

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB