На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Перед отправкой сообщения внимательно прочтите правила раздела!!!
1. Запрещается обсуждать написание вирусов, троянов и других вредоносных программ!
2. Помните, что у нас есть FAQ раздела Assembler и Полезные ссылки. Посмотрите, возможно, там уже имеется решение вашего вопроса.

3. Настоятельно рекомендуем обратить особое внимание на правила форума, которые нарушаются чаще всего:
  3.1. Заголовок темы должен кратко отражать её суть. Темы с заголовками типа "Срочно помогите!" или "Ассемблер" будут отправляться в Корзину для мусора.
  3.2. Исходники программ обязательно выделяйте тегами [code]...[/code] (одиночные инструкции можно не выделять).
  3.3. Нежелательно поднимать старые темы (не обновлявшиеся более года) без веской на то причины.

Не забывайте также про главные Правила форума!

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

    ExpandedWrap disabled
      [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
       
    Сообщение отредактировано: Jin X -
      А ты уверен, что ты изначально все правильно делаешь?
      Этот код у тебя это загрузчик самой системы или тот который в MBR лежит?
      А не легче ли по началу просто грузится в реальном режиме? а то как то выглядит не реально
      Еще ты говоришь листал Зубкова, Кулакова..... Вобще то эти книжки надо читать, причем очень вдумчиво. :D
      В Зубкове, там код есть, пример переключения в РМ, там используется интерфейс DMPI. А у тебя какой?

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

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


      :lol: :lol:
      Не, ну жжот афтар, аднака. Ты не обижайся, но я такую терминологию вижу впервые
      Сообщение отредактировано: Barbosman -
        Цитата Barbosman @
        Вобще то эти книжки надо читать, причем очень вдумчиво. :D
        В Зубкове, там код есть, пример переключения в РМ, там используется интерфейс DMPI. А у тебя какой?

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

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

        Полистай Google ;)
          Да... Более глупого ответа, на поставленный мной вопрос, я не видел... :blink:

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

          ExpandedWrap disabled
            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
            ; и все - теперь процессор находится в реальном режиме
            ; с неограниченными сегментами
            Lex_Onix
            1. Перед меткой "GO" поставь директиву [BITS 16]
            2. Небольшая оптимизация
            ExpandedWrap disabled
              mov eax,CR0
              inc ax
              mov CR0, eax

            На 1 байт короче ;)
            3.
            ExpandedWrap disabled
              JMP 0x8:PROTECTED_MODE

            4.
            ExpandedWrap disabled
              jmp 0x0:GO

            5.
            ExpandedWrap disabled
              ВОТ НА ЭТОМ МЕСТЕ ОН И ПЕРЕЗАГРУЖАЕТСЯ, ВИДИМО

            На том месте программа просто не может зависнуть. Простая запись в сегментные регистры не приводит к перезагрузке.
            6.
            ExpandedWrap disabled
              xor al,al
              out 0x70, al

            Зачем обнулять индексный регистр CMOS перед переходом в защищенный режим. :)
              Привет, Supervisor!!! Все сделал как ты посоветовал, НО результат тот же :'(

              ExpandedWrap disabled
                На том месте программа просто не может зависнуть. Простая запись в сегментные регистры не приводит к перезагрузке.


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

              Добавлено
              И еще никто не знает насчет того как правильно загрузить русский шрифт в знакогенератор! Я нашел пример, но никак не могу заставить
              этот код работать на машине
              Сообщение отредактировано: Lex_Onix -
                Lex_Onix, код можно было приаттачить, связб не у всех хорошая, а читать матрицу шрифта не сособо интересно. ;)

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

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

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

                descr_code db 0ffh,0ffh,00,00,00,9Ah,0C0h,00
                Сообщение отредактировано: ProgramMan -
                  ProgramMan, спасиба!!! Вроде после того как поменял дескриптор все запахало :D , НО VMware workstation выдал какую-то ошибку 8-) . На реальной машине пока не пробовал (в данный момент в сети) так что поспешных выводов не буду делать. Теперь насчет BOCH...
                  ExpandedWrap disabled
                    если тестировал на бошь, то какая конкретно была ошибка? Бошь же позволяет отлаживать исполняемый код, да и ошибки может сообщать

                  Где это поглядеть? неужели в файле, который создается всегда после отключения BOCH - bochsout.txt? :blink:
                    ExpandedWrap disabled
                      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
                      Lex_Onix, есть такие волшебные парамтры для бошь:
                      Цитата

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

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

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

                      Кстати, ошибка в этом месте ОЧЕНь маловероятна, по этому и предлогаю исползовать бошь.
                      Как ты определил место ошибки?
                      Так же не мешало бы перед перехододом в PM разрешить использование расширеной памяти
                      ExpandedWrap disabled
                        ;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
                        Привет, ProgramMan! Я хочу поговорить насчет BOCH.
                        Я им пользуюсь совсем недавно и понятия не имею как его использовать в режиме отладчика,
                        понятия не имею куда вводить эти параметры (в bochsrc.bxrc что ль?). Я его настраивал вот по
                        этой справке (больше я о нем нихрена не знаю, буду очень признателен, если ты мне поможешь
                        хоть чуток с ним разобраться):


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

                        И еще, я бы с удовольствием с тобой побеседовал в ЧАТ'е или в Аське (трудно найти человека,
                        который действительно хорошо разбирался бы в асме)
                          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
                            Этот прикол я давно заметил НА VMWARE переход в защищённый режим не работает. Юзаю Microsoft Virtual PC и всё отлично. Всё как на реальной машине.

                            Добавлено
                            PS Bochs ещё хуже чем VMWARE
                              Evgeniy
                              У меня на VMWARE все работает. Один не достаток нужно нажымать выкл/вкл, а то перезагрузка в случии ошибки не помагает.
                              ProgramMan
                              А как в Boshs с дебугером работать? А то я пробовал ставить брэк поинты, а он их не ловит.
                                Цитата
                                НА VMWARE переход в защищённый режим не работает

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

                                  Pavia, в бошь, в режиме отладчикак есть команда help ;) , бряк можно ставить командой break
                                  Сообщение отредактировано: ProgramMan -
                                    Опрокинули Барбоса напрочь. :lol:
                                    :blink:

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


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

                                    А по поводу цифры 8, а че там бит присутствия сегмента = false?
                                      Barbosman, у зубкова действительно есть пример использования DMPI, НО DMPI это интерфейс, обеспечиваемый либо BIOSом либо ОС, НЕ ПРОЦЕССОРОМ.

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

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

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

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

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


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

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

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

                                          Добавлено
                                          Хотел тебе файл один скинуть,но на форум он не хочет загружаться, видите ли формат *.rar его не устраивает! :(
                                            Lex_Onix, Для личной переписки существует PM ;)
                                            Правила, п.9
                                            Цитата
                                            видите ли формат *.rar его не устраивает!
                                            всего скорее не формат а размер

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

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


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

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

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

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

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

                                                  dw 0ffffh,0ffh,9200h,8fh
                                                    http://www.df.lth.se/~john_e/gems/gem0022.html

                                                    ExpandedWrap disabled
                                                      ;-------------------------------------------------------------------------
                                                      ;-------------------------------------------------------------------------
                                                      .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
                                                      ;--------------------------------------------------------------------------

                                                    ExpandedWrap disabled
                                                      ;-------------------------------------------------------------------------
                                                      .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
                                                    ExpandedWrap disabled
                                                      @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
                                                      bomz и чего?
                                                        [attach=#0][/attach]Написал загрузчик MBR с нереальным режимом для HDD, проверил на 3-х компъютерах, на ноутбуке, на VMWARE, везде работает.
                                                        Правда это короткий вариант, работает только с 1- partischen.
                                                        После загрузки DOS, необходимо открыть адресную линию А20, или запустить HIMEM.SYS (я использую вместо HIMEM.SYS XMRG.SYS).
                                                        На днях попробую написать для дискеты.
                                                        Прикреплённый файлПрикреплённый файлMBR00.ASM (1,88 Кбайт, скачиваний: 230)
                                                          andr00, и чтоооо?

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

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

                                                          partiton.
                                                            Profi, ничем
                                                              Эксперементируя с нереальным режимом, столкнулся с неприятным моментом.
                                                              Программы, которые используют 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. Сохраняем изменения.

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

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

                                                                  Я так и не выяснил, что лутше. Установить драйвер на своем коммъютере, (можно попасть в просак на чужом компъютере),или вписывать код перехода
                                                                  в UNREAL в каждой программе (что иногда накладно). Пока, для себя я разработал драйвер KEY_R8.SYS (аналог KEYRUS), и в его тело включил
                                                                  обработчик исключения 0DH, переводящий в режим UNREAL. Если кому интересно, могу поделится алгоритмом перехвата исключения 0DH и установки UNREAL.
                                                                    2-ой вариант будет сильно напрягать всех, начиная с антивирусов. 1-ый проблематичен в связи с необходимостью отделять исключение от IRQ.
                                                                    Я бы упомянул 3-ий вариант: т.к. подавляющее большинство "нехороших" программ используют protect mode, а тот в свою очередь реализован в них через стандартизированные интерфейсы DPMI (или VCPI, но тут я затрудняюсь дать оценку трудоёмкости решения, скорее, оно будет гораздо проще... но я уже плоховато помню нюансы), то имеет смысл универсально решить проблему посредством собственного DPMI-хоста. И это не так сложно как может показаться. В составе QEMM есть готовый qdpmi.sys, который теоретически несложно отреверсить. К нему там прилагаются ещё управляющая консоль qdpmi.com и менеджер виртуальной памяти qdpmivm.ovl, но без них реверсинга, почти уверен, можно обойтись. Правда, боюсь, qdpmi.sys может быть завязан на сервисы самого QEMM...
                                                                      Зачем все это?
                                                                        Та ради фана, почему нет. А зачем в современном мире вообще ассемблер?
                                                                          Отделить исключение от IRQ не так уж сложно. Это показано в прикрепленном файле. Я в последнее время не веду контроль над IRQ. Ничего страшного если вместо исключения сработает IRQ, да и не нашел я прерываний 0DH в своем программном обеспечение.
                                                                          Прикреплённый файлПрикреплённый файлmasm.txt (743 байт, скачиваний: 173)
                                                                            Не факт. IRQ5 самое распространённое для звуковых карт, и оно не обязательно будет аппаратным. Я встречал эмуляторы SB, вызывающих его программно.
                                                                              Я в настоящее время не могу проверить это со звуковой картой с IRQ5 из-за наличия отсутствия таковой. Возможно контроль исключения 0DH приведет к тормозу работы звуковой карты (компьютера).

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

                                                                              Добавлено
                                                                              Да, кстати для проверки работы режима UNREAL на виртуальной машине, нужно удостоверится, что сама среда не находится в режиме REAL.
                                                                              Я однажды накололся на этом. Установил режим UNREAL, все прекрасно работает. Но на реальной машине зависает. Проверил.
                                                                              Оказывается, что VMware (не все версии) изначально запускается уже в режиме UNREAL.
                                                                                Обнаружил небольшую ошибку в большинстве программ, которые применяют тежим 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.

                                                                                Проблем на порядок становится меньше.
                                                                                  andr00, хочешь сказать, что когда HIMEM выходит в PM (для предоставления блока памяти проге), он использует текущий программный стек, в котором старшая половина ESP может быть непустой, и ем самым он разрушит данные, находящиеся где-то далеко?
                                                                                    Мне не ясно зачем вообще трогать для этих целей SS.
                                                                                    Сообщение отредактировано: shm -
                                                                                      shm, а вообще да. Если в SS ничего не писать, там останется то, что и было раньше (вместе с теневой частью).
                                                                                        Драйвер 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-битной разрядности.
                                                                                          Цитата andr00 @
                                                                                          32-битная разрядность может сыграть плохую шутку, и компъютер зависнет.
                                                                                          Ты же говорил про стек.
                                                                                          Какую плохую шутку может сыграть 32-битная разрядность данных?
                                                                                            Возможно я ошибаюсь. Вычитал где то,что установка ( в DS и ES ) селектора данных в 32-битной разрядности (без установки 32-го кода), влияет только на регистр ESP.
                                                                                            Довольно много программ, для собственных нужд, устанавливают именно 32-бит селектор данных (но не всегда сбрасывают). Возможно они и трогают регистр SS.
                                                                                            Но, повторяю, когда я на постоянной основе пытаюсь установить 32-бит и лимитом 4-Г.( в DS и ES ), то компьютер начинает иногда глючить.
                                                                                            С 16-бит. разрядностью и лимитом 4-Г., пока с глюками не встречался.
                                                                                              Ноги, видимо, отсюда растут:
                                                                                              user posted image
                                                                                              Прикреплённый файлПрикреплённый файл2017_10_17_17_30_56.png (46,85 Кбайт, скачиваний: 633)
                                                                                                Похоже вы правы. Только я это читал уже в переводе, и там не упоминалось о сегменте SS.
                                                                                                Я никогда не трогаю лимит сегмента SS. Но, 32-бит (в DS, ES) иногда глючат.

                                                                                                Добавлено
                                                                                                Похоже разобрался. Я использую программу для просмотра файловой системы NTFS - NDOS.EXE. Исходная программа периодически переводит в режим 64К.
                                                                                                Я исправил это, нашел дескриптор, отвечающий за это и перенастроил его на 4-Гиг. Но, т.к. я пользуюсь MASM 6.11 (оказывается он тоже переводит в режим 64К)
                                                                                                возникают кратковременные моменты, когда процессор находится в режиме RM-64K.
                                                                                                  Прошло довольно много времени, как я эхперементировал с режимом UNRAL. Работает отлично. Сделал несколько нужных программ.
                                                                                                  Решил замахнутся UNRAL(ом) на WINDOWS. В итоге большой облом. Даже если создать RAM диск с помощью UNRAL в среде DOS и
                                                                                                  потом загрузить WINDOWS-98, то или WINDOWS-98 не грузится, или RAM диск исчезает. Выходом из этого положения остались
                                                                                                  функции HIMEM.SYS (или XMRG.SYS). В итоге решил, компромисное решение будет в использование режима UNRAL в среде DOS для
                                                                                                  создания программы (драйвера), а при переходе в WINDOWS-98, использовать функции HIMEM.SYS.
                                                                                                    Цитата andr00 @
                                                                                                    UNRAL(ом) на WINDOWS

                                                                                                    Windows работает в полноценном pm32. Зачем там нужна эмуляция 16-битного режима с забаганными сегментными регистрами я даже представить не могу.
                                                                                                    Сообщение отредактировано: shm -
                                                                                                      Интересно, а можно ли использовать режим UNRAL в DOSBOX(е)?
                                                                                                        andr00, попробуй, потом расскажешь :)
                                                                                                          Ставлю 8 из 10, что не получится. Ибо условия запуска "DOS"-режима в над-ОС всё же пишутся=защищаются в этой самой над-ОС, которая не позволит (не должна позволить) изнутри "поломать" её для таких экспериментов.
                                                                                                            Попробовал, получилось. Но в пределах 16 мб, котоые выделяет DosBox.

                                                                                                            Добавлено
                                                                                                            Попробовал, получилось. Но в пределах 16 мб, котоые выделяет DosBox. Параметр memsize расширяет до 64 мб
                                                                                                              Я как-то смотрел его сырцы. Сложилось впечатление, что он пределы сегментов вообще не проверяет. По крайней мере не нашёл кода, но нашёл коммент типа "TODO: check limit"
                                                                                                                К стати, помимо того что в DosBox можно использовать режим UNREAL, можно задействовать и UMB, с помощью HIRAM.EXE. Причем потрясающе, он выделил мне более 80 Кб UMB. В то время UMBPCI.SYS не работает в DosBox.
                                                                                                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                                                                                                0 пользователей:


                                                                                                                Рейтинг@Mail.ru
                                                                                                                [ Script execution time: 0,1670 ]   [ 23 queries used ]   [ Generated: 28.03.24, 09:13 GMT ]