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

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

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

Так что добро пожаловать и приятного вам общения!!! ;)
 
Модераторы: Jin X, Qraizer
Страницы: (4) [1] 2 3 ... Последняя » все  ( Перейти к последнему сообщению )  
> Переход в нереальный режим, загрузчик
    Привет всем!!! При написании загрузчика, для своей ОС, я столкнулся вот с такой проблемой: при переводе 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 ;)
        user posted image
          Да... Более глупого ответа, на поставленный мной вопрос, я не видел... :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 перед переходом в защищенный режим. :)
            http://www.xlevel.ru
              Привет, 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
                    http://www.xlevel.ru
                      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
                            Windows Update рулит!
                              Evgeniy
                              У меня на VMWARE все работает. Один не достаток нужно нажымать выкл/вкл, а то перезагрузка в случии ошибки не помагает.
                              ProgramMan
                              А как в Boshs с дебугером работать? А то я пробовал ставить брэк поинты, а он их не ловит.
                              Правильный обед должен состоять из 5 блюд приготовленных из 33 ингредиентов.
                                Цитата
                                НА VMWARE переход в защищённый режим не работает

                                Если бы действительно так было, на данной виртуальной машине не работати бы ни Windows, ни FreeBSD. Но все замечательно работает. Так вот, прежде чем винить качественный и хорошо отлаженный продукт, имеет смысл удостовериться, у самого то руки не кривые?!
                                P.S. Это я так, к слову.
                                http://www.xlevel.ru
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script Execution time: 0,1919 ]   [ 17 queries used ]   [ Generated: 24.04.18, 06:25 GMT ]