Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.RU > Assembler > Переход в нереальный режим


Автор: Lex_Onix 23.06.06, 18:32
Привет всем!!! При написании загрузчика, для своей ОС, я столкнулся вот с такой проблемой: при переводе CPU в UNREAL MODE (нереальный режим) комп просто напросто перезагружается. Я в сети находил много примеров по переводу процессора в нереальный режим, но они были написаны на TASM (пытался перевести на NASM, но эффект тот же самый) или вовсе нерабочие!!! Листал многие книги (Зубков, Кулаков …) Но результат нулевой  :angry: !!! Вот мой исходничек, укажите на ошибку или предложите свой вариант (желательно для NASM):

<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    [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
     

Автор: Barbosman 24.06.06, 06:34
А ты уверен, что ты изначально все правильно делаешь?
Этот код у тебя это загрузчик самой системы или тот который в MBR лежит?
А не легче ли по началу просто грузится в реальном режиме? а то как то выглядит не реально
Еще ты говоришь листал Зубкова, Кулакова..... Вобще то эти книжки надо читать, причем очень вдумчиво. :D
В Зубкове, там код есть, пример переключения в РМ, там используется интерфейс DMPI. А у тебя какой?

Цитата Lex_Onix @
[ORG 0X7C00]
- еще вот это наводит меня на сомнения. Во Фролове сказано, что "Таким образом, загрузка операционной системы с жесткого диска - двухступенчатый процесс. Вначале модули инициализации BIOS считывают главную загрузочную запись в память по адресу 7C00:0000 и ей передается управление."
Не знаю, т что ты делаешь, я пока еще не делал. Тобишь на практике с этим не сталкивался, но..... Что за цыфирка 8, которую ты забиваешь в сегментные регистры? Ведь в РМ работа происходит не с адресами сегментов, а их дескрипторами. А цыфирка 8 мало похожа на дескриптор сегмента. Я вот особо не в сматривался, честно говоря - просто лень. Но там, к примеру, не особо просматривается назначение новых обработчиков прерываний.....
Короче, давай я те наверно еще Фролова скину на мыло. Там есть кой че о работе в РМ. Только ты не листай, а читай ;) . И еще разок пересмотри/перечитай, что написано у Зубкова. Кулакова я не читал, что там не знаю.
И еще. Не побоюсь повториться. Кажется лучше грузить свою ОС в реальном режиме, в РМ всегда успеешь. Ведь изначально был DOS.
Какими нить примерами кода помочь пока не могу. Я то, конечно, сам работаю с защищенным режимом, но модули с переключением были написаны еще до меня. Но может как нить потом скину.

Добавлено
Цитата Lex_Onix @
CPU в UNREAL MODE (нереальный режим)


:lol: :lol:
Не, ну жжот афтар, аднака. Ты не обижайся, но я такую терминологию вижу впервые

Автор: e-moe 24.06.06, 08:00
Цитата Barbosman @
Вобще то эти книжки надо читать, причем очень вдумчиво. :D
В Зубкове, там код есть, пример переключения в РМ, там используется интерфейс DMPI. А у тебя какой?

В том же Зубкове, если внимательно и вдумчиво читать, есть пример перехода в нереальный режим и DPMI в том листинге и не пахнет ;)

Цитата Barbosman @
Не, ну жжот афтар, аднака. Ты не обижайся, но я такую терминологию вижу впервые

Полистай Google ;)

Автор: Lex_Onix 24.06.06, 11:55
Да... Более глупого ответа, на поставленный мной вопрос, я не видел... :blink:

Barbosman, Во-первых, операционка у меня грузится с дискетки,а не с жестяка, MBR тут не причем (MBR применим тока для жестяков!!! Для дискетки - нет!!! В дискетке нет никакого Главного Загрузочного Сектора (Master Boot Record), на дискетке просто ЗАГРУЗОЧНЫЙ СЕКТОР )!!! Во-вторых, первичный загрузчик у меня написан для дискеты с файловой системой FAT12 (он написан для MBR, как ты выразился выше!:), он же загружает вторичный загрузчик в память и передает ему управление, а тот в свою очередь переводит комп в защищенный режим, после чего в нереальный режим (в нем доступны все прерывания DOS и BIOS, он по сути и есть реальный режим тока адресуемой памяти у него свыше 1 МБ (до 4ГБ) как в защищенном режиме!!!). А теперь расскажу что за волшебную цифру 8 я гружу в сегментные регистры! 8 - селектор,который указывает на 1 дескриптор, у НЕГО база - 0, лимит - 4ГБ (не считая нулевого). Зачем грузить то его в сегментные регистры? Чтобы ответить на этот вопрос привожу тебе статью про нереальный режим, которую я выдрал из книги ЗУБКОВА!

<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    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
    ; и все - теперь процессор находится в реальном режиме
    ; с неограниченными сегментами

Автор: Supervisor 24.06.06, 15:02
Lex_Onix
1. Перед меткой "GO" поставь директиву [BITS 16]
2. Небольшая оптимизация
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    mov eax,CR0
    inc ax
    mov CR0, eax

На 1 байт короче ;)
3.
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    JMP 0x8:PROTECTED_MODE

4.
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    jmp 0x0:GO

5.
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    ВОТ НА ЭТОМ МЕСТЕ ОН И ПЕРЕЗАГРУЖАЕТСЯ, ВИДИМО

На том месте программа просто не может зависнуть. Простая запись в сегментные регистры не приводит к перезагрузке.
6.
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    xor al,al
    out 0x70, al

Зачем обнулять индексный регистр CMOS перед переходом в защищенный режим. :)

Автор: Lex_Onix 24.06.06, 16:28
Привет, Supervisor!!! Все сделал как ты посоветовал, НО результат тот же :'(

<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    На том месте программа просто не может зависнуть. Простая запись в сегментные регистры не приводит к перезагрузке.


Ты меня неправильно понял! Комп перезагружается лишь тогда, когда я вношу значение селектора в сегментные регистры, а после перехожу в R-mode (точнее в U-mode), НО если я не поменяю значения сегментных регистров, а просто перейду в R-mode, тогда все ОК. Тестировал эту хрень на живом компе, VMware Workstation и Boch. <_<

Добавлено
И еще никто не знает насчет того как правильно загрузить русский шрифт в знакогенератор! Я нашел пример, но никак не могу заставить
этот код работать на машине

Автор: ProgramMan 24.06.06, 18:37
Lex_Onix, код можно было приаттачить, связб не у всех хорошая, а читать матрицу шрифта не сособо интересно. ;)

Цитата
Тестировал эту хрень на живом компе, VMware Workstation и Boch.
если тестировал на бошь, то какая конкретно была ошибка? Бошь же позволяет отлаживать исполняемый код, да и ошибки может сообщать.

Вообще есть замечательная дока Защищённый режим

Попробуй
Цитата

descr_code db 0ffh,0ffh,00,00,00,9Ah,0C0h,00

Автор: Lex_Onix 24.06.06, 21:08
ProgramMan, спасиба!!! Вроде после того как поменял дескриптор все запахало :D , НО VMware workstation выдал какую-то ошибку 8-) . На реальной машине пока не пробовал (в данный момент в сети) так что поспешных выводов не буду делать. Теперь насчет BOCH...
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    если тестировал на бошь, то какая конкретно была ошибка? Бошь же позволяет отлаживать исполняемый код, да и ошибки может сообщать

Где это поглядеть? неужели в файле, который создается всегда после отключения BOCH - bochsout.txt? :blink:

Автор: Supervisor 25.06.06, 03:21
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    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

Автор: ProgramMan 25.06.06, 04:54
Lex_Onix, есть такие волшебные парамтры для бошь:
Цитата

panic: action=report
error: action=report
info: action=report
debug: action=report
pass: action=report

Естественно размер лога будет приближатся к мегабайту, но зато там будет всё.
Либо используй бошь в режиме отладчика.

Цитата
ВОТ НА ЭТОМ МЕСТЕ ОН И ПЕРЕЗАГРУЖАЕТСЯ, ВИДИМО, ЧТО-ТО ЕГО НЕ УСТРАИВАЕТ В СЕГМЕНТНЫХ РЕГИСТРАХ

Кстати, ошибка в этом месте ОЧЕНь маловероятна, по этому и предлогаю исползовать бошь.
Как ты определил место ошибки?
Так же не мешало бы перед перехододом в PM разрешить использование расширеной памяти
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    ;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

Автор: Lex_Onix 25.06.06, 10:16
Привет, ProgramMan! Я хочу поговорить насчет BOCH.
Я им пользуюсь совсем недавно и понятия не имею как его использовать в режиме отладчика,
понятия не имею куда вводить эти параметры (в bochsrc.bxrc что ль?). Я его настраивал вот по
этой справке (больше я о нем нихрена не знаю, буду очень признателен, если ты мне поможешь
хоть чуток с ним разобраться):


<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    ...
     
    Приступаем к установке...
    Сразу отмечу: предполагается, что читатель пользуется 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 и установим на виртуальный жёсткий диск не менее виртуального компьютера
    вполне реальную операционную систему. До скорых встреч!

И еще, я бы с удовольствием с тобой побеседовал в ЧАТ'е или в Аське (трудно найти человека,
который действительно хорошо разбирался бы в асме)

Автор: ProgramMan 25.06.06, 15:19
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

Автор: Evgeniy 25.06.06, 16:39
Этот прикол я давно заметил НА VMWARE переход в защищённый режим не работает. Юзаю Microsoft Virtual PC и всё отлично. Всё как на реальной машине.

Добавлено
PS Bochs ещё хуже чем VMWARE

Автор: Pavia 25.06.06, 16:54
Evgeniy
У меня на VMWARE все работает. Один не достаток нужно нажымать выкл/вкл, а то перезагрузка в случии ошибки не помагает.
ProgramMan
А как в Boshs с дебугером работать? А то я пробовал ставить брэк поинты, а он их не ловит.

Автор: Supervisor 25.06.06, 17:04
Цитата
НА VMWARE переход в защищённый режим не работает

Если бы действительно так было, на данной виртуальной машине не работати бы ни Windows, ни FreeBSD. Но все замечательно работает. Так вот, прежде чем винить качественный и хорошо отлаженный продукт, имеет смысл удостовериться, у самого то руки не кривые?!
P.S. Это я так, к слову.

Автор: ProgramMan 26.06.06, 04:21
Evgeniy, это не так, когда отлаживал свою ось, была проблема, в том, что некоторые ВМ(непомню какие именно) изначально разришают A20 а некоторые нет. Когда было выловленно большенство багов, код работал на всех ВМ и на реальной машине.

Pavia, в бошь, в режиме отладчикак есть команда help ;) , бряк можно ставить командой break

Автор: Barbosman 26.06.06, 05:19
Опрокинули Барбоса напрочь. :lol:
:blink:

Добавлено
Цитата e-moe @
В том же Зубкове, если внимательно и вдумчиво читать, есть пример перехода в нереальный режим и DPMI в том листинге и не пахнет


а можно ссылку на главу? или может мы разных Зубковых имеем ввиду? Я имею ввиду Зубков С. В. "Assembler" 1999 Издательство «ДМК Пресс».
а может я не вдумчиво смотрел? :blink:

А по поводу цифры 8, а че там бит присутствия сегмента = false?

Автор: ProgramMan 26.06.06, 08:27
Barbosman, у зубкова действительно есть пример использования DMPI, НО DMPI это интерфейс, обеспечиваемый либо BIOSом либо ОС, НЕ ПРОЦЕССОРОМ.

Цитата из Зубкова "Ассемблер" издание 1999г
Цитата

глава 6. Программирование в защищенном режиме
...
Этот режим намного сложнее реального, поэтому, чтобы переключить в него процессор и поддерживать работу в этом режиме, надо написать небольшую операционную систему. Кроме того, если процессор уже находится под управлением какой-то операционной системы, которая перевела его в защищенный режим, например Windows 95, она, скорее всего, не разрешит программе устранить себя от управления компьютером. С этой целью были разработаны специальные интерфейсы, позволяющие программам, запущенным в режиме V86 в DOS, переключаться в защищенный режим простым вызовом соответствующего прерывания — VCPI и DPMI.

смотри также главу 6.3. "Интерфейс DPMI" и главу 6.2. "Интерфейс VCPI"

Цитата с www.sasm.narod.ru
Цитата

В защищённый режим процессор надо переводить специальными операциями над системными регистрами и войти в этот режим процессор может только из режима реальных адресов. При работе в защищённом режиме процессор контролирует практически все действия программ и позволяет разделить операционную систему, драйвера и прикладные программы разными уровнями привилегий.


Цитата
А по поводу цифры 8, а че там бит присутствия сегмента = false?

Не путай селектор с дескриптором
Подробней можешь прочитать ТУТ

Автор: Barbosman 26.06.06, 10:41
аааа, пардон, гоню.

Добавлено
т.е загрузкой цифры 8 в сегментные регистры осуществляется загрузка селектора первого десктриптора в глобальной таблице, с 0-м уровнем превилегий, так?

Автор: Lex_Onix 26.06.06, 12:02
PROGRAM MAN дай пожалуйста мне свой E-mail

Добавлено
Хотел тебе файл один скинуть,но на форум он не хочет загружаться, видите ли формат *.rar его не устраивает! :(

Автор: ProgramMan 26.06.06, 13:58
Lex_Onix, Для личной переписки существует PM ;)
Правила, п.9
Цитата
видите ли формат *.rar его не устраивает!
всего скорее не формат а размер

Цитата
.е загрузкой цифры 8 в сегментные регистры осуществляется загрузка селектора первого десктриптора в глобальной таблице, с 0-м уровнем превилегий, так?

Да. Обычно это организуется вот так:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    GDT:
    descriptor0
    descriptor1
    descriptor2
    ...
    sel0 =descriptor0-GDT
    sel1 =descriptor1-GDT
    sel2 =descriptor2-GDT
    ...
    mov ds,sel1
    mov ss,sel2


Цитата
ВОТ НА ЭТОМ МЕСТЕ ОН И ПЕРЕЗАГРУЖАЕТСЯ

Lex_Onix, ВероятноОШИБКА была в этом:
Цитата
При загрузке недопустимого значения селектора процессор будет генерировать исключение, даже если вы не обращались через него к памяти.

Автор: cppasm 27.06.06, 07:27
Цитата ProgramMan @
Lex_Onix, ВероятноОШИБКА была в этом:

Цитата
При загрузке недопустимого значения селектора процессор будет генерировать исключение, даже если вы не обращались через него к памяти.

Это не так. Это утверждение верно только для CS и SS.
В DS например можно загрузить допустим 0 и отлично себя чувствовать хоть 100 лет.
До первого использования.
А ошибка там как минимум была в USE32.
Разрядность менять не надо.

Автор: Jin X 01.07.06, 19:13
M

Lex_Onix, слушай. Кричать об "этом месте" не обязательно так громко. А вот тег [code]...[/code] будь добр поставь в первом сообщении, иначе рискуешь получить "нарушение" (не ставлю пока, потому что вроде далее исправился).

Автор: bomz 23.12.11, 20:10
мне тоже этот код попадался, кроме того что там две замены кодировки латиницы на кирилицу, а случайно так не ляпнешь, он начинает работать возможно (по крайней мере ошибки не выдает или не перезагружается) если заменить декриптор

dw 0ffffh,0ffh,9200h,8fh

Автор: bomz 24.12.11, 12:22
http://www.df.lth.se/~john_e/gems/gem0022.html

<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    ;-------------------------------------------------------------------------
    ;-------------------------------------------------------------------------
    .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
    ;--------------------------------------------------------------------------

<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    ;-------------------------------------------------------------------------
    .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
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    @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

Автор: shm 24.12.11, 13:16
bomz и чего?

Автор: andr00 15.03.16, 11:10
[attach=#0][/attach]Написал загрузчик MBR с нереальным режимом для HDD, проверил на 3-х компъютерах, на ноутбуке, на VMWARE, везде работает.
Правда это короткий вариант, работает только с 1- partischen.
После загрузки DOS, необходимо открыть адресную линию А20, или запустить HIMEM.SYS (я использую вместо HIMEM.SYS XMRG.SYS).
На днях попробую написать для дискеты.
MBR00.ASM (, : 234)

Автор: shm 15.03.16, 13:06
andr00, и чтоооо?

Добавлено
Ты серьезно считаешь, что поменять скрытую часть сегментного регистра настолько сложная задача, чтобы вот так делиться этим? Чем твой код лучше сотен таких же примеров в сети?

Добавлено
Цитата andr00 @
1- partischen.

partiton.

Автор: andr00 15.03.16, 15:12
Profi, ничем

Автор: andr00 28.03.16, 10:51
Эксперементируя с нереальным режимом, столкнулся с неприятным моментом.
Программы, которые используют 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. Сохраняем изменения.

Кстати, после таких изменений, не нужно переходить в нереальный режим.
Измененная программа будет делать это за вас.

Автор: andr00 10.09.17, 02:19
Довольно долго эксперементировал в DOS c режимом UNREAL(нереальный режим). Столкнулся с многими неприятностями. Основная неприятность, это
некоторые программы переводят DOS в режим REAL (реальный режим). Спрвится с ними (программами) не сложно. Нужно найти в коде программы,
с помощью HEX редактора селектор отвечающий за перевод в режим REAL и откоректировать его на перевод в режим UNREAL. Но за всеми программами не
уследишь, и рано или позно появится что то переводящее среду DOS в режим REAL. Выйти из этого положения можно несколькими способами.

1. Контролировать исключение 0DH, путем установки драйвера и при его появление, устанавливать режим UNREAL.
2. В каждой программе ввести код, который при обращение за пределы сегмента, устанавливает режим UNREAL.

Я так и не выяснил, что лутше. Установить драйвер на своем коммъютере, (можно попасть в просак на чужом компъютере),или вписывать код перехода
в UNREAL в каждой программе (что иногда накладно). Пока, для себя я разработал драйвер KEY_R8.SYS (аналог KEYRUS), и в его тело включил
обработчик исключения 0DH, переводящий в режим UNREAL. Если кому интересно, могу поделится алгоритмом перехвата исключения 0DH и установки UNREAL.

Автор: Qraizer 11.09.17, 04:32
2-ой вариант будет сильно напрягать всех, начиная с антивирусов. 1-ый проблематичен в связи с необходимостью отделять исключение от IRQ.
Я бы упомянул 3-ий вариант: т.к. подавляющее большинство "нехороших" программ используют protect mode, а тот в свою очередь реализован в них через стандартизированные интерфейсы DPMI (или VCPI, но тут я затрудняюсь дать оценку трудоёмкости решения, скорее, оно будет гораздо проще... но я уже плоховато помню нюансы), то имеет смысл универсально решить проблему посредством собственного DPMI-хоста. И это не так сложно как может показаться. В составе QEMM есть готовый qdpmi.sys, который теоретически несложно отреверсить. К нему там прилагаются ещё управляющая консоль qdpmi.com и менеджер виртуальной памяти qdpmivm.ovl, но без них реверсинга, почти уверен, можно обойтись. Правда, боюсь, qdpmi.sys может быть завязан на сервисы самого QEMM...

Автор: shm 11.09.17, 18:22
Зачем все это?

Автор: Qraizer 11.09.17, 20:12
Та ради фана, почему нет. А зачем в современном мире вообще ассемблер?

Автор: andr00 15.09.17, 02:23
Отделить исключение от IRQ не так уж сложно. Это показано в прикрепленном файле. Я в последнее время не веду контроль над IRQ. Ничего страшного если вместо исключения сработает IRQ, да и не нашел я прерываний 0DH в своем программном обеспечение.
masm.txt (, : 180)

Автор: Qraizer 15.09.17, 04:01
Не факт. IRQ5 самое распространённое для звуковых карт, и оно не обязательно будет аппаратным. Я встречал эмуляторы SB, вызывающих его программно.

Автор: andr00 15.09.17, 06:55
Я в настоящее время не могу проверить это со звуковой картой с IRQ5 из-за наличия отсутствия таковой. Возможно контроль исключения 0DH приведет к тормозу работы звуковой карты (компьютера).

P.S. совсем забыл. В предыдущем фрегменте использовал макросы.
Прикрепляю их.
MACRO0.MAC (, : 190)

Добавлено
Да, кстати для проверки работы режима UNREAL на виртуальной машине, нужно удостоверится, что сама среда не находится в режиме REAL.
Я однажды накололся на этом. Установил режим UNREAL, все прекрасно работает. Но на реальной машине зависает. Проверил.
Оказывается, что VMware (не все версии) изначально запускается уже в режиме UNREAL.

Автор: andr00 06.10.17, 10:41
Обнаружил небольшую ошибку в большинстве программ, которые применяют тежим 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.

Проблем на порядок становится меньше.

Автор: Jin X 06.10.17, 15:06
andr00, хочешь сказать, что когда HIMEM выходит в PM (для предоставления блока памяти проге), он использует текущий программный стек, в котором старшая половина ESP может быть непустой, и ем самым он разрушит данные, находящиеся где-то далеко?

Автор: shm 06.10.17, 16:07
Мне не ясно зачем вообще трогать для этих целей SS.

Автор: Jin X 06.10.17, 18:50
shm, а вообще да. Если в SS ничего не писать, там останется то, что и было раньше (вместе с теневой частью).

Автор: andr00 09.10.17, 01:50
Драйвер 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-битной разрядности.

Автор: Jin X 09.10.17, 12:05
Цитата andr00 @
32-битная разрядность может сыграть плохую шутку, и компъютер зависнет.
Ты же говорил про стек.
Какую плохую шутку может сыграть 32-битная разрядность данных?

Автор: andr00 17.10.17, 11:57
Возможно я ошибаюсь. Вычитал где то,что установка ( в DS и ES ) селектора данных в 32-битной разрядности (без установки 32-го кода), влияет только на регистр ESP.
Довольно много программ, для собственных нужд, устанавливают именно 32-бит селектор данных (но не всегда сбрасывают). Возможно они и трогают регистр SS.
Но, повторяю, когда я на постоянной основе пытаюсь установить 32-бит и лимитом 4-Г.( в DS и ES ), то компьютер начинает иногда глючить.
С 16-бит. разрядностью и лимитом 4-Г., пока с глюками не встречался.

Автор: Jin X 17.10.17, 13:32
Ноги, видимо, отсюда растут:
user posted image
2017_10_17_17_30_56.png (, : 643)

Автор: andr00 19.10.17, 10:28
Похоже вы правы. Только я это читал уже в переводе, и там не упоминалось о сегменте SS.
Я никогда не трогаю лимит сегмента SS. Но, 32-бит (в DS, ES) иногда глючат.

Добавлено
Похоже разобрался. Я использую программу для просмотра файловой системы NTFS - NDOS.EXE. Исходная программа периодически переводит в режим 64К.
Я исправил это, нашел дескриптор, отвечающий за это и перенастроил его на 4-Гиг. Но, т.к. я пользуюсь MASM 6.11 (оказывается он тоже переводит в режим 64К)
возникают кратковременные моменты, когда процессор находится в режиме RM-64K.

Автор: andr00 24.05.18, 11:36
Прошло довольно много времени, как я эхперементировал с режимом UNRAL. Работает отлично. Сделал несколько нужных программ.
Решил замахнутся UNRAL(ом) на WINDOWS. В итоге большой облом. Даже если создать RAM диск с помощью UNRAL в среде DOS и
потом загрузить WINDOWS-98, то или WINDOWS-98 не грузится, или RAM диск исчезает. Выходом из этого положения остались
функции HIMEM.SYS (или XMRG.SYS). В итоге решил, компромисное решение будет в использование режима UNRAL в среде DOS для
создания программы (драйвера), а при переходе в WINDOWS-98, использовать функции HIMEM.SYS.

Автор: shm 25.05.18, 12:30
Цитата andr00 @
UNRAL(ом) на WINDOWS

Windows работает в полноценном pm32. Зачем там нужна эмуляция 16-битного режима с забаганными сегментными регистрами я даже представить не могу.

Автор: andr00 01.06.18, 14:42
Интересно, а можно ли использовать режим UNRAL в DOSBOX(е)?

Автор: Jin X 01.06.18, 17:26
andr00, попробуй, потом расскажешь :)

Автор: Славян 01.06.18, 18:16
Ставлю 8 из 10, что не получится. Ибо условия запуска "DOS"-режима в над-ОС всё же пишутся=защищаются в этой самой над-ОС, которая не позволит (не должна позволить) изнутри "поломать" её для таких экспериментов.

Автор: andr00 02.06.18, 08:57
Попробовал, получилось. Но в пределах 16 мб, котоые выделяет DosBox.

Добавлено
Попробовал, получилось. Но в пределах 16 мб, котоые выделяет DosBox. Параметр memsize расширяет до 64 мб

Автор: Qraizer 02.06.18, 15:27
Я как-то смотрел его сырцы. Сложилось впечатление, что он пределы сегментов вообще не проверяет. По крайней мере не нашёл кода, но нашёл коммент типа "TODO: check limit"

Автор: andr00 28.07.18, 08:39
К стати, помимо того что в DosBox можно использовать режим UNREAL, можно задействовать и UMB, с помощью HIRAM.EXE. Причем потрясающе, он выделил мне более 80 Кб UMB. В то время UMBPCI.SYS не работает в DosBox.

Powered by Invision Power Board (https://www.invisionboard.com)
© Invision Power Services (https://www.invisionpower.com)