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

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

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

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

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

Обновлять

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


person smwikipedia    schedule 02.09.2010    source источник
comment
много вопросов, всего один вопрос. а также я не вижу ничего общего с C или C ++ как языками.   -  person Jens Gustedt    schedule 10.09.2010
comment
Привет, Йенс. Я помечу его c / c ++ просто для большего внимания. Сейчас снимаю. Приносим извинения за неправильную маркировку.   -  person smwikipedia    schedule 10.09.2010


Ответы (9)


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

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

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

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

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

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

person Jerry Coffin    schedule 02.09.2010

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

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

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

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

person Ben Voigt    schedule 02.09.2010
comment
Я не думаю, что BIOS (который представляет собой 16-битный интерфейс) вообще будет работать в 32-битном режиме, даже в кольце 0. - person Greg Hewgill; 02.09.2010
comment
К сожалению, для получения патента вам не обязательно иметь продукт. Я не говорю, что Compaq этого не сделала, просто нет необходимости получать патент. - person paxdiablo; 17.09.2010

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

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

person Ana Betts    schedule 02.09.2010

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

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

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

person Neil Dickson    schedule 17.09.2010

V86: да, но если вы настраиваете ОС:

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

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

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

Это сложно найти код.

-; изменить для 32bit ??

;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!
person Richard Jasmin    schedule 27.01.2013

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

person R.. GitHub STOP HELPING ICE    schedule 02.09.2010

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

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

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

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

person Brandon Rhodes    schedule 10.09.2010
comment
Привет, Брэндон. Вы дали мне отличную подсказку !! Я посмотрю на тот сайт. Может быть, это избавит меня от множества различных драйверов устройств. Я сосредоточен на структуре ОС и некоторых основных частях, таких как процесс, планирование, управление памятью, формат файла, файловая система и т. Д. Не на драйверы устройств, по крайней мере, на данный момент. - person smwikipedia; 11.09.2010
comment
Надеюсь, вы обнаружите, что проект все еще можно компилировать! Я бы хотел, чтобы она продолжала поддерживаться, так как возможность запускать программу C на голом оборудовании была своего рода крутой, если вы хотели получить старую машину и запрограммировать ее, чтобы просто выполнять какую-то одну задачу очень быстро, не имея операционная система в пути. - person Brandon Rhodes; 11.09.2010
comment
Это было довольно аккуратно; вы могли бы скомпилировать Hello, world. в C против OSKit и получите ОС, которую вы могли бы загрузить, которая вышла и напечатала Hello, world. а затем остановился. :-) - и сестра Линуса стояла там и просто сказала Хорошо, потому что Линус не мог объяснить ей, что достижение не то, что было показано, а то, как он это сделал. - person Windows programmer; 17.09.2010

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

person Alexey Frunze    schedule 29.11.2011

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

person Ignacio Vazquez-Abrams    schedule 02.09.2010