Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.131.110.169] |
|
Страницы: (4) [1] 2 3 ... Последняя » все ( Перейти к последнему сообщению ) |
Сообщ.
#1
,
|
|
|
Привет всем!!! При написании загрузчика, для своей ОС, я столкнулся вот с такой проблемой: при переводе CPU в UNREAL MODE (нереальный режим) комп просто напросто перезагружается. Я в сети находил много примеров по переводу процессора в нереальный режим, но они были написаны на TASM (пытался перевести на NASM, но эффект тот же самый) или вовсе нерабочие!!! Листал многие книги (Зубков, Кулаков …) Но результат нулевой !!! Вот мой исходничек, укажите на ошибку или предложите свой вариант (желательно для NASM):
[BITS 16] [ORG 0X7C00] start: cli mov ax, cs mov ds, ax mov ss, ax mov sp, 0x7c00 xor al,al out 0x70, al lgdt [GDTR] in al,0x92 or al, 2 out 0x92, al mov eax,CR0 or al, 1 mov CR0, eax JMP PROTECTED_MODE [BITS 32] PROTECTED_MODE: mov ax, 8 mov ds, ax mov es, ax mov fs, ax mov gs, ax ВОТ НА ЭТОМ МЕСТЕ ОН И ПЕРЕЗАГРУЖАЕТСЯ, ВИДИМО, ЧТО-ТО ЕГО НЕ УСТРАИВАЕТ В СЕГМЕНТНЫХ РЕГИСТРАХ mov eax,cr0 and al, 0xfe mov cr0,eax jmp GO gdt: dd 0,0 descr_code db 0FFh,0FFh,0,0,0,1001001b,11001111b,0 GDTR: dw 8*2-1 dd gdt GO: xor ax,ax mov ds,ax mov es,ax mov fs,ax mov gs,ax in al,70h and al,07Fh out 70h,al sti mov ax,cs mov ds,ax … |
Сообщ.
#2
,
|
|
|
А ты уверен, что ты изначально все правильно делаешь?
Этот код у тебя это загрузчик самой системы или тот который в MBR лежит? А не легче ли по началу просто грузится в реальном режиме? а то как то выглядит не реально Еще ты говоришь листал Зубкова, Кулакова..... Вобще то эти книжки надо читать, причем очень вдумчиво. В Зубкове, там код есть, пример переключения в РМ, там используется интерфейс DMPI. А у тебя какой? Цитата Lex_Onix @ - еще вот это наводит меня на сомнения. Во Фролове сказано, что "Таким образом, загрузка операционной системы с жесткого диска - двухступенчатый процесс. Вначале модули инициализации BIOS считывают главную загрузочную запись в память по адресу 7C00:0000 и ей передается управление."[ORG 0X7C00] Не знаю, т что ты делаешь, я пока еще не делал. Тобишь на практике с этим не сталкивался, но..... Что за цыфирка 8, которую ты забиваешь в сегментные регистры? Ведь в РМ работа происходит не с адресами сегментов, а их дескрипторами. А цыфирка 8 мало похожа на дескриптор сегмента. Я вот особо не в сматривался, честно говоря - просто лень. Но там, к примеру, не особо просматривается назначение новых обработчиков прерываний..... Короче, давай я те наверно еще Фролова скину на мыло. Там есть кой че о работе в РМ. Только ты не листай, а читай . И еще разок пересмотри/перечитай, что написано у Зубкова. Кулакова я не читал, что там не знаю. И еще. Не побоюсь повториться. Кажется лучше грузить свою ОС в реальном режиме, в РМ всегда успеешь. Ведь изначально был DOS. Какими нить примерами кода помочь пока не могу. Я то, конечно, сам работаю с защищенным режимом, но модули с переключением были написаны еще до меня. Но может как нить потом скину. Добавлено Цитата Lex_Onix @ CPU в UNREAL MODE (нереальный режим) Не, ну жжот афтар, аднака. Ты не обижайся, но я такую терминологию вижу впервые |
Сообщ.
#3
,
|
|
|
Цитата Barbosman @ Вобще то эти книжки надо читать, причем очень вдумчиво. В Зубкове, там код есть, пример переключения в РМ, там используется интерфейс DMPI. А у тебя какой? В том же Зубкове, если внимательно и вдумчиво читать, есть пример перехода в нереальный режим и DPMI в том листинге и не пахнет Цитата Barbosman @ Не, ну жжот афтар, аднака. Ты не обижайся, но я такую терминологию вижу впервые Полистай Google |
Сообщ.
#4
,
|
|
|
Да... Более глупого ответа, на поставленный мной вопрос, я не видел...
Barbosman, Во-первых, операционка у меня грузится с дискетки,а не с жестяка, MBR тут не причем (MBR применим тока для жестяков!!! Для дискетки - нет!!! В дискетке нет никакого Главного Загрузочного Сектора (Master Boot Record), на дискетке просто ЗАГРУЗОЧНЫЙ СЕКТОР )!!! Во-вторых, первичный загрузчик у меня написан для дискеты с файловой системой FAT12 (он написан для MBR, как ты выразился выше!:), он же загружает вторичный загрузчик в память и передает ему управление, а тот в свою очередь переводит комп в защищенный режим, после чего в нереальный режим (в нем доступны все прерывания DOS и BIOS, он по сути и есть реальный режим тока адресуемой памяти у него свыше 1 МБ (до 4ГБ) как в защищенном режиме!!!). А теперь расскажу что за волшебную цифру 8 я гружу в сегментные регистры! 8 - селектор,который указывает на 1 дескриптор, у НЕГО база - 0, лимит - 4ГБ (не считая нулевого). Зачем грузить то его в сегментные регистры? Чтобы ответить на этот вопрос привожу тебе статью про нереальный режим, которую я выдрал из книги ЗУБКОВА! 10.4.5. Нереальный режим Как мы уже знаем, при изменении режима скрытые части сегментных регистров сохраняют содержимое своих дескрипторов и ими можно пользоваться. Мы осуществили эту возможность в нашем первом примере, когда значения, занесенные в сегментные регистры в реальном режиме, использовались в защищенном. Возникает вопрос — а если сделать наоборот? В защищенном режиме загрузить сегментные регистры дескрипторами 4-гигабайтных сегментов с базой 0 и перейти в реальный режим? Оказывается, что это прекрасно срабатывает, и мы попадем в особый режим, который был обнаружен одновременно разными программистами и называется нереальным режимом (unreal mode), большим реальным режимом (BRM) или реальным flat-режимом (RFM). Чтобы перейти в нереальный режим, надо загрузить в CS перед переходом в реальный режим дескриптор 16-битного сегмента кода с базой 0 и лимитом 4 Гб и в остальные сегментные регистры — точно такие же дескрипторы сегментов данных. Теперь весь дальнейший код программы, написанный для реального режима, больше не ограничен рамками 64-килобайтных сегментов и способен работать с любыми массивами. Можно подумать, что первый же обработчик прерывания от таймера загрузит в CS нормальное значение и все станет как обычно, но нет. Оказывается, что при создании дескриптора в скрытой части сегментного регистра в реальном режиме процессор не трогает поле лимита, а только изменяет базу: что бы мы ни записали в сегментный регистр, сегмент будет иметь размер 4 Гб. Если попробовать вернуться в DOS — DOS будет по-прежнему работать. Можно запускать программы такого рода: .model tiny .code org 100h start: xor ax,ax mov ds,ax ; DS = 0 ; вывести символ в видеопамять: mov word ptr ds:[0B8000h],8403h ret end start и они тоже будут работать. Единственное, что отключает этот режим, — программы, переключающиеся в защищенный режим и обратно, устанавливающие границы сегментов в 64 Кб, например любые программы, использующие расширители DOS. Нереальный режим — идеальный вариант для программ, которые хотят пользоваться 32-битной адресацией и свободно обращаться ко всем прерываниям BIOS и DOS (традиционный способ состоял бы в работе в защищенном режиме с переключением в V86 для вызова BIOS или DOS, как это делается в случае DPMI). Для переключения в этот режим можно воспользоваться, например, такой процедурой: ; область данных: GDT label byte db 8 dup(0) ; нулевой дескриптор ; 16-битный 4 Гб сегмент: db 0FFh,0FFh,0,0,0,1001001b,11001111b,0 gdtr dw 16 ; размер GDI gdt_base dd ? ; линейный адрес GDT ; код программы ; определить линейный адрес GDT xor еах,еах mov ax,cs shl eax,4 add ax,offset GDT ; загрузить GDT из одного дескриптора (не считая нулевого) mov gdt_base,eax lgdt fword ptr gdtr ; перейти в защищенный режим cli mov eax,cr0 or al,1 mov cr0,eax jmp start_PM ; сбросить очередь предвыборки ; Intel рекомендует start_PM: ; делать jmp после каждой смены режима ; загрузить все сегментные регистры дескриптором с лимитом 4 Гб mov ax,8 ; 8 - селектор нашего дескриптора mov ds,ax mov es,ax mov fs,ax mov gs,ax ; перейти в реальный режим mov eax,cr0 and al,0FEh mov cr0,eax jmp exit_PM exit_PM: ; записать что-нибудь в каждый сегментный регистр хог ах,ах mov ds,ax mov es,ax mov fs,ax mov gs,ax sti mov ax,cs mov ds,ax ; и все - теперь процессор находится в реальном режиме ; с неограниченными сегментами |
Сообщ.
#5
,
|
|
|
Lex_Onix
1. Перед меткой "GO" поставь директиву [BITS 16] 2. Небольшая оптимизация mov eax,CR0 inc ax mov CR0, eax На 1 байт короче 3. JMP 0x8:PROTECTED_MODE 4. jmp 0x0:GO 5. ВОТ НА ЭТОМ МЕСТЕ ОН И ПЕРЕЗАГРУЖАЕТСЯ, ВИДИМО На том месте программа просто не может зависнуть. Простая запись в сегментные регистры не приводит к перезагрузке. 6. xor al,al out 0x70, al Зачем обнулять индексный регистр CMOS перед переходом в защищенный режим. |
Сообщ.
#6
,
|
|
|
Привет, Supervisor!!! Все сделал как ты посоветовал, НО результат тот же
На том месте программа просто не может зависнуть. Простая запись в сегментные регистры не приводит к перезагрузке. Ты меня неправильно понял! Комп перезагружается лишь тогда, когда я вношу значение селектора в сегментные регистры, а после перехожу в R-mode (точнее в U-mode), НО если я не поменяю значения сегментных регистров, а просто перейду в R-mode, тогда все ОК. Тестировал эту хрень на живом компе, VMware Workstation и Boch. Добавлено И еще никто не знает насчет того как правильно загрузить русский шрифт в знакогенератор! Я нашел пример, но никак не могу заставить этот код работать на машине |
Сообщ.
#7
,
|
|
|
Lex_Onix, код можно было приаттачить, связб не у всех хорошая, а читать матрицу шрифта не сособо интересно.
Цитата если тестировал на бошь, то какая конкретно была ошибка? Бошь же позволяет отлаживать исполняемый код, да и ошибки может сообщать.Тестировал эту хрень на живом компе, VMware Workstation и Boch. Вообще есть замечательная дока Защищённый режим Попробуй Цитата descr_code db 0ffh,0ffh,00,00,00,9Ah,0C0h,00 |
Сообщ.
#8
,
|
|
|
ProgramMan, спасиба!!! Вроде после того как поменял дескриптор все запахало , НО VMware workstation выдал какую-то ошибку . На реальной машине пока не пробовал (в данный момент в сети) так что поспешных выводов не буду делать. Теперь насчет BOCH...
если тестировал на бошь, то какая конкретно была ошибка? Бошь же позволяет отлаживать исполняемый код, да и ошибки может сообщать Где это поглядеть? неужели в файле, который создается всегда после отключения BOCH - bochsout.txt? |
Сообщ.
#9
,
|
|
|
LoadTextModeFont: ;http://www.lowlevel.h14.ru pusha mov dx, 0x3c4 mov ax, 0x100 out dx, ax mov ax, 0x402 out dx, ax mov ax, 0x704 out dx, ax mov ax, 0x300 out dx, ax mov dx, 0x3ce mov ax, 0x204 out dx, ax mov ax, 5 out dx, ax mov ax, 6 out dx, ax ;Load new font mov esi, txtmode_default_font mov edi, 0xa0000 mov ecx, 256 .lp: push ecx mov ecx, 16 cld rep movsb pop ecx add edi, 16 loop .lp mov dx, 0x3c4 mov ax, 0x100 out dx, ax mov ax, 0x302 out dx, ax mov ax, 0x304 out dx, ax mov ax, 0x300 out dx, ax mov dx, 0x3ce mov ax, 0x4 out dx, ax mov ax, 0x1005 out dx, ax mov ax, 0x0e06 out dx, ax popa ret |
Сообщ.
#10
,
|
|
|
Lex_Onix, есть такие волшебные парамтры для бошь:
Цитата panic: action=report error: action=report info: action=report debug: action=report pass: action=report Естественно размер лога будет приближатся к мегабайту, но зато там будет всё. Либо используй бошь в режиме отладчика. Цитата ВОТ НА ЭТОМ МЕСТЕ ОН И ПЕРЕЗАГРУЖАЕТСЯ, ВИДИМО, ЧТО-ТО ЕГО НЕ УСТРАИВАЕТ В СЕГМЕНТНЫХ РЕГИСТРАХ Кстати, ошибка в этом месте ОЧЕНь маловероятна, по этому и предлогаю исползовать бошь. Как ты определил место ошибки? Так же не мешало бы перед перехододом в PM разрешить использование расширеной памяти ;enable A20 gate... A20_p1: in al, 064h test al, 2 jnz A20_p1 mov al, 0D1h out 064h, al A20_p2: in al, 064h test al, 2 jnz A20_p2 mov al, 0DFh out 060h, al |
Сообщ.
#11
,
|
|
|
Привет, ProgramMan! Я хочу поговорить насчет BOCH.
Я им пользуюсь совсем недавно и понятия не имею как его использовать в режиме отладчика, понятия не имею куда вводить эти параметры (в bochsrc.bxrc что ль?). Я его настраивал вот по этой справке (больше я о нем нихрена не знаю, буду очень признателен, если ты мне поможешь хоть чуток с ним разобраться): ... Приступаем к установке... Сразу отмечу: предполагается, что читатель пользуется Windows, а не какой-либо другой ОС. Итак, порядок действий: Идём на http://bochs.sourceforge.net/ и скачиваем последнюю версию эмулятора для Windows (качать в исходных кодах не следует: для пользователя Windows сборка программы из исходных кодов - нетривиальная задача. Тем более здесь ещё и требуется утилита make) Устанавливаем эмулятор куда-либо (лучше - в папку по умолчанию). Обязательно установите DLX Linux Demo! Документацию также установить не помешает. В общем, устанавливайте всё, что предложат.В конце установки предложат просмотреть список изменений в последней версии. Согласитесь, это полезно Затем предложат прочитать Readme. Настоятельно рекомендую сделать и это Поздравляю! Установка завершена! Конфигурируем Можете запустить эмулятор. Сразу предупреждаю - вы увидите консоль. Но не следует пугаться. Сейчас мы приступим к конфигурированию. Можете попробовать сконфигурировать эмулятор через "консольный диалог", но я бы так делать не стал. Мы поступим по-другому. Идём туда, куда установлен Bochs (далее предполагается, что он установлен в папку C:\Program Files\Bochs-2.1.1 . Создаём там папку, где будет "лежать" наш виртульный комп. Для примера, создадим папку "MyVirtual". Писать конфиг вручную - самоубийство, поэтому заходим в папку C:\Program Files\Bochs-2.1.1\dlxlinux и копируем файлы bochsrc.bxrc и run.bat в только что созданный нами каталог "MyVirtual". Теперь открываем в любом текстовом редакторе файл "run.bat" и исправляем путь к нашему виртуальному PC, Вот что примерно должно получиться: cd "C:\Program Files\Bochs-2.1.1\MyVirtual" ..\bochs -q -f bochsrc.bxrc Теперь приступаем непосредственно к конфигурированию. Открываем блокнотом файл bochsrc.bxrc. Многое из предложенного здесь нас устроит. Нужно только кое-что добавить и кое-что отредактировать. Итак, Находим строчку floppya: 1_44=floppya.img, status=inserted и изменяем её на floppya: 1_44=A:, status=inserted Идём в каталог Bochs и запускаем программу bximage, предназначенную для создания образов дисков. Отвечаем последовательно: hd, flat, 150, c.img . Находим в конфиге строку ata0-master: type=disk, path="hd10meg.img", cylinders=306, heads=4, spt=17 и заменяем её на ту, что предложила в конце работы утилита bximage. Копируем c.img в наш каталог "MyVirtual" После предидущей строки добавляем следующую: ata0-slave: type=cdrom, path=D:, status=inserted, biosdetect=auto, model="Generic 1234" . В случае, если ваш CD-привод имеет другую букву (не D), следует соответственно вместо path=D: писать path=БукваВашегоCDROM: Находим строчку boot: c и изменяем на boot: a . После установки ОС на виртуальный жёсткий диск (если вы будете это делать: DOS можно загрузить и с дискеты) нужно будет вернуть строчку в первоначальное состояние. Вставляем в дисковод загрузочную дискету, запускаем из нашей папки "MyVirtual" командный файл Run.bat и наслаждаемся результатом! Вот и всё. Мы установили и сконфигурировали Bochs. В следующий раз мы поговорим о том, для чего можно использовать Bochs и установим на виртуальный жёсткий диск не менее виртуального компьютера вполне реальную операционную систему. До скорых встреч! И еще, я бы с удовольствием с тобой побеседовал в ЧАТ'е или в Аське (трудно найти человека, который действительно хорошо разбирался бы в асме) |
Сообщ.
#12
,
|
|
|
Lex_Onix, будь добр, почисти свои сообщения, топик действительно долго грузится: имеет смысл убрать из Сообщ. #6 сам шрифт, либо вложить этот файл аттачем.
Цитата понятия не имею куда вводить эти параметры Пример файла *.bxrc Цитата romimage: file=$BXSHARE/BIOS-bochs-latest, address=0xf0000 vgaromimage: file=$BXSHARE/VGABIOS-lgpl-latest megs: 384 boot: floppy floppya: 1_44="IMG.bin", status=inserted debugger_log: !LOG_debugger.txt log: !LOG.txt pit: realtime=1 panic: action=report error: action=report info: action=report debug: action=report pass: action=report mouse: enabled=0 keyboard_mapping: enabled=1, map=$BXSHARE/keymaps/x11-pc-us.map ips: 15000000 Цитата как его использовать в режиме отладчика Если использовал оригенальный инсталятор бошь, то правый клик по *.bxrc файлу и пункт Debugger. Или Bochs-2.2.1\Bochsdbg.exe -f FILENAME |
Сообщ.
#13
,
|
|
|
Этот прикол я давно заметил НА VMWARE переход в защищённый режим не работает. Юзаю Microsoft Virtual PC и всё отлично. Всё как на реальной машине.
Добавлено PS Bochs ещё хуже чем VMWARE |
Сообщ.
#14
,
|
|
|
Evgeniy
У меня на VMWARE все работает. Один не достаток нужно нажымать выкл/вкл, а то перезагрузка в случии ошибки не помагает. ProgramMan А как в Boshs с дебугером работать? А то я пробовал ставить брэк поинты, а он их не ловит. |
Сообщ.
#15
,
|
|
|
Цитата НА VMWARE переход в защищённый режим не работает Если бы действительно так было, на данной виртуальной машине не работати бы ни Windows, ни FreeBSD. Но все замечательно работает. Так вот, прежде чем винить качественный и хорошо отлаженный продукт, имеет смысл удостовериться, у самого то руки не кривые?! P.S. Это я так, к слову. |