Режим реального режима BIOS и защищенный режим

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

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

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

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

Update

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

Ответ 1

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

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

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

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

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

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

Ответ 2

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

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

Ответ 3

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

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

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

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

Ответ 4

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

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

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

Ответ 5

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

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

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

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

Ответ 6

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

Ответ 7

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

попробуйте это (рассчитано на длительный режим, но должно работать. Я не тестировал этот YET, я не вижу причин, по которым он еще не работает. Искажение - это не nasm, его ld.)

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!

Ответ 8

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

Ответ 9

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