Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.149.255.162] |
|
Сообщ.
#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. Это я так, к слову. |
Сообщ.
#16
,
|
|
|
Evgeniy, это не так, когда отлаживал свою ось, была проблема, в том, что некоторые ВМ(непомню какие именно) изначально разришают A20 а некоторые нет. Когда было выловленно большенство багов, код работал на всех ВМ и на реальной машине.
Pavia, в бошь, в режиме отладчикак есть команда help , бряк можно ставить командой break |
Сообщ.
#17
,
|
|
|
Опрокинули Барбоса напрочь.
Добавлено Цитата e-moe @ В том же Зубкове, если внимательно и вдумчиво читать, есть пример перехода в нереальный режим и DPMI в том листинге и не пахнет а можно ссылку на главу? или может мы разных Зубковых имеем ввиду? Я имею ввиду Зубков С. В. "Assembler" 1999 Издательство «ДМК Пресс». а может я не вдумчиво смотрел? А по поводу цифры 8, а че там бит присутствия сегмента = false? |
Сообщ.
#18
,
|
|
|
Barbosman, у зубкова действительно есть пример использования DMPI, НО DMPI это интерфейс, обеспечиваемый либо BIOSом либо ОС, НЕ ПРОЦЕССОРОМ.
Цитата из Зубкова "Ассемблер" издание 1999г Цитата глава 6. Программирование в защищенном режиме ... Этот режим намного сложнее реального, поэтому, чтобы переключить в него процессор и поддерживать работу в этом режиме, надо написать небольшую операционную систему. Кроме того, если процессор уже находится под управлением какой-то операционной системы, которая перевела его в защищенный режим, например Windows 95, она, скорее всего, не разрешит программе устранить себя от управления компьютером. С этой целью были разработаны специальные интерфейсы, позволяющие программам, запущенным в режиме V86 в DOS, переключаться в защищенный режим простым вызовом соответствующего прерывания — VCPI и DPMI. смотри также главу 6.3. "Интерфейс DPMI" и главу 6.2. "Интерфейс VCPI" Цитата с www.sasm.narod.ru Цитата В защищённый режим процессор надо переводить специальными операциями над системными регистрами и войти в этот режим процессор может только из режима реальных адресов. При работе в защищённом режиме процессор контролирует практически все действия программ и позволяет разделить операционную систему, драйвера и прикладные программы разными уровнями привилегий. Цитата А по поводу цифры 8, а че там бит присутствия сегмента = false? Не путай селектор с дескриптором Подробней можешь прочитать ТУТ |
Сообщ.
#19
,
|
|
|
аааа, пардон, гоню.
Добавлено т.е загрузкой цифры 8 в сегментные регистры осуществляется загрузка селектора первого десктриптора в глобальной таблице, с 0-м уровнем превилегий, так? |
Сообщ.
#20
,
|
|
|
PROGRAM MAN дай пожалуйста мне свой E-mail
Добавлено Хотел тебе файл один скинуть,но на форум он не хочет загружаться, видите ли формат *.rar его не устраивает! |
Сообщ.
#21
,
|
|
|
Lex_Onix, Для личной переписки существует PM
Правила, п.9 Цитата всего скорее не формат а размервидите ли формат *.rar его не устраивает! Цитата .е загрузкой цифры 8 в сегментные регистры осуществляется загрузка селектора первого десктриптора в глобальной таблице, с 0-м уровнем превилегий, так? Да. Обычно это организуется вот так: GDT: descriptor0 descriptor1 descriptor2 ... sel0 =descriptor0-GDT sel1 =descriptor1-GDT sel2 =descriptor2-GDT ... mov ds,sel1 mov ss,sel2 Цитата ВОТ НА ЭТОМ МЕСТЕ ОН И ПЕРЕЗАГРУЖАЕТСЯ Lex_Onix, ВероятноОШИБКА была в этом: Цитата При загрузке недопустимого значения селектора процессор будет генерировать исключение, даже если вы не обращались через него к памяти. |
Сообщ.
#22
,
|
|
|
Цитата ProgramMan @ Lex_Onix, ВероятноОШИБКА была в этом: Цитата При загрузке недопустимого значения селектора процессор будет генерировать исключение, даже если вы не обращались через него к памяти. Это не так. Это утверждение верно только для CS и SS. В DS например можно загрузить допустим 0 и отлично себя чувствовать хоть 100 лет. До первого использования. А ошибка там как минимум была в USE32. Разрядность менять не надо. |
Сообщ.
#23
,
|
|
|
M Lex_Onix, слушай. Кричать об "этом месте" не обязательно так громко. А вот тег [code]...[/code] будь добр поставь в первом сообщении, иначе рискуешь получить "нарушение" (не ставлю пока, потому что вроде далее исправился). |
Сообщ.
#24
,
|
|
|
мне тоже этот код попадался, кроме того что там две замены кодировки латиницы на кирилицу, а случайно так не ляпнешь, он начинает работать возможно (по крайней мере ошибки не выдает или не перезагружается) если заменить декриптор
dw 0ffffh,0ffh,9200h,8fh |
Сообщ.
#25
,
|
|
|
http://www.df.lth.se/~john_e/gems/gem0022.html
;------------------------------------------------------------------------- ;------------------------------------------------------------------------- .386p CSEG segment use16 assume cs:cseg, ds:cseg, ss:cseg, es:cseg org 100h start: ;------------------------------------------------------------------------- Code16GDT = 8 Data16GDT = 16 Data32GDT = 24 Set4Gig: in al, 92h or al, 02h out 92h, al ;call enablea20 mov eax,cr0 ; check for V86 mode ror eax,1 jc leave4gb ; exit routine if V86 mode is set. mov ax,cs ; set up GDT for this code segment mov Code, ax mov ds,ax movzx eax,ax shl eax,4 add dword ptr ds:GDTptr+2,eax lgdt fword ptr ds:GDTptr mov ax,cs and eax,65535 shl eax,4 mov word ptr ds:Mem32_GDT[Code16GDT+2],ax mov word ptr ds:Mem32_GDT[Data16GDT+2],ax ror eax,16 mov byte ptr ds:Mem32_GDT[Code16GDT+4],al mov byte ptr ds:Mem32_GDT[Data16GDT+4],al mov byte ptr ds:Mem32_GDT[Code16GDT+7],ah mov byte ptr ds:Mem32_GDT[Data16GDT+7],ah cli ; no interrupts mov eax,cr0 ; set protected mode or al,1 mov cr0,eax db 0eah ; far jump to pmode label dw offset pmode dw Code16GDT pmode: mov ax,Data32GDT ; now we are in protected mode mov ds,ax ; set all selector limits to 4 GB mov es,ax mov fs,ax mov gs,ax mov eax,cr0 ; restore real mode and al,0feh mov cr0,eax db 0eah ; far jump to rmode label dw offset rmode Code dw ? rmode: clc ; now we are back in real mode, zero carry sti ; to indicate ok and enable interrupts leave4gb: ret ;-------------------------------------------------------------------------- mem32_GDT dw 4 dup(0) dw 0ffffh,0ffh,9a00h,0 dw 0ffffh,0ffh,9200h,0 dw 0ffffh,0ffh,9200h,8fh GDTptr label fword dw offset GDTptr-1-offset Mem32_GDT dd offset Mem32_GDT ; Absolute adress GDTtable dw 0 enablea20: mov al,0d1h out 64h,al call a20wait mov al,0dfh out 60h,al call a20wait mov al,0ffh out 64h,al call a20wait ret a20wait: in al,64h jmp $+2 and al,2 jnz a20wait ret ;-------------------------------------------------------------------------- CSEG ends end start ;-------------------------------------------------------------------------- ;------------------------------------------------------------------------- .386p CSEG segment use16 assume cs:cseg, ds:cseg, ss:cseg, es:cseg org 100h ;------------------------------------------------------------------------- start: xor ax,ax mov gs,ax ; DS = 0 ; вывести символ в видеопамять: mov word ptr gs:[0B8000h],1b30h ret ;-------------------------------------------------------------------------- CSEG ends end start ;-------------------------------------------------------------------------- MASM32 10 ML.EXE 8.0 http://www.masm32.com/ http://www.microsoft.com/download/en/details.aspx?id=12654 @ECHO OFF COLOR 9F C:\masm32\bin\ml.exe /AT /omf NONAME.asm C:\masm32\bin\LINK16.EXE /TINY NONAME.obj,NONAME.com,nul,,, del NONAME.obj pause |
Сообщ.
#26
,
|
|
|
bomz и чего?
|
Сообщ.
#27
,
|
|
|
[attach=#0][/attach]Написал загрузчик MBR с нереальным режимом для HDD, проверил на 3-х компъютерах, на ноутбуке, на VMWARE, везде работает.
Правда это короткий вариант, работает только с 1- partischen. После загрузки DOS, необходимо открыть адресную линию А20, или запустить HIMEM.SYS (я использую вместо HIMEM.SYS XMRG.SYS). На днях попробую написать для дискеты. Прикреплённый файлMBR00.ASM (1,88 Кбайт, скачиваний: 230) |
Сообщ.
#28
,
|
|
|
andr00, и чтоооо?
Добавлено Ты серьезно считаешь, что поменять скрытую часть сегментного регистра настолько сложная задача, чтобы вот так делиться этим? Чем твой код лучше сотен таких же примеров в сети? Добавлено Цитата andr00 @ 1- partischen. partiton. |
Сообщ.
#29
,
|
|
|
Profi, ничем
|
Сообщ.
#30
,
|
|
|
Эксперементируя с нереальным режимом, столкнулся с неприятным моментом.
Программы, которые используют DPMI/VCPI , принудительно сбрасывают лимит с 4 Гиг. до 64 Кб. Это некоторые нужные программы (например NTDOS.EXE , которая позволяет из под DOS работать с NTFS). Решение нашел следующим способом. 1. Открываем файл (например NTDOS.EXE) любым HEX редактором (я использовал HIEW.EXE). 2. Ищем таблицу GDT по сигнатуре FF FF 00 00 00 92 00 00 (это селектор 64 Кб.) 3. Заменяем селектор на FF FF 00 00 00 92 8F 00 (это селектор 4 Гб.) 4. Сохраняем изменения. Кстати, после таких изменений, не нужно переходить в нереальный режим. Измененная программа будет делать это за вас. |
Сообщ.
#31
,
Сообщение отклонено: negram -
|
Сообщ.
#32
,
|
|
|
Довольно долго эксперементировал в DOS c режимом UNREAL(нереальный режим). Столкнулся с многими неприятностями. Основная неприятность, это
некоторые программы переводят DOS в режим REAL (реальный режим). Спрвится с ними (программами) не сложно. Нужно найти в коде программы, с помощью HEX редактора селектор отвечающий за перевод в режим REAL и откоректировать его на перевод в режим UNREAL. Но за всеми программами не уследишь, и рано или позно появится что то переводящее среду DOS в режим REAL. Выйти из этого положения можно несколькими способами. 1. Контролировать исключение 0DH, путем установки драйвера и при его появление, устанавливать режим UNREAL. 2. В каждой программе ввести код, который при обращение за пределы сегмента, устанавливает режим UNREAL. Я так и не выяснил, что лутше. Установить драйвер на своем коммъютере, (можно попасть в просак на чужом компъютере),или вписывать код перехода в UNREAL в каждой программе (что иногда накладно). Пока, для себя я разработал драйвер KEY_R8.SYS (аналог KEYRUS), и в его тело включил обработчик исключения 0DH, переводящий в режим UNREAL. Если кому интересно, могу поделится алгоритмом перехвата исключения 0DH и установки UNREAL. |
Сообщ.
#33
,
|
|
|
2-ой вариант будет сильно напрягать всех, начиная с антивирусов. 1-ый проблематичен в связи с необходимостью отделять исключение от IRQ.
Я бы упомянул 3-ий вариант: т.к. подавляющее большинство "нехороших" программ используют protect mode, а тот в свою очередь реализован в них через стандартизированные интерфейсы DPMI (или VCPI, но тут я затрудняюсь дать оценку трудоёмкости решения, скорее, оно будет гораздо проще... но я уже плоховато помню нюансы), то имеет смысл универсально решить проблему посредством собственного DPMI-хоста. И это не так сложно как может показаться. В составе QEMM есть готовый qdpmi.sys, который теоретически несложно отреверсить. К нему там прилагаются ещё управляющая консоль qdpmi.com и менеджер виртуальной памяти qdpmivm.ovl, но без них реверсинга, почти уверен, можно обойтись. Правда, боюсь, qdpmi.sys может быть завязан на сервисы самого QEMM... |
Сообщ.
#34
,
|
|
|
Зачем все это?
|
Сообщ.
#35
,
|
|
|
Та ради фана, почему нет. А зачем в современном мире вообще ассемблер?
|
Сообщ.
#36
,
|
|
|
Отделить исключение от IRQ не так уж сложно. Это показано в прикрепленном файле. Я в последнее время не веду контроль над IRQ. Ничего страшного если вместо исключения сработает IRQ, да и не нашел я прерываний 0DH в своем программном обеспечение.
Прикреплённый файлmasm.txt (743 байт, скачиваний: 175) |
Сообщ.
#37
,
|
|
|
Не факт. IRQ5 самое распространённое для звуковых карт, и оно не обязательно будет аппаратным. Я встречал эмуляторы SB, вызывающих его программно.
|
Сообщ.
#38
,
|
|
|
Я в настоящее время не могу проверить это со звуковой картой с IRQ5 из-за наличия отсутствия таковой. Возможно контроль исключения 0DH приведет к тормозу работы звуковой карты (компьютера).
P.S. совсем забыл. В предыдущем фрегменте использовал макросы. Прикрепляю их. Прикреплённый файлMACRO0.MAC (2,56 Кбайт, скачиваний: 184) Добавлено Да, кстати для проверки работы режима UNREAL на виртуальной машине, нужно удостоверится, что сама среда не находится в режиме REAL. Я однажды накололся на этом. Установил режим UNREAL, все прекрасно работает. Но на реальной машине зависает. Проверил. Оказывается, что VMware (не все версии) изначально запускается уже в режиме UNREAL. |
Сообщ.
#39
,
|
|
|
Обнаружил небольшую ошибку в большинстве программ, которые применяют тежим UNREAL.
Эта ошибка присутствует да же в таких мощных программах как драйвер HIMEM.SYS Это дескриптор данных (загужается в сегменты данных DS ES ...). GDT_DS dd 00000FFFFh,000CF9300h ;4-GB data segment. Ошибка заключается в том, что бит разрядности данных = 32. Но при 16-битном коде, это влияет только на регист стека. Программа начинает использовать вместо регистра SP, регистр ESP . Обычно программы DOS не использую регистр ESP, но если оставить мусор в старших битах ESP (биты 16...31), то дальнейшая судьба DOS, это крах. Например программа HIEW.EXE делает это иногда (HIMEM.SYS не использует ESP). Я по возможности исправляю это и сам использую дескриптор GDT_DS dd 00000FFFFh,0008F9200h ;4-GB data segment. Проблем на порядок становится меньше. |
Сообщ.
#40
,
|
|
|
andr00, хочешь сказать, что когда HIMEM выходит в PM (для предоставления блока памяти проге), он использует текущий программный стек, в котором старшая половина ESP может быть непустой, и ем самым он разрушит данные, находящиеся где-то далеко?
|
Сообщ.
#41
,
|
|
|
Мне не ясно зачем вообще трогать для этих целей SS.
|
Сообщ.
#42
,
|
|
|
shm, а вообще да. Если в SS ничего не писать, там останется то, что и было раньше (вместе с теневой частью).
|
Сообщ.
#43
,
|
|
|
Драйвер HIMEM.SYS после предоставления блока памяти в области XMS, оставляет в сегментах DS, ES (скрытая часть) 4-гигабайтный лимит и 32-битную разрядность данных. 32-битная разрядность может сыграть плохую шутку, и компъютер зависнет. Я с помощью hex-редактора (HIEW.EXE) нашел дескриптор, отвечающий за перевод в 4-гиг. режим 32-бит. разрядности по сигнатуре
0ffh,0ffh,000h,00h,000h,093h,0сfh,00h и заменяю его на 4-гиг. режим 16-бит. разрядности. 0ffh,0ffh,000h,00h,000h,093h,08fh,00h К стати, именно программа HIEW.EXE иногда глючит на 32-битной разрядности. |
Сообщ.
#44
,
|
|
|
Цитата andr00 @ Ты же говорил про стек.32-битная разрядность может сыграть плохую шутку, и компъютер зависнет. Какую плохую шутку может сыграть 32-битная разрядность данных? |
Сообщ.
#45
,
|
|
|
Возможно я ошибаюсь. Вычитал где то,что установка ( в DS и ES ) селектора данных в 32-битной разрядности (без установки 32-го кода), влияет только на регистр ESP.
Довольно много программ, для собственных нужд, устанавливают именно 32-бит селектор данных (но не всегда сбрасывают). Возможно они и трогают регистр SS. Но, повторяю, когда я на постоянной основе пытаюсь установить 32-бит и лимитом 4-Г.( в DS и ES ), то компьютер начинает иногда глючить. С 16-бит. разрядностью и лимитом 4-Г., пока с глюками не встречался. |
Сообщ.
#46
,
|
|
|
Ноги, видимо, отсюда растут:
Прикреплённый файл2017_10_17_17_30_56.png (46,85 Кбайт, скачиваний: 635) |
Сообщ.
#47
,
|
|
|
Похоже вы правы. Только я это читал уже в переводе, и там не упоминалось о сегменте SS.
Я никогда не трогаю лимит сегмента SS. Но, 32-бит (в DS, ES) иногда глючат. Добавлено Похоже разобрался. Я использую программу для просмотра файловой системы NTFS - NDOS.EXE. Исходная программа периодически переводит в режим 64К. Я исправил это, нашел дескриптор, отвечающий за это и перенастроил его на 4-Гиг. Но, т.к. я пользуюсь MASM 6.11 (оказывается он тоже переводит в режим 64К) возникают кратковременные моменты, когда процессор находится в режиме RM-64K. |
Сообщ.
#48
,
|
|
|
Прошло довольно много времени, как я эхперементировал с режимом UNRAL. Работает отлично. Сделал несколько нужных программ.
Решил замахнутся UNRAL(ом) на WINDOWS. В итоге большой облом. Даже если создать RAM диск с помощью UNRAL в среде DOS и потом загрузить WINDOWS-98, то или WINDOWS-98 не грузится, или RAM диск исчезает. Выходом из этого положения остались функции HIMEM.SYS (или XMRG.SYS). В итоге решил, компромисное решение будет в использование режима UNRAL в среде DOS для создания программы (драйвера), а при переходе в WINDOWS-98, использовать функции HIMEM.SYS. |
Сообщ.
#49
,
|
|
|
Цитата andr00 @ UNRAL(ом) на WINDOWS Windows работает в полноценном pm32. Зачем там нужна эмуляция 16-битного режима с забаганными сегментными регистрами я даже представить не могу. |
Сообщ.
#50
,
|
|
|
Интересно, а можно ли использовать режим UNRAL в DOSBOX(е)?
|
Сообщ.
#51
,
|
|
|
andr00, попробуй, потом расскажешь
|
Сообщ.
#52
,
|
|
|
Ставлю 8 из 10, что не получится. Ибо условия запуска "DOS"-режима в над-ОС всё же пишутся=защищаются в этой самой над-ОС, которая не позволит (не должна позволить) изнутри "поломать" её для таких экспериментов.
|
Сообщ.
#53
,
|
|
|
Попробовал, получилось. Но в пределах 16 мб, котоые выделяет DosBox.
Добавлено Попробовал, получилось. Но в пределах 16 мб, котоые выделяет DosBox. Параметр memsize расширяет до 64 мб |
Сообщ.
#54
,
|
|
|
Я как-то смотрел его сырцы. Сложилось впечатление, что он пределы сегментов вообще не проверяет. По крайней мере не нашёл кода, но нашёл коммент типа "TODO: check limit"
|
Сообщ.
#55
,
|
|
|
К стати, помимо того что в DosBox можно использовать режим UNREAL, можно задействовать и UMB, с помощью HIRAM.EXE. Причем потрясающе, он выделил мне более 80 Кб UMB. В то время UMBPCI.SYS не работает в DosBox.
|