OSDev

для всех
Текущее время: 28 апр 2024, 20:49

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




Начать новую тему Ответить на тему  [ Сообщений: 30 ]  На страницу Пред.  1, 2, 3  След.
Автор Сообщение
 Заголовок сообщения: Re: не грузится ядро
СообщениеДобавлено: 03 мар 2013, 10:30 

Зарегистрирован: 10 май 2007, 11:33
Сообщения: 1206
pavia писал(а):
Всё равно селектор загружен другой.
Я в код сильно не всматривался. В любом случае, раз дескриптор описан, значит рано или поздно он будет задействован. А я советую его выкинуть и забыть про него.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: не грузится ядро
СообщениеДобавлено: 03 мар 2013, 10:45 

Зарегистрирован: 25 фев 2013, 22:01
Сообщения: 63
Цитата:
Тогда "equ" используешь неправильно.

что не так? я с синтаксисом фасма не очень хорошо знаком, но если судить по тасм\масм, то это просто константа.
Цитата:
Прежде всего тем, что он лишний.

я просто думаю не кашерно мешать данные и стек в один сегмент, вот и сделал.
Цитата:
Зачем вычислять линейные адреса/FLAT-смещения, когда работаешь по известным адресам, вообще непонятно. Любишь все усложнять?

нет, просто этот код написан для перехода в ПМ из-под доса, а переделывать я что-то поленился :D сейчас попробую учесть все замечания и переделать.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: не грузится ядро
СообщениеДобавлено: 03 мар 2013, 11:12 

Зарегистрирован: 25 фев 2013, 22:01
Сообщения: 63
вот более человеческое переключение в ПМ. стек я убирать не стал, но воспользовался советом phantom-84 и разместил его под код. все работает. теперь ваш вердикт :)
Код:
CODE_SELEKTOR  equ 8h
     DATA_SELEKTOR  equ 10h
     VIDEO_SELEKTOR equ 18h
     STACK_SELEKTOR equ 20h

     STACK_BASE_ADDRESS equ 1000h
org 1000h
start:
                mov             ax,3
                int             10h

                in              al,92h
                or              al,2
                out             92h,al


                lgdt            [GDTR]

                cli
                in              al,70h
                or              al,80h
                out             70h,al

                mov             eax,cr0
                or              al,1
                mov             cr0,eax

                jmp CODE_SELEKTOR:PROTECTED_MODE_ENTRY_POINT

align 8
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
        GDT_STACK       db               00h, 10h,00h,10h,00h,10010110b,01000000b,00h
        GDT_size        equ             $-GDT

label GDTR fword
                dw              GDT_size-1             
                dd              GDT

use32
PROTECTED_MODE_ENTRY_POINT:
                mov ax, DATA_SELEKTOR
                mov ds, ax
                mov ax, VIDEO_SELEKTOR
                mov es, ax
                mov ax, STACK_SELEKTOR
                mov ss, ax
                mov esp, STACK_BASE_ADDRESS

                mov esi, message
                mov edi, 0
                mov ecx, 6
                rep movsb
                jmp $
message db '152535'             


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: не грузится ядро
СообщениеДобавлено: 03 мар 2013, 12:47 

Зарегистрирован: 10 май 2007, 11:33
Сообщения: 1206
Fatal_Error писал(а):
Цитата:
Тогда "equ" используешь неправильно.

что не так? я с синтаксисом фасма не очень хорошо знаком, но если судить по тасм\масм, то это просто константа.
Что не так, можно узнать в руководстве по fasm. Ты хочешь сэкономить свое время, но совершенно не думаешь о других.

В fasm'е "equ" используется для определения символических ссылок. Т.е. ты не числовую константу определяешь, а ссылку "$-GDT", что в разных местах будет давать разный числовой результат. Используй "=" или задай адресную (а по сути числовую, т.к. не указана размерность) константу (label GDT_SIZE at $-GDT).

Куда в far jump'е делся fword? Есть вероятность нарваться на скрытую, редко проявляющуюся ошибку.

Цитата:
я просто думаю не кашерно мешать данные и стек в один сегмент, вот и сделал.
По нынешним меркам "не кашерно" делать то, что ты делаешь. Тем более что ты делаешь это неправильно (мои замечания относительно содержимого дескриптора оставлены без внимания).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: не грузится ядро
СообщениеДобавлено: 03 мар 2013, 13:07 

Зарегистрирован: 10 май 2007, 11:33
Сообщения: 1206
Пример описания GDT вместе с дескриптором растущего вниз сегмента (который бы следовало выкинуть):

Код:
        align 8
GDT:
        dq 0

        set KCODE,$-GDT ; label KCODE at $-GDT
        desc 0,0FFFFFh,DF_CODE32

        set KDATA,$-GDT
        desc 0,0FFFFFh,DF_DATA32

        set STACK_SELECTOR,$-GDT
        desc 0,4FFh,DF_DATA or DF_DUALACTION or DF_EXTENDED or DF_USE32

        set GDT_SIZE,$-GDT


Получишь сегмент стека в диапазоне 500h-100000h с базой 0. Когда установишь esp в 1000h, реальное пространство стека будет в диапазоне 500h-1000h.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: не грузится ядро
СообщениеДобавлено: 03 мар 2013, 16:00 

Зарегистрирован: 25 фев 2013, 22:01
Сообщения: 63
Цитата:
По нынешним меркам "не кашерно" делать то, что ты делаешь. Тем более что ты делаешь это неправильно (мои замечания относительно содержимого дескриптора оставлены без внимания).

Хм... а что я по Вашему делаю и почему я это делаю неправильно?
вот вроде учел все замечания, убрал стек, заменил equ и добавил "фичу" :D . надеюсь теперь то все нормально?
Код:
     CODE_SELEKTOR  = 8h
     DATA_SELEKTOR  = 10h
     VIDEO_SELEKTOR = 18h
     STACK_SELEKTOR = 20h
     STACK_BASE_ADDRESS = 1000h

org 1000h
start:
                mov ax,3
                int 10h
                mov ah, 1
                mov ch, 20h
                mov cl, 20h
                int 10h

                in              al,92h
                or              al,2
                out             92h,al


                lgdt            fword [GDTR]

                cli
                in              al,70h
                or              al,80h
                out             70h,al

                mov             eax,cr0
                or              al,1
                mov             cr0,eax

                jmp fword CODE_SELEKTOR:PROTECTED_MODE_ENTRY_POINT

align 8
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
        ;GDT_STACK       db               00h, 00h,00h,10h,00h,10010110b,01000000b,00h
        GDT_size        =             $-GDT

label GDTR fword
                dw              GDT_size-1             
                dd              GDT

use32
PROTECTED_MODE_ENTRY_POINT:
                mov ax, DATA_SELEKTOR
                mov ds, ax
                mov ss, ax
                mov ax, VIDEO_SELEKTOR
                mov es, ax
                mov esp, STACK_BASE_ADDRESS


                mov ecx, 80*2*25
                mov ax, 9F00h
                mov edi, 0
                rep stosw

                mov edi, 160*13+56
                mov esi, message
@@:
                lodsb
                or al, al
                je time
                stosb
                inc edi
                jmp short @b
time:
                mov ecx, 3
                mov esi, 144
                mov al, 4
.loop:
                push ax
                out 70h, al
                in al, 71h
                mov bl, al
                shr al, 4
                and bl, 0fh
                or al, 30h
                or bl, 30h
                mov byte ptr es:esi, al
                add esi, 2
                mov byte ptr es:esi, bl
                add esi, 2
                cmp ecx, 1
                jbe .nxt
                mov byte ptr es:esi, ':'
                add esi, 2
.nxt:
                pop ax
                sub al, 2
                loop .loop
                jmp time

message db 'Welcom to Fatal_Error OS' ,0


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: не грузится ядро
СообщениеДобавлено: 03 мар 2013, 17:15 

Зарегистрирован: 10 май 2007, 11:33
Сообщения: 1206
У тебя есть ошибки в дескрипторе растущего вниз сегмента. Ты обнулил лимит, а базу оставил 1000h. Это означает, что если ты будешь использовать этот дескриптор с нач. значением esp=1000h, у тебя стек будет находиться в диапазоне памяти 1001h-2000h, т.е. когда размер кода еще немного подрастет, стек начнет его затирать. Ну и естественно адресация внутри этого сегмента не будет соответствовать FLAT'у. Кстати стек первичного загрузчика с указателем 7C00h тоже сильно ограничивает размер твоего кода (если конечно считать, что там ss=0 - mov ss,reg/mem я не увидел вообще, о чем писал ранее).

В код после команды "mov esp, STACK_BASE_ADDRESS" не вникал. Только заметил, что вроде бы нигде нет "cld". И на всякий случай: 80*2*25 слов - это в 2 раза больше, чем нужно для заполнения одного экрана. Использование видеосегмента с ненулевой базой опять приводит к появлению в программе смещений, отличных от FLAT-.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: не грузится ядро
СообщениеДобавлено: 03 мар 2013, 17:39 

Зарегистрирован: 28 окт 2007, 18:33
Сообщения: 1418
А зачем вообще использовать сегменты? Почему просто не настроить на чисто плоскую модель и не заморачиваться?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: не грузится ядро
СообщениеДобавлено: 03 мар 2013, 18:02 
Аватара пользователя

Зарегистрирован: 16 май 2007, 23:46
Сообщения: 1126
phantom-84, по моему ты ошибаешься в расчётах, для сегмента растущего вниз.


Последний раз редактировалось pavia 03 мар 2013, 18:03, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: не грузится ядро
СообщениеДобавлено: 03 мар 2013, 18:03 

Зарегистрирован: 25 фев 2013, 22:01
Сообщения: 63
1.Я наконец-то понял как работает стек
2.Я намеренно не использую память flat. В моих целях она мне не нужна.
3.Флаг D по умолчанию 0, поэтому я не использую cld
4.Сегменты мне для того, чтобы понять сегментацию в pm, чего я добился
5. Спасибо phantom-84 за объяснение :)
6. А в каком видео режиме работает винда/линукс?


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

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


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

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


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

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