pusha
mov dx,19
mov es:di,offset RootDir
ReadRoot1:
push dx
push di
push es
Call ReadSect
pop es
pop di
pop dx
add di,512
inc dx
cmp dx,33
jne ReadRoot1
popa
ret
Вопросы по созданию ос
http://forum.s-c.ru/viewtopic.php?t=65586 или http://forum.s-c.ru/web/viewtopic.php?t=65586 . Я очень хочу написать ос. Язык программирования - fasm, процессор - Пентиум2, память - 16Мбайт<x<4Гбайт. Ответьте на вопросы, пожалуйста, и дайте ссылки на какие-нибудь спецификации/документации, почитав этот раздел, я понял, что о защищенном режиме знаю только очень поверхностно.
Я знаю, что вы будете меня материть, в общем, прочтите:
[QUOTE=Yar4]...почитав этот раздел, я понял, что о защищенном режиме знаю только очень поверхностно.[/QUOTE]В таком случае ты не сможешь написать современную систему.
Я это понимаю, дос я хоть завтра написать могу:) поэтому прошу дать несколько ссылок на оффлайн книги по пм, я сегодня нашёл онлайн статью, но без нета на компе её не удобно смотреть. Я понимаю, что это будет держаться только на моём энтузиазме, но времени ведь у меня предостаточно.
спецификации/документации -
http://www.intel.com/
ftp://download.intel.com/
Пентиум2 - это P6 или i686. Не за цикливайся на одном процессоре. Все x86 начиная с i486 и заканчивая Pentium4, не сильно отличаются.
Ладно давай по порядку. Документацию про защищенный режим процессора полно всякой. Но я бы посоветовал взять интеловскую.
"IA-32 Intel® Architecture
Software Developer’s
Manual
Volume 3:
System Programming Guide"
Здесь расписано на русском.
http://www.wasm.ru/publist.php?list=24
Библиотека системного программиста Александр Фролов, Григорий Фролов том 6 "Защищенный режим процессоров Intel 80286/80386/80486"
Ссылку не помню. Но там не только расписан защищенный режим, но и даны примеры.
и тд.
Здесь лежит куча всяких спецификаций http://www.osdever.net/cottontail/
Если будут вопросы спрашивай. И еще, пока не начнешь писать под защищенный режим никогда его не выучишь.
Я бы посоветовал присоединиться к какому либо проекту. А то нас ОС мейкеров развилось. Около сотни, а проектов пару десятков.
Pavia, спасибо огромное! Качать трубой не буду, подожду до августа. Пока буду ту онлайновую читать :) может потренируюсь дос написать :) самое сложное, я так понимаю - это дрова?
Phantom-84, тоже огромное спасибо за ссылки.
Yar4
А какие дрова? На многое железо есть доки, в исходниках линукса можно найти код для разного железа, даже на те, что нет док. Я пока до дров не добрался. Некоторые берут драйвера от линукса, а они бывают и закрытые. Тем самым не достатка в драйверах не должно быть.
Одно скажу в виндоусе систему драйверов делал не человек.
А если по существу. То Винчестер, Дисководы, Сетевая, Модем, Клава, Мышь. Это стандартное оборудование на него существуют доки и можно самому написать драйвера. Со Звуковой и Видео картой могут быть проблемы.
Если говорить про Видео карту то тут проблема в том что разрешения и цвета, которые устанавливаются в виндоусе. Можно выставить через прерывания БИОС используя VESA. А это можно сделать только в реальном режиме. Есть другой путь писать драйвер. Тут мой совет, если будешь писать драйвер взять исходники Линукса.
[QUOTE=Pavia]Можно выставить через прерывания БИОС используя VESA. А это можно сделать только в реальном режиме.[/QUOTE]Так ли это?
Можно воспользоваться расширениям БИОСа "_32_" для вызова функций БИОСа из-за защищенного режима.
Или одного из расширений VESA, а именно "PMID" который позволяет вызывать функции Весы из 16 или 32 разрядного защищенного режима.
Оба расширение не обязаны присутствовать в БИОСЕ.
Вот это другое дело. Ты в курсе, что я ответил на твое письмо?..
А нельзяли для драйвера win32 эмуловать? тоесть - своя ос, свои функции и всё такое, а вот драйверам устройств давать понять что они находяться в среде win32? ведь не драйвер вызывает ф-ции ос - а наоборот... я себе так предствалял решение проблемы с драйверами...
сюда.
Exile, идея хорошая, только вот ее не так просто реализовать, впрочем я об этом уже давно думаю. Если есть более конкретные идеи, добро пожаловать
Вы замучаетесь писать защищенный режим. я 4 месяца атылся так и не смог стабильно сделать всю таблицу.
http://zolotov.h14.ru/doc/os, там правда пример на nasm, но разница невилика можно и дописать. сам юзал пример оттуда. но полностью на ассемблере писать не посоветовал бы, это гемморой жуткий. лучше перейти на C.
я бы ещё посоветовал
P.S. У меня есть своя ось и представь, она спокойно работает в защищенном режиме!
[QUOTE=~ArchimeD~]...но полностью на ассемблере писать не посоветовал бы, это гемморой жуткий. лучше перейти на C.[/QUOTE]Кому как! Лично у меня все системные компоненты написаны на fasm'е!
Ну про системные я не говорю, у меня у самого очень много чего на nasmе написано, а например функцию вроде printf, когда хочется и курсор отобразить, и форматирование сделать и с клавиатуры ввод делать на мой взгляд лучше на с написать. ассемблер конечно это хорошо - быстро и компактно, но большие приложения на нем писать - много кода, трудно порой вспоминать, что куда запихнуть надо, и что куда запихал.
Я за асм! =)
А printf тоже можно написать...
Зайдите, пожалуйста, по ссылке в начале, прочитайте (хотя бы конец, в начале я понятия не имел, что такое ассемблер) и скажите всё, что об этом думаете.
Где можно взять доки по работе с FAT12?
А то яндух и гугля мугля что то не то находят, либо документы не полные, либо непонятно написанны...
Вообще меня интересует, как в FAT12 читать файлы и каталоги, а после, если нужно запускать найденные файлы на исполнение.
Чтобы запускать файлы, нужно знать структуру исполняемого файла. Ты файлы какого формата собираешься запускать?
Вообщем для начала надо научиться хоть COM-файлы запускать, а после дальше лезть...
Вот ящик: [email]Exs42@yandex.ru[/email]
Ты сказал, что FAT12 неплохо знаешь, если не лень, вышли мне на мыло или прямо здесь выложи, алгоритм или исходники, как ты файлы ищешь, создаёшь...
А то я что то в 3-х соснах заблудился...:)
вот ссылка (там все просто, формат-то по своей сути элементарный).
Сейчас отправлю пару архивов: большой - это документация по FAT от Microsoft, небольшой - подборка из трех web-страниц по соответств. тематике. Про загрузку com-файлов я уже здесь когда-то писал:
Может я не в ту тему влез, но мне не охота создавать по этому незначительному поводу новую тему... Может кто-нибудь знает где достать подробную документацию по Windows API на русском языке (английские доки уже замаяло читать)
Да тема несколько не та...
Вот посмотри здесь:http://develab.narod.ru/api/index0.htm
Phantom-84 ещё раз спасибо!
Пожалуйста подскажите формулу для нахождения обсолютного сектора в FAT12.
Это безусловно интересно, но в этом деле одному далеко не уехать..
Есть проект http://www.reactos.org/
Там пишеться замена виндов, open source, free,
совместимость с программами под винды и драйверами.
У них уже есть версия 0.3.0 (15 метров всего),
даже некоторые программы там нормально запускаются.
Exs42, я же тебе подробную документацию выслал! Там есть все формулы! Но если тебе трудно открыть файл и найти в нем нужное описание, то давай попробуем сами подумать, как можно вычислить "номер абсолютного сектора". Я тебе в общем набрасаю расклад, чтобы не было аналогичных вопросов по другим форматам FAT, а ты уже адаптируешь к FAT12...
Короче, линейный номер первого сектора для кластера с номером N равен сумме, составленной из след. составляющих:
- количество "скрытых" секторов или, что тоже самое, номеру первого сектора раздела; это для разделов жесткого диска; для флоппика с FAT12 равно нулю;
- количество резервных секторов, т.е. секторов, занимаемых boot-блоком; для FAT12 обычно равно 1 - один boot-сектор;
- количество секторов, занимаемых FAT'ами, - произведение количества FAT'ов на размер одного FAT'а, измеряемый в секторах;
- количество секторов, занимаемых корневым каталогом диска, - вычисляем так: (максимально возможное количество файловых записей в корневом каталоге диска умножить на 32 плюс 511)/512;
-непосредственно смещение сектора в области файловых данных - вычисляем так: (N-2) умножить на количество секторов в кластере.
Мне не трудно открыть файл, но на винте их стока... :)
Просто я в английском не очень шарю. Стараюсь его выучить.
Я знаю что в твоей ОС идет проверка типа компьютера читаешь по адресу F000:FFFE
Так вот тут вопрос как этот код учавствует в дальнейшем?
Просто тут изучаю как Фролов "Библиотека системного программиста\Том 1" определяет число дисков и как то странно он это делает. Хотя по идее должно быть одинаково что для XT, то и для AT.
НА эту тему много сказано в старых книгах/справочниках по железу. Советую Журдена, Нортона почитать или отыскать неоправданно забытый многими Help! по железу.
1.1.5 Определение числа и типа дисковых накопителей.
Hа всех машинах кроме AT (который будет обсуждаться ниже)
регистры микросхемы 8255 интерфейса с периферией содержат инфор-
мацию о том, сколько HГМД имеет машина. В примерах [1.1.1] пока-
зано как получить эту информацию. Информация определяющая тип
диска содержится в таблице размещения файлов (FAT) диска, которая
следит за использованием дискового пространства. Первый байт FAT
содержит один из следующих кодов:
Kод Тип диска
FF двухсторонний, 8 секторов
FE односторонний, 8 секторов
FD двухсторонний, 9 секторов
FC односторонний, 9 секторов
F9 двухсторонний, 15 секторов
F8 фиксированный диск
Сама таблица размещение файлов не является файлом. Она может
быть считана при помощи функций DOS или BIOS непосредственно чи-
тающих определенные сектора диска. В пункте [5.1.1] содержится
вся информация необходимая для нахождения и чтения FAT. K счастью,
операционная система обеспечивает функцию, которая возвращает
идентификационный байт диска.
Данные BIOS не показывают число жестких дисков в системе, так
как переключатели предназначены только для гибких дисков. Однако
Вы можете использовать указанную функцию операционной системы для
поиска накопителей. Она возвращает значение 0CDH, вместо одного
из упомянутых кодов, когда накопители отсутствуют. Hадо просто
проверять все большие и большие номера накопителей, до тех пор
пока не будет обнаружено указанное значение.
AT уникален в том смысле, что его информация о конфигурации
говорит какой тип накопителя используется. Эту информацию можно
получить из порта с адресом 71H, предварительно послав номер
регистра в порт 70H. Для HГМД номер регистра равен 10H. Информа-
ция о первом накопителе содержится в битах 7-4, а о втором - в
битах 3-0. В обоих случаях цепочка битов 0000 говорит об отсутст-
вии накопителя, 0001 - о двухстороннем накопителе с плотностью 48
дорожек на дюйм, а 0010 - о накопителе большой емкости (96 доро-
жек на дюйм). Информация о фиксированном диске содержится в ре-
гистре 12H. И снова биты 7-4 и 3-0 соответствуют первому и второ-
му накопителям. 0000 указывает на отсутствие накопителя. Другие
15 возможных значений описывают емкость и конструкцию накопителя.
Эти коды сложные; если Вам по какой-то причине потребуется эта
информация, обратитесь к техническому руководству по AT.
Средний уровень.
Функция 1CH прерывания 21H возвращает информацию об указанном
накопителе. Поместите номер накопителя в DL, причем 0 = накопи-
тель по умолчанию, 1 = A, и т.д. При возвращении DX содержит
число кластеров в FAT, AL - число секторов в кластере, а CX -
число байтов в секторе. DS:BX указывает на байт, содержащий код
идентификации диска из FAT, согласно приведенной таблице. В сле-
дующем примере определяется тип накопителя A:
;---определение типа диска
MOV AH,1CH ;функция MS DOS
MOV DL,1 ;выбор накопителя A
INT 21H ;получение информации
MOV DL,[BX] ;получение типа накопителя
CMP DL,0FDH ;двухсторонний, 9 секторов?
JE DBL_9 ;и т.д.
BIOS AT имеет функцию, сообщающую общие параметры накопителей.
Это функция 8 прерывания 13H. Она возвращает число накопителей в
DL, максимальное число сторон накопителя в DH, максимальное число
секторов в CL и дорожек в CH, а код статуса ошибки накопителя в
AH (см. пункт [5.4.8]).
Другая функция BIOS AT возвращает тип накопителя. Это функция
15H прерывания 13H, которая требует номера накопителя в DL. В AH
возвращается код, причем 0 = нет накопителя, 1 = дискета без
обнаружения изменений, 2 = дискета с обнаружением изменений и 3 =
фиксированный диск. В случае фиксированного диска в CX:DX возвра-
щается число секторов по 512 байт.
Извиняюсь за такое оформление текста. Скопировал, как есть :D
1.1.1 Доступ к микросхеме интерфейса с периферией 8255.
Микросхема интерфейса с периферией Intel 8255 - лучшее место,
с которого надо начинать, чтобы получить информацию об имеющемся
оборудовании. Эта микросхема предназначена для многих целей. Она
сообщает об установке переключателей на системной плате. Она
принимает для компьютера ввод с клавиатуры. Она управляет рядом
периферийных устройств, включая микросхему таймера 8253. Из машин
семейства IBM PC только AT не использует микросхему 8255; он
хранит информацию об оборудовании вместе с часами реального вре-
мени в специальной микросхеме с независимым питанием. Однако AT
использует те же адреса портов, что и 8255, для работы с клавиа-
турой и управления микросхемой таймера.
Микросхема 8255 имеет три однобайтных регистра, называемых от
порта A до порта C. Адреса этих портов от 60H до 62H сответствен-
но. Все три порта можно читать, но писать можно только в порт B.
Для PC, установка бита 7 порта B в 1 изменяет информацию, содер-
жащуюся в порте A. Аналогично для PC установка бита 2 определяет
содержимое четырех младших битов порта C, а установка бита 3
делает то же самое для XT. Содержимое этих регистров следующее:
Порт A (60H)
когда в порте B бит 7=0
биты 0-7 PC,XT,PCjr,AT: 8-битные скан-коды с клавиатуры
когда в порте B бит 7=1 для PC
бит 0 PC: 0 = нет накопителей на дискетах
1 PC: не используется
2-3 PC: число банков памяти на системной плате
4-5 PC: тип дисплея (11 = монохромный,
10 = цветной 80*25, 01 = цветной 40*25)
6-7 PC: число накопителей на дискетах
Порт B (61H)
бит 0 PC,XT,PCjr: управляет каналом 2 таймера 8253
1 PC,XT,PCjr: вывод на динамик
2 PC: выбор содержимого порта C
PCjr: 1 = символьный режим, 0 = графический
3 PC,PCjr: 1 = кассетный мотор выключен
XT: выбор содержимого порта C
4 PC,XT: 0 = разрешение ОЗУ
PCjr: 1 = запрет динамика и мотора кассеты
5 PC,XT: 0 = разрешение ошибок щелей расширения
6 PC,XT: 1 = разрешение часов клавиатуры
5-6 PCjr: выбор динамика (00 = 8253, 01 = кассета,
10 = ввод/вывод, 11 = микросхема 76496)
7 PC: выбор содержимого порта A
PC,XT: подтверждение клавиатуры
Порт C (62H)
когда в порте B бит 2=1 для PC или бит 3=1 для XT
биты 0-3 PC: нижняя половина переключателя 2 конфи-
гурации (ОЗУ на плате расширения)
0 PCjr: 1 = введенный символ потерян
1 XT: 1 = есть мат. сопроцессор
PCjr: есть карта модема
2 PCjr: есть карта HГМД
2-3 XT: число банков памяти на системной плате
3 PCjr: 0 = 128K памяти
4 PC,PCjr: ввод с кассеты
XT: не используется
5 PC,XT,PCjr: выход канала 2 8253
6 PC,XT: 1 = проверка ошибок щелей расширения
PCjr: 1 = данные с клавиатуры
7 PC,XT: 1 = контроль ошибок четности
PCjr: 0 = кабель клавиатуры подсоединен
когда в порте B бит 2=0 для PC или бит 3=0 для XT
биты 0-3 PC: верхняя половина переключателя 2 конфи-
гурации (не используется)
0-1 XT: тип дисплея (11 = монохромный,
10 = цветной 80*25, 01 = цветной 40*25)
2-3 XT: число накопителей HГМД (00 = 1 и т.д.)
4-7 PC,XT: то же, что и с установленными битами
Отметим, что 0 в одном из битов регистра соответствует уста-
новке переключателя "off".
Доки древние... там даже не упоминается современный 1,44-мегабайтный флоппик (0F0h) :)
Меня просто смутило что один и тотже бит (40h:10h бит 0/ CMOS 14h тоже самое) в разных системах AT говорит о присудствие FDD. А в XT HDD по Фролову. Хотя в тех доках что я посмотрел либы отсутствовало лмбо говорилось о FDD. Так что я остановился на том что этот бит сигналезирует присутствие FDD.
Где-то здесь в топиках есть на тему защищ.(или реального) режима
В AT все просто! Либо ты непосредственно получаешь инфу из CMOS, либо (если ты еще в реальном режиме) используешь обращения к BIOS и BIOS Data Area для получения все той же инфы...
Содержимое ячейки BDA 40h:10h во многом перекликается с содержимым ячейки CMOS 14h, но в принципе это не одно и тоже. Могу точно сказать, что когда в CMOS младший бит ячейки 14h установлен, в процессе начального тестирования не было найдено ни одного флоппи-дисковода!
Почему не читается рут когда комп грузится с дискеты?
Вот чтение рута:
Код:
Сегментные регистры при загрузке ядра выглядят так:
Код:
mov ax,cs
mov es,ax
mov ds,ax
mov es,ax
mov ds,ax
А область данных выглядит так:
Код:
Mem_FAT db 9*512 dup(?)
RootDir db 15*512 dup(?)
FileDir db 13 dup(?)
Command_line db 255 dup (?)
RootDir db 15*512 dup(?)
FileDir db 13 dup(?)
Command_line db 255 dup (?)
Если грузимся не с дискеты,а загружаем DOS - всё прекрасно работает.