OSDev

для всех
Текущее время: 27 апр 2024, 17:13

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




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

Зарегистрирован: 25 фев 2013, 22:01
Сообщения: 63
код работал, но кода я добавил новый дескриптор GDT_DATA1 то перестал работать... VirtualBox зависает, Bochs перезагружается...
в аттаче код\бинарники\образ дискеты


Вложения:
111.rar [3.53 КБ]
Скачиваний: 378
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: не грузится ядро
СообщениеДобавлено: 02 мар 2013, 15:09 
Аватара пользователя

Зарегистрирован: 16 апр 2010, 10:10
Сообщения: 320
Откуда: Псковская обл.
Размер увеличился - вот причина - а с таким же успехом можно было добавить и строку символов. Может конечно моя версия и не правильная - но проверять я не буду.


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

Зарегистрирован: 16 май 2007, 23:46
Сообщения: 1126
Код:
STACK_BASE_ADDRESS     equ 0FFFFFFFFh              ;//ошибка
      mov          esp, STACK_BASE_ADDRESS

      call delta
         delta:
      pop ebx                                             ;// - как результат тут ерунда.
      add ebx, USER_PM_CODE_START-delta

      mov          esi, ebx


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

Зарегистрирован: 25 фев 2013, 22:01
Сообщения: 63
iz56 писал(а):
STACK_BASE_ADDRESS     equ 0FFFFFFFFh              ;//ошибка

а почему это ошибка? т.к. esp увеличивается вниз, то это просто на верхушку стека он настроен будет. или нет?


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

Зарегистрирован: 16 май 2007, 23:46
Сообщения: 1126
Ты установил верхушку стека в 0FFFFFFFFh а это по сути ты ткнул пальцем в небо.
У тебя ОЗУ кончается на ~3ГБ. А далее мы имеем адреса PCI. Более конкретно это ROM БИОС'а.
При записи в стек (CALL) у тебя ничего не запишется. А при чтение прочитаешь абракадабру.
Просто выдели кусочек памяти и установи на него указатель.


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

Зарегистрирован: 10 май 2007, 11:33
Сообщения: 1206
Fatal_Error, а чЁ у тебя там память есть? Что за архитектура? Сам паял?

Дескриптор стекового сегмента тоже какой-то мутный. Почему бы не использовать тот же FLAT-сегмент данных.

В загрузчике "mov ax,cs/mov ds,ax" очень опасно. Где "mov ss,reg/mem", вообще непонятно.

Много еще чего.

Кстати какой ассемблер?


Последний раз редактировалось phantom-84 02 мар 2013, 21:46, всего редактировалось 1 раз.

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

Зарегистрирован: 28 окт 2007, 18:33
Сообщения: 1418
1. Стек всегда должен быть корректным, т.е. в указателе стека должен находиться допустимый адрес.

2. Возможно, указатель стека должен быть выровнен на определённую границу (не помню, как с этим в ИА-32), и уж точно его следует выравнивать для ускорения доступа. В 32-разрядном режиме естественная граница -- полное слово, т.е. 4 байта. Соответственно, значение ESP должно быть кратно четырём.

3. Когда стек пуст, значение указателя стека указывает не на какую-то ячейку стека, а на первую ячейку, непосредственно следующую за ним. Т.е., если стек занимает адреса от 1000_0000 до 1FFF_FFFF включительно, то при инициализации необходимо загрузить в указатель стека значение 2000_0000. (Адреса взяты мной с потолка и предназначены исключительно для примера).


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

Зарегистрирован: 25 фев 2013, 22:01
Сообщения: 63
ассемблер FASM. а чем дескриптор стека не нравится?
Код:
GDT_STACK   db 00h, 10h,00h,10h,00h,10010110b,01000000b,00h

предел на 1000h, база тамже, следовательно могу адресовывать память под стек >1000h. поскольку в ПМ можно адресовать 4ГБ памяти я и поставил esp на последнюю ячейку памяти, т.е. 0FFFFFFFFh=4ГБ.
phantom-84 писал(а):
Когда стек пуст, значение указателя стека указывает не на какую-то ячейку стека, а на первую ячейку, непосредственно следующую за ним. Т.е., если стек занимает адреса от 1000_0000 до 1FFF_FFFF включительно, то при инициализации необходимо загрузить в указатель стека значение 2000_0000. (Адреса взяты мной с потолка и предназначены исключительно для примера).

возможно, это если модель памяти флат. когда я в дескрипторе ставлю в поле типа 011b, то это делает не сегмент данных (грубо говоря), а сегмент стека, следовательно можно адресовать все адреса большие базы. тогда по Вашим примерам esp должен указывать не на 2000_0000, а куда-нибудь подальше, иначе если я что-то положу в стек, то будет исключение.

А не могли бы вы рассказать что вообще в памяти находится и до каких адресов я могу ее юзать?


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

Зарегистрирован: 10 май 2007, 11:33
Сообщения: 1206
Fatal_Error писал(а):
ассемблер FASM.
Тогда "equ" используешь неправильно. Тебе пока везет, т.к. образ GDTR находится сразу после GDT, но это везение может прекратиться в любой момент. Для перехода на 32-битный код можно писать "jmp fword CODE_SELECTOR:PM_ENTRY_POINT". Зачем вычислять линейные адреса/FLAT-смещения, когда работаешь по известным адресам, вообще непонятно. Любишь все усложнять?

Цитата:
а чем дескриптор стека не нравится?
Прежде всего тем, что он лишний. Расширяемые вниз сегменты вообще практически не используются. Реальную базу стека определил неправильно. Нужно сложить базу сегмента и лимит плюс 1. Получается 2000h в линейном пространстве памяти. Флаг "измерять страницами" не установлен, поэтому размер твоего стека при любом лимите будет иметь максимум значение 1 мб минус 1.

Цитата:
phantom-84 писал(а):
Когда стек пуст, значение указателя стека указывает не на какую-то ячейку стека, а на первую ячейку, непосредственно следующую за ним. Т.е., если стек занимает адреса от 1000_0000 до 1FFF_FFFF включительно, то при инициализации необходимо загрузить в указатель стека значение 2000_0000. (Адреса взяты мной с потолка и предназначены исключительно для примера).
Это не я писал(а). Но в принципе с написанным согласен. Хотя если ты будешь использовать базу сегмента 10000000h, то и начальное значение esp должно быть таким же. Мы здесь вообще не говорим про расширяемые вниз сегменты и т.п., исключительно про указатель стека.

Цитата:
А не могли бы вы рассказать что вообще в памяти находится и до каких адресов я могу ее юзать?
Нужно выполнять детект. Память может быть фрагментированна. Память выше первого мега может быть вообще недоступна дефолтом. Попробуй сделать начальный стек под загруженным кодом:
ss <- DATA_SELECTOR (обычный FLAT);
esp <- 1000h (заметь, не 0FFFh, а именно 1000h).


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

Зарегистрирован: 16 май 2007, 23:46
Сообщения: 1126
Цитата:
PROTECTED_MODE_ENTRY_POINT:
mov ax, DATA_SELEKTOR
mov ds, ax
mov es, ax
mov ss, ax
mov esp, STACK_BASE_ADDRESS

Всё равно селектор загружен другой.

Цитата:
А не могли бы вы рассказать что вообще в памяти находится и до каких адресов я могу ее юзать?

Распределение памяти имеет сложную структуру исторически сложившаюся.
http://ru.osdev.wikia.com/wiki/Карта_распределения_памяти
Правильно является опеределение пямяти через вызовы сервиы БИОСа
int 12h для базовой памяти. Int 15h для получения памяти выше 1 мбайта.
Надо учитывать что не все функции биос может поддерживать.
Так как память представляет из себя решето то удобно сделать её непрерывной при помощи страниц.
И ещё для работы со страницами полученную карту надо будет подравнять. Диапазоны могут быть не кратными размеру страницы.
http://ru.osdev.wikia.com/wiki/Определение_объёма_памяти


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

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


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

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


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

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