Реальный режим BIOS и защищенный режим - PullRequest
10 голосов
/ 02 сентября 2010

Я провожу эксперимент с ОС.До сих пор весь мой код использовал прерывание BIOS реального режима для управления жестким диском и дискетой.Но как только мой код активировал защищенный режим ЦП, все процедуры обслуживания прерываний BIOS реального режима станут недоступны.Как можно IR / W на жестком диске и дискете? Нужно ли мне сейчас делать аппаратные драйверы? Как начать?Является ли это одной из причин того, что ОС так трудно разрабатывать?

Я знаю, что все оборудование контролируется чтением и записью в определенные контрольные или регистры данных.Например, я знаю, что регистры командных блоков жесткого диска находятся в диапазоне от 0x1F0 до 0x1F7. Но мне интересно, совпадают ли адреса регистров такого большого количества разных аппаратных средств на платформе ПК?Или я должен обнаружить это, прежде чем использовать их?Как их обнаружить ??

Поскольку я не уверен в том, как записывать дискету или жесткий диск в защищенном режиме, я должен использовать прерывание BIOS для загрузки всего необходимого файла ядра с дискеты.в память на данный момент.Но что я могу сделать, если мой файл ядра превышает ограничение в 1М для реального режима?

Для любых ответов я выражаю глубокую признательность.

Обновление

Я смутно припоминаю, что есть способ сначала переключить защищенный режим, а затем снова переключиться в реальный режим.И тогда мы могли бы использовать процедуру BIOS в защищенном режиме.Может я не правильно помню.Кто-то помнил это правильно?

Ответы [ 9 ]

5 голосов
/ 02 сентября 2010

Хотя можно переключаться между защищенным режимом и реальным режимом, почти наверняка не , что вы хотели бы сделать.Вот как все было сделано на 286 (довольно неуклюже, так как он намеренно не поддерживал переключение из режима защиты обратно в реальный режим и т.д.).Однако, начиная с 386, они добавили режим V86, который может запускаться как задача в защищенном режиме.

Если вы хотите использовать BIOS из защищенного режима, это почти наверняка способ сделать что-то.Вы можете в основном создать задачу V86, переключиться на нее, чтобы использовать BIOS, а затем переключиться обратно на другую задачу для выполнения кода защищенного режима.

Если вы хотите поиграть с этим, вы можете взглянуть на DJGPP , который является расширителем DOS (в основном, программа, как я только что описал, чтобы обрабатывать переключение в / из задачи V86 по мере необходимости для обработки дискового ввода-вывода и тому подобное) вместе с портомдовольно старая версия gcc, так что вы можете написать код, который на нем работает.

Коммерческий рынок для расширителей DOS в настоящее время практически мертв, поэтому по крайней мере один ранее коммерческий расширитель DOS ( HX )теперь доступно как открытый исходный код.Если вы собираетесь поиграть с этим, вы, вероятно, захотите использовать его с компилятором OpenWatcom .

Редактировать: насколько вы читаете файл размером более 1 МБ(например), это просто, но неуклюже: считывайте данные порциями, и когда вы закончите чтение, вы либо переназначаете память, либо копируете содержимое, чтобы получить то, что вы прочитали, туда, где вы действительно хотите, затемпрочитайте другой фрагмент.

Что касается разговоров с аппаратным обеспечением: многое зависит от того, хотите ли вы что-то, что работает в некоторой степени, или хотите ли вы в полной мере воспользоваться имеющимся оборудованием.Простое использование базовых портов IDE позволит вам общаться практически с любым жестким диском, который не является действительно древним - но получить максимальную отдачу от аппаратного обеспечения - это немного больше работы.Диски IDE / ATAPI использовали около полудюжины различных режимов DMA, каждый из которых должен быть настроен немного по-своему.Многие из них достаточно взрослые, и вам, вероятно, наплевать на них, поэтому вы можете напрямую поддерживать только пару новейших версий, а во всем остальном использовать базовые (не DMA) передачи.

2 голосов
/ 02 сентября 2010

Похоже, что ваш вопрос не в том, как разговаривать с оборудованием (проблема с драйверами устройств), потому что вам достаточно интерфейсов BIOS.

Скорее, вам необходимо знать, как обмениваться данными между кольцом защищенного режима 0 (который имеет неограниченный доступ к вызовам BIOS и всем другим привилегированным инструкциям) и кольцом защищенного режима 3, где обычно находится код приложения. Это системный вызов . Практически все архитектуры запускают обработчики прерываний в привилегированном режиме, поэтому программные прерывания являются одним из способов реализации системных вызовов, x86 также предоставляет инструкцию syscall, оптимизированную для этой цели.

Конечно, вы можете просто запустить все в кольце 0 с моделью плоской памяти, где вы можете получить доступ ко всей памяти напрямую.

Ring 0 / ring 3 - это терминология x86, но все системы с MPU поддерживают некоторую концепцию привилегированного режима, который обеспечивает доступ к памяти по физическому адресу (а для разделенных архитектур ввода-вывода памяти - доступ ко всем I / O пробел).

1 голос
/ 27 января 2013

V86: да, путь, но при настройке ОС:

попробуйте это (разработано для длительного режима, но должно работать. Я еще не проверял это ДА, я не вижу причин, пока это не будет работать.

LD H8s 16-битные ссылки ELF / aout. Это стандартная загрузка из GRUB.

Я знаю, что 32-битный CS выключен, мне нужно перепроверить его местоположение. В противном случае это выглядит хорошо.

Трудно найти код.

- ; изменить для 32-разрядных ??

;this code is placed somewhere after 10000h
;-----we're in LONG MODE-----
  mov          dword [.stckptr], esp   ;first of all save stack
  sgdt         [.gdtv32]               ;save your gdt pointer
  lgdt         [.gdtv16]               ;load a new one
  sidt         [.idt32]                ;save your idt pointer
  lidt         [.idt16]                ;load real mode idt
  ;far jump in long mode is not possible, do a trick
  push         DESC_REAL
  push         @f-10000h               ;this is CS*10h, modify if needed!
  retfd
.stckptr:
  dd           0
  align        16
.gdtv32:
  dw           0
  dd           0
  align        16
.gdtv16:
  dw           .gdtend-.gdt-1
  dd           .gdt,0
  align        16
.gdt:
  dd           0,0                      ;null descriptor
DESC_DATA=8                                 ;descriptor in YOUR GDT (modify)
DESC_LONG=$-.gdt
  dd           00000000h,00209800h      ;32 bit  mode cs -MOD ME
DESC_REAL=$-.gdt
  dd           0000FFFFh,00009801h      ;16 bit real mode cs (modify base if needed!)
.gdtend:
  align        16
.idt32:
  dw           0
  dd           0
  align        16
.idt16:
  dw           3FFh
  dd           0
  USE16

;-----we're in COMPATIBLITY MODE-----
  ;disable paging and protmode at once
@@:   mov          eax, cr0
  and          eax, 7FFFFFFEh   
  mov          cr0, eax

  ;set up real mode segment registers and stack
  mov          esp, realmode_stack_top          ;modify it to your needs!
  xor          ax, ax
  mov          ds, ax
  mov          es, ax
  mov          fs, ax
  mov          gs, ax
  mov          ss, ax
  ;convert long mode rip to real mode cs:ip
  ;jmp CS:(pmode address)-CS*10h

  jmp          1000h:@f-10000h                  ;modify if needed!
;-----we're in REAL MODE-----
@@:   ;***********call some BIOS interrupt here**********
  mov          ax, 3
  int          10h


  ;switch back to long mode
  mov          eax, cr0
  or           eax, 80000001h
  mov          cr0, eax                         ;enable protmode and paging

  ;jmp         DESC_LONG:@f
  db           66h
  db           0EAh
  dd           @f
  dw           DESC_LONG
  USE32
;-----we're in protected MODE-----
@@:   lgdt         [cs:.gdtv32]                    ;restore gdt
  mov          ax, DESC_DATA                   ;read YOUR DATA descriptor to selectors
  mov          ds, ax
  mov          es, ax
  mov          fs, ax
  mov          gs, ax
  mov          ss, ax
  lidt         [.idt32]                        ;restore idt
  mov          rsp, qword [.stckptr]           ;restore stack
  ;must be a non rip-relative jump
  mov          eax, @f
  jmp          eax
@@:

  ;AS WE WERE!
1 голос
/ 17 сентября 2010

Если вы хотите, чтобы код считывал жесткий диск (или USB-ключ) из 32-разрядного режима, вы можете найти его в моем проекте ОС PwnOS . Он не поддерживает DMA или что-то еще, но основы работают. В частности, транк / Core / IO / ATA Driver.asm содержит код для чтения устройства ATA, например, жесткий диск (без магических чисел!: D)

Я решил не писать код для написания устройства, так как не хотел рисковать, но это очень похоже. Спецификации могут быть найдены при первом попадании в Google по запросу «cottontail os dev» (вам понадобится документ ATA / ATAPI-6), но им немного сложно следовать.

Если у вас есть еще вопросы по этому поводу, не стесняйтесь спрашивать. У меня также есть код для настройки в 64-битном режиме, а также редактор языка ассемблера, который я специально разработал для разработки ОС (поиск для Inventor IDE), поскольку он имеет встроенную сборку и компоновку из 16 -битный, 32-битный и 64-битный код по заданным адресам и смещениям файлов. Таким образом, вы можете сосредоточиться на интересующей вас части, а не на пуху.

1 голос
/ 02 сентября 2010

Если вы используете устаревшую IDE, все оборудование будет взаимодействовать одинаково - вам не нужно беспокоиться о написании пользовательских драйверов (хотя, если вы зайдете достаточно далеко, вы обнаружите, что, хотя все они говорят, что следуютта же самая спецификация, у них всех есть свои забавные причуды)

http://www.t13.org/ и http://www.t10.org - то, где вы найдете соответствующие спецификации - если вы чувствуете себя смелым, вы могли бы такженаписать драйвер SATA - вы найдете спецификацию AHCI на веб-сайте Intel (http://www.intel.com/technology/serialata/ahci.htm)

0 голосов
/ 29 ноября 2011

В защищенном режиме есть набор руководств здесь . Tut15 и tut16 эффективно запускают DOS и BIOS в режиме v86, все прерывания работают.

0 голосов
/ 10 сентября 2010

Проект теперь старый, но проект OSKit в Юте - который может все еще работать на современных машинах, поскольку другие операционные системы конца 1990-х все еще могут находить оперативную память и дисководы на современных ПК? - был стеком драйверов устройств, собранным отдельно от какой-либо конкретной операционной системы, чтобы вы могли разработать свое собственное ядро, просто написав код на Си.

Это было довольно аккуратно; Вы можете скомпилировать «Привет, мир». в C против OSKit и получить ОС, вы можете загрузить, который подошел и напечатал «Hello, world». а затем остановился. : -)

В любом случае, если вы действительно проводите «эксперимент с ОС», вы можете попробовать его - или, по крайней мере, использовать его код в качестве руководства по настройке и работе с некоторыми драйверами. Конечно, если вы действительно делаете меньше «эксперимента с ОС», а больше «изучаете неясные факты о x86», то это может сделать больше, чем вы хотите. : -)

http://www.cs.utah.edu/flux/oskit/

0 голосов
/ 02 сентября 2010

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

0 голосов
/ 02 сентября 2010

Устройства ATAPI используют одни и те же порты. Вы можете эмулировать DPMI, чтобы преодолеть ограничение в 1 МБ + 64 КБ, но да, изучите защищенный режим.

...