Всем доброго дня! Хочу превратить виртуальный образ флоппи дискеты на 1.44 МБ не в одну большую программу, а разделить всё по файлам - то есть использовать файловую систему. На текущий момент я дуб дубом в вопросах, связанных с файловыми системами. Знаю только что существуют системы FAT, FAT16, FAT32, NTFS, ETC3, ETC4 ну и ещё какие-то слышал, но названия не помню. Вот и хочу спросить у Вас, стоит ли мне для лучшего понимания дела попытаться изобрести какую-то свою файловую систему, или же лучше воспользоваться существующей? Если воспользоваться существующей, то почему и какой? Если создавать свою, то всё равно же лучше ознакомиться с существующими? Ну и собственно некоторые тонкости. Программа BIOS попытается найти загрузчик. И вот она нашла 512 байт, куда передаёт управление. Нам из них будет доступно только 510 байт. Эти 510 байт могут много что сделать, но в основном их используют чтобы вывести какую-то информацию и чтобы загрузить последующие сектора. Вот мне и интересно, работать с файловой системой нужно начинать до перехода в защищённый режим или после? Вот у меня будет 1.44 МБ минус 512 байт первого сектора. Теперь мне нужно будет обучать процессор работе с файловой системой, чтобы найти файл где лежит переход в защищённый режим и так далее, или же мне нужно сначала подготовить процессор и потом уже обучать к работе в защищённом режиме. У меня больше интереса на создание своей файловой системы. Вначале будет идти информация о файловой системе, следом общий объём, свободное место, список файлов с их началом на диске и длиной. Для простоты дела, пока можно обойтись одними лишь файлами, то есть без поддержки папок. Но по сути, чтобы как-то получить файл (считать данные из файла), нужно же не просто подгрузить все сектора в память и прыгать по таблице файлов искать где он начинается, прибавлять смещение. Таким же способом далеко не уедешь. Ведь нужно через прерывание делать, передавать имя файла и таким образом через прерывания осуществлять действия над файлом. Но это уже возможно только если перейти в защищённый режим и настроить таблицу прерываний. Вот тут то я и запутался. Так как же делается: сначала учим работе с файловой системой или сначала много-много секторов тратим на переход в защищённый и потом уже только учим файловой системой? Ну или если проще, что первым: файловая система, или ядро ОС?
Думаю, стоит почитать Таненбаума "Современные операционные системы". Начать, вероятно, стоит с изучения FAT. Предельно простая файловая система, но даст представление о том, как это все работает. Если крато, то дела обстоят примерно так: загрузчик MBR загружает и передает управлением загрузчику файловой системы (первый сектор раздела). Загрузчик файловой системы продолжает загрузку ОС. В случае Windows, он находит и загружает NTLDR -- загрузчик ядра и драйверов. Все это происходит в реальном режиме. NTLDR ищет на диске и загружает ядро и драйверы, которые должны загружаться вместе с ядром, после чего передает управление ядру. Получается, что ядро, получив управление, уже имеет драйвер диска и может работать с винчестером в защищенном режиме. В Linux немного по-другому: ядро операционной системы содержит в себе драйвер файловой системы.
Ну на самом деле нет отдельных FAT и FAT16. Есть файловая система FAT с разрядностью кластера 12, 16 или 32 бит: FAT12/FAT16/FAT32
Спасибо! Я для начала решил пойти простым путём. Напишу операционную систему, похожую на MS-DOS. Только будет она у меня работать в защищённом режиме. Не будет никакой защиты, так как система будет однозадачная. Следовательно отпадает надобность в страничной организации памяти (буду делать через сегменты с одним уровнем привилегий - нулевым). Текущая запущенная программа будет иметь полный контроль над компьютером. Работать такая операционная система изначально будет в текстовом режиме 80x25 символов. Однако никто не мешает программе перевести видеоадаптер в графический режим (собственно как в MS-DOS). Основная вещь - это операционная система будет работать только с floppy-дискеты. Именно на неё я размещу свою файловую систему, которая будет очень простой (я её уже придумал). Она не будет содержать каталогов (то есть одноуровневая). Заранее пространство будет поделено, можно будет создать ограниченное количество файлов и для каждого файла ограниченный максимальный размер. В общем нужно идти от простого к сложному. Реализую такой вариант. Сделаю прерывания, которые будут позволять создавать, удалять, открывать, закрывать файлы, считывать и записывать данные. В общем в этом деле я уже продумал прерывания. Думаю не плохая будет задачка для развития. Хотелось бы у Вас спросить, как без функций BIOS работать с floppy-носителем? Ну там через регистры или порты? Через какие? А то я работал только через функции BIOS. Конечно никто не мешает всё содержимое дискеты загрузить в память, но мне и сохранять нужно будет туда данные из защищённого режима.
Пожалуй, ОС писать тебе ещё рановато; извини за менторский тон. Про флоппи-контроллер (a.k.a. FDC) можно прочитать много где, к примеру на OsDev.Org. В защищённом режиме с дискеты проще читать (и писать тоже) в режиме PIO, хотя заморочки с DMA научат многому, ну и прерывания заодно подтянешь. В проектировании сложных систем дизайн-документ один из самых важных. Он есть?
"Сделаю прерывания, которые будут позволять создавать, удалять, открывать, закрывать файлы, считывать и записывать данные. В общем в этом деле я уже продумал прерывания." "Сделать" ты их сможешь или перепиской BIOS (что понятное дело невозможно), или напишешь функции(!) , не прерывания (хотя твои функции будут основаны на прерываниях BIOS'a). Так что то напишешь не может быть прерыванием.
baldr Собственно она у меня не очень уж и сложная, поэтому дизайн-документа нет. Будет что-то подобное MS-DOS, только с наименьшим функционалом команд. Igor1024 Почему не прерывания?! Я составлю таблицу прерываний, 0 - деление на ноль, и так далее. Ну и пользовательские прерывания (часть из них) отведу под обслуживание операционной системы. Зачем мне BIOS переписывать? И не понял этого: Это почему же?
Я всего лишь сделаю так, чтобы процессор перешёл в защищённый режим. У меня будет три дескриптора (0 - нулевой, 1 - код, 2 - данные/стек). Составлю таблицу прерываний. Но для начала определю карты оперативной памяти. Определю диапазоны свободной памяти (всё-таки сегменты нужно будет указывать куда они будут ссылаться). Так же часть свободной памяти выделю под обработчики прерываний. Собираюсь использовать текстовый режим 80x25 символов, но можно было бы и текстовый режим с большим разрешением символов. Одно из пользовательских прерываний я отдам под управлением действием процессора. У этого прерывания будут функции: - завершить текущую программу (Exit); - перезагрузить компьютер (Reset); - выключить компьютер (Power). Ещё одно пользовательское прерывания будет предназначено для вывода информации на экран монитора. Оно будет иметь функции: - очистка экрана в заданный цвет (ClearScreen); - установка текущей позиции курсора (SetCursorPosition); - вывод символа в текущую позицию курсора с заданным атрибутом (DrawChar); - вывод текста в текущую позицию курсора с заданным атрибутом (DrawText); - прокрутку страницы вниз с уничтожением верхних строк (NewLine). Будет ещё прерывание, которое позволит узнать объём оперативной памяти, доступной для программы. Ещё одно прерывание, будет работать с файлами. Оно будет предоставлять функции: - получение свободного места в байтах (GetFreeSize); - получение списка файлов (GetFilesCount); - получение имени файла по индексу (GetFileName); - получение размера файла по индексу (GetFileSize); - создание файла по имени и получение идентификатора открытого файла (CreateFile); - открытие файла по имени и получение идентификатора открытого файла (OpenFile); - чтение указанного количества байт из файла по идентификатору файла (ReadFile); - запись указанного количества байт в файл по идентификатору файла (WriteFile); - установка указателя в файле на начало файла (SetFilePointToBegin); - установка указателя в файле на любой индекс (SetFilePoint); - установка указателя в файле на конец файла (SetFilePointToEnd); - закрытие файла по идентификатору (CloseFile); - удаление файла по имени (DeleteFile); - переименование файла по имени (RenameFile); - копирование файла по имени (CopyFile). Не будет никаких папок. В отличии от Windows, чтобы получить размер файла, не обязательно файл открывать. Я из 1.44 МБ дискеты выделю определённое место под файловую систему. И это место будет жёстко ограничивать количество и размер файлов. Вот только пока не решил как реализовать прерывания, связанные с вводом с клавиатуры. Там ведь нужно как-то позволять вводить текст. А как это сделать? Наверное какой-то буфер выделять для складывания текста. И нужно ещё позволять вводить значения, чтобы они не в строчку скапливались, а действия над нажатой клавишей происходили. Наверное нужно реализовать второе,а после этого уже определять нажатую клавишу и складывать ещё в буфер ввода до тех пор, пока не будет введён Enter, после этого этот буфер передавать в прерывание (программу). Но и при нажатии выводимого символа, его печатать на экрана и через Backspace удалять. Не будет навигации по введённому тексту стрелками. Операционная система будет различать строчные и заглавные буквы (то есть Notepad и notepad будет не одно и тоже). Будет несколько команд. Вывод списка файлов. Думаю придётся сделать как в MS-DOS, когда выводимый текст дойдёт до конца конца экрана, а место, откуда мы начали выводить дойдёт до начала экрана, тогда выведется сообщение нажать любую кнопку для продолжения вывода. Открытие файла fileName в текстовом редакторе notepad.app. Запуск файла fileName на выполнение как программу. Ну и команды для перезагрузки, выключения и не которые команды для работы с файлами (узнать размер, скопировать, удалить и переименовать). Вот такая вот идея. Делать буду не один, ещё с одним парнем. Не все вопросы ещё обдумал, особенно что касается ввода с клавиатуры и с работой флоппи-накопителя. Мышка и прочее мне для данной задачи не нужны.
s3dworld Так как же делается: сначала учим работе с файловой системой или сначала[...] Или сначала. Сначало пейшите микроядро (с прерываниями и исключениями), поскольку серьезная часть этих прерываний сделана для выявления багов в коде. На первое время Int 0Dh (double fault) будет наверное самым частым. Вывод байтиков вызвавших исключение и все такое - это часть такого обработчега. Далее можно начать пописывать кансоль управления. DOS - это всего-лишь дисковая подсистема (на 90%). Вы правильно делаете что пытаетесь формулировать абстрактные требования к подсистемам. Не нужно концентрироваться вначале на деталях общения с fdd через порты и DMA, лучше вообще сразу начать с USB (флоппи есть не везде!). Если напишите что-то типа грузящегося с USB простейшего интерфесо который может гулять по ntfs/fat32/etc? через примитивный диалог в тексте то щитайте что напейсале что-то что будут скатчевать и пользовать. Good luck.
PSR1257 USB пока для меня будет сложно. Я же хочу постепенно идти. Я свою систему и назвал BOS (Basic Operation System), что она будет простой не только с точки зрения пользователя (хотя тут ещё большой вопрос - думаю хрен кто кроме меня поймёт), но и лёгкой в разработке. Со временем можно будет перейти на следующий этап развития. Но пока хотя бы научиться работать с Floppy-дисководом и с клавиатурой в защищённом режиме. Такие книги как: - Программирование аппаратных средств в Windows - Программирование на аппаратном уровне Будут в самый раз для ознакомления работы не через BIOS или есть где это описано лучше?
В них встречаются ошибки и неточности, так что всё нужно проверять и перепроверять. Помнится, с клавиатурой там какие-то проблемы были (в своё время на осдевовской вике писал по поводу контроллера ПС/2, вот и наткнулся).
s3dworld Я рекомендую посмотреть пару глав в Финогенове где он дает базовые примеры работы в защищенном. Имхо не нужно глубокое знание портов и контроллеров, а просто чтобы работало. Обработчик клавиатуры это от силы 10 команд ввода-вывода. С дискетой будет сложнее, почему бы не звать для начала BIOS? (вызов 16-ти битного кода из PM уже не тривиальная задача). Впрочем сейчас вам рановато все планировать до мелочей. Напишите кое-что - вам будет видно есть ли желание продолжать и насколько глубоко.
Я имел в виду что функции будут обрабатывать прерывания, вы всё будете базировать на прерываниях BIOS'a. Честно говоря у Вас какие-то наполеоновские планы: то взломом интересуетесь, то свою ось Вам загорелось написать. Вы бы выбрали что-то одно и развивали свою идею.
Про клавиатуру поверхностно прочитал. Постараюсь в интернете найти справочник по свежее. Видимо к USB придётся мне в скором времени приступить. Так как у многих мышки и клавиатуры подключены к USB-портам. А так как описано в книге, то я могу только управлять устройствами, подключенным к PS/2 порту. Следовательно на эмуляторе Bochs у меня будет всё работать нормально, но если запустить систему на реальном железе с клавиатурой в USB, то пользователь ничего не сможет сделать. Значит теперь мне нужен план по клавиатуре. Это через порт проверить доступна ли клавиатура. Вот есть у меня рисунок: Это как же мне проверить вставлен ли в разъём устройство клавиатуры, какие-то из этих битов помогут мне в этом? Рах уж пока не хочу вникать в сложности USB, то хочу проверять есть ли клавиатура в PS/2 чтобы продолжать работу или же выводить сообщение об отсутствие поддерживаемой клавиатуры. Наверное пора перенести эти вопросы в тему Несколько вопросов начинающего (http://wasm.ru/forum/viewtopic.php?id=38860).