OSDev

для всех
Текущее время: 29 апр 2024, 18:19

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




Начать новую тему Ответить на тему  [ Сообщений: 20 ]  На страницу Пред.  1, 2
Автор Сообщение
СообщениеДобавлено: 18 фев 2013, 08:02 

Зарегистрирован: 10 май 2007, 11:33
Сообщения: 1206
Я использую память, начиная с адреса 0x500. Всюду работает.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 18 фев 2013, 08:41 
Аватара пользователя

Зарегистрирован: 16 май 2007, 23:46
Сообщения: 1126
Все современные компьютеры являютя PS/2 совместимыми. Первые IBM PS/2 (1988-1990 г) Открываем документацию на БИОС PS/2 и видим что hex 50:00 (500h) используется для print screen. Это последний адре BDA.
ps2bios3.pdf
Открываем документацию на Phoenix там тоже.
BIOS Programmer's Guide v10.pdf


Совместимые не значат орегинальные. Вполне что-то могло поменяться.

Также гдето читал что память 500h-5FFh использует встроенные BASIC.
Но в 1996 была принята спецификайия BIOS Boot Specification которая говорит что бесик использоваться не будет. Вернее номер прерывания там задействуется для других целей.

Также в качестве спавочника можно смотреть Таблицы Ральфа Брауна (interupt) и книги Гука. Подрукой нету.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 18 фев 2013, 14:01 

Зарегистрирован: 28 окт 2007, 18:33
Сообщения: 1418
phantom-84 писал(а):
Я использую память, начиная с адреса 0x500. Всюду работает.


Тем не менее, лично я бы использовал с адреса 0x600 -- на всякий случай. Вдруг где попадётся особо извращённый БИОС.

Ну и не надо забывать, что доступная нижняя память кончается не на границе 640 килобайт, а меньше, поскольку верхние несколько килобайт также использует БИОС.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 18 фев 2013, 14:31 
Аватара пользователя

Зарегистрирован: 17 фев 2013, 16:13
Сообщения: 163
Цитата:
Ну и не надо забывать, что доступная нижняя память кончается не на границе 640 килобайт, а меньше, поскольку верхние несколько килобайт также использует БИОС.

Это да, до 0x0007_FFFF (510 КиБ) все свободно, кроме 0x7C00-0x7DFF, где помещается загрузочная запись. Её можно, в принципе сразу тереть, как отработает.

Потом идет область от 0x0008_0000 - 0x0009_FBFF, про которую написано
Цитата:
approximately 120 KiB, depending on EBDA size RAM (free for use, if it exists) Conventional memory

То есть её может и не быть по какой-то причине.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 18 фев 2013, 14:37 

Зарегистрирован: 28 окт 2007, 18:33
Сообщения: 1418
Надо у БИОСа спрашивать одним из древних вызовов, имевшихся ещё в первых версиях, который сообщит общий объём нижней памяти (до 640 Кбайт), и ориентироваться на его результаты. Физически-то память имеется всегда, просто этот вызов скроет объём, занятый БИОСом вверху. Какой вызов, не помню, но на Вике в своё время описывал (в статейке про определение доступного объёма памяти ПК).


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 18 фев 2013, 14:47 
Аватара пользователя

Зарегистрирован: 14 мар 2011, 12:31
Сообщения: 970
Откуда: Дагоба
Код:
   xor   ax, ax
   int   12h      ; Get available base memory in AX, kB

_________________
Yet Other Developer of Architecture.
The mistery of Yoda’s speech uncovered is:
Just an old Forth programmer Yoda was.

<<< OS Boot Tools. >>>


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 18 фев 2013, 22:21 

Зарегистрирован: 19 май 2011, 14:54
Сообщения: 73
Где размещать, по адресу 0x500 или 0x600? Если разрабатываете что-то под реальный режим, возможно небольшая экономия играет роль. Однако, на практике гораздо большую роль играет не экономия, а насколько удобно размещение ядра в памяти для программирования. Нужно помнить что к примеру начальная загрузка MBR происходит по адресу 0x7c00, что выше упомянутых выше и 0x500 и 0x600. Так что даже при загрузке ядра придется делать дополнительные телодвижения. Поэтому лучше размешать ядро не по адресу 0x500 и не 0x600, а где-то выше. Либо со смещением 64K, либо со смещением 1М, как и делают многие операционные системы защищенного режима.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 19 фев 2013, 00:28 

Зарегистрирован: 10 май 2007, 11:33
Сообщения: 1206
У меня начальный стек ядра лежит в диапазоне 500h-8000h, причем дно используется также интенсивно, как и вершина: начиная с адреса 500h и до 1000h-7*8 встроенные компоненты ядра могут статически резервировать небольшие участки для передачи параметров из RM в PM, если у них нет возможности это сделать в вершине стека (для передачи параметров через вершину стека нужно соблюдать правильный порядок помещения параметров в стек в RM/извлечения параметров из стека в PM). Конец первой страницы сразу отдается для будущего размещения в нем начала IDT. Потом эта страница будет отображена в пространство ядра и объявлена некэшируемой, чтобы предотвратить возможность появления одного опасного бага на пентиумах.

Извиняюсь за столь детальное описание. Это чтобы картина была полностью ясна.

achesnokov писал(а):
Нужно помнить что к примеру начальная загрузка MBR происходит по адресу 0x7c00, что выше упомянутых выше и 0x500 и 0x600. Так что даже при загрузке ядра придется делать дополнительные телодвижения. Поэтому лучше размешать ядро не по адресу 0x500 и не 0x600, а где-то выше.
??? MBR-загрузчик сам себя перемещает, причем обычно как раз по адресам 500h или 600h. Я обычно компилирую MBR-загрузчики как раз с перемещением по адресу 500h. У моего последнего MBR-загрузчика использование этого адреса вообще является обязательным, т.к. задекларировано, что именно по этому адресу после своей работы он должен сохранять всю таблицу разделов (код идет вслед за таблицей).


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 19 фев 2013, 14:53 

Зарегистрирован: 19 май 2011, 14:54
Сообщения: 73
Цитата:
phantom-84: ??? MBR-загрузчик сам себя перемещает

Согласен. MBR загрузчики всегда себя перемещают. Тем не менее следом они грузят Boot Loader на свое место. Так что все-равно адрес 0x7c00 оказывается использован. Конечно Boot Loader тоже может себя переместить, но это и есть те самые телодвижения, про которые я и говорил.

На самом деле когда я говорил про удобство адресов, я больше говорил про их кратность определенному множителю. При написании ядра на ассемблере, кратность играет меньшую роль. Просто ее придется везде учитывать при вычислениях. При сборке файла ядра линкером и скрещивании 16-битного кода и 32-битного кода где-то в стартовой части ядра, при правильном выравнивании будет легче. Если жалко пространство, его можно занять какими-то данными, к примеру :)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 19 фев 2013, 16:44 

Зарегистрирован: 10 май 2007, 11:33
Сообщения: 1206
Изначально разговор был о возможности использования диапазона 500h-5FFh в принципе, т.е. для любых целей.

Для загрузки файла ядра в RM я считаю самой удобной базу 8000h. Стартовый 32-разрядный код вообще не выравниваю или выравниваю, как обычные подпрограммы на 16. Образ основной секции ядра с фактическими кодом и данными выравниваю на 4 байта для дальнейшего переноса образа на постоянное место (иногда выравниваю на 8 байт, если данные для первичной GDT находятся внутри этого образа).


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

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


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

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


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

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