Режим реального режима 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, но в конце концов вам это понадобится.