OSDev http://osdev.su/ |
|
не грузится ядро http://osdev.su/viewtopic.php?f=6&t=701 |
Страница 1 из 3 |
Автор: | Fatal_Error [ 02 мар 2013, 12:51 ] | ||
Заголовок сообщения: | не грузится ядро | ||
код работал, но кода я добавил новый дескриптор GDT_DATA1 то перестал работать... VirtualBox зависает, Bochs перезагружается... в аттаче код\бинарники\образ дискеты
|
Автор: | iz56 [ 02 мар 2013, 15:09 ] |
Заголовок сообщения: | Re: не грузится ядро |
Размер увеличился - вот причина - а с таким же успехом можно было добавить и строку символов. Может конечно моя версия и не правильная - но проверять я не буду. |
Автор: | pavia [ 02 мар 2013, 18:22 ] |
Заголовок сообщения: | Re: не грузится ядро |
Код: 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 |
Автор: | Fatal_Error [ 02 мар 2013, 21:13 ] |
Заголовок сообщения: | Re: не грузится ядро |
iz56 писал(а): STACK_BASE_ADDRESS equ 0FFFFFFFFh ;//ошибка а почему это ошибка? т.к. esp увеличивается вниз, то это просто на верхушку стека он настроен будет. или нет? |
Автор: | pavia [ 02 мар 2013, 21:33 ] |
Заголовок сообщения: | Re: не грузится ядро |
Ты установил верхушку стека в 0FFFFFFFFh а это по сути ты ткнул пальцем в небо. У тебя ОЗУ кончается на ~3ГБ. А далее мы имеем адреса PCI. Более конкретно это ROM БИОС'а. При записи в стек (CALL) у тебя ничего не запишется. А при чтение прочитаешь абракадабру. Просто выдели кусочек памяти и установи на него указатель. |
Автор: | phantom-84 [ 02 мар 2013, 21:38 ] |
Заголовок сообщения: | Re: не грузится ядро |
Fatal_Error, а чЁ у тебя там память есть? Что за архитектура? Сам паял? Дескриптор стекового сегмента тоже какой-то мутный. Почему бы не использовать тот же FLAT-сегмент данных. В загрузчике "mov ax,cs/mov ds,ax" очень опасно. Где "mov ss,reg/mem", вообще непонятно. Много еще чего. Кстати какой ассемблер? |
Автор: | SII [ 02 мар 2013, 21:39 ] |
Заголовок сообщения: | Re: не грузится ядро |
1. Стек всегда должен быть корректным, т.е. в указателе стека должен находиться допустимый адрес. 2. Возможно, указатель стека должен быть выровнен на определённую границу (не помню, как с этим в ИА-32), и уж точно его следует выравнивать для ускорения доступа. В 32-разрядном режиме естественная граница -- полное слово, т.е. 4 байта. Соответственно, значение ESP должно быть кратно четырём. 3. Когда стек пуст, значение указателя стека указывает не на какую-то ячейку стека, а на первую ячейку, непосредственно следующую за ним. Т.е., если стек занимает адреса от 1000_0000 до 1FFF_FFFF включительно, то при инициализации необходимо загрузить в указатель стека значение 2000_0000. (Адреса взяты мной с потолка и предназначены исключительно для примера). |
Автор: | Fatal_Error [ 03 мар 2013, 07:38 ] |
Заголовок сообщения: | Re: не грузится ядро |
ассемблер 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, а куда-нибудь подальше, иначе если я что-то положу в стек, то будет исключение. А не могли бы вы рассказать что вообще в памяти находится и до каких адресов я могу ее юзать? |
Автор: | phantom-84 [ 03 мар 2013, 09:44 ] |
Заголовок сообщения: | Re: не грузится ядро |
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. (Адреса взяты мной с потолка и предназначены исключительно для примера). Цитата: А не могли бы вы рассказать что вообще в памяти находится и до каких адресов я могу ее юзать? Нужно выполнять детект. Память может быть фрагментированна. Память выше первого мега может быть вообще недоступна дефолтом. Попробуй сделать начальный стек под загруженным кодом:ss <- DATA_SELECTOR (обычный FLAT); esp <- 1000h (заметь, не 0FFFh, а именно 1000h). |
Автор: | pavia [ 03 мар 2013, 10:21 ] |
Заголовок сообщения: | Re: не грузится ядро |
Цитата: 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/Определение_объёма_памяти |
Страница 1 из 3 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |