OSDev http://osdev.su/ |
|
Программирование дисковой подсистемы http://osdev.su/viewtopic.php?f=7&t=364 |
Страница 8 из 9 |
Автор: | SII [ 11 янв 2011, 12:14 ] |
Заголовок сообщения: | Re: Программирование дисковой подсистемы |
Я ж ясно написал: с меньшей надёжностью, если не сразу обновлять. |
Автор: | s3dworld [ 11 янв 2011, 12:24 ] |
Заголовок сообщения: | Re: Программирование дисковой подсистемы |
Всем доброго дня! Не стал я использовать FAT12, а решил написать своё подобие. Сейчас реализовываю менеджер для работы с образами SFS12. Если кому интересно, то предлагаю содержимое файла с объявлениями структур: Код: #pragma once
#include <memory> #define SFS12_BOOT_SECTOR_IDENTIFIER "SFS12\0" #define SFS12_BOOT_SECTOR_SIGNATURE 0xAA55 #define SFS12_BOOT_SECTOR_SIGNATURE_BYTE1 0x55 #define SFS12_BOOT_SECTOR_SIGNATURE_BYTE2 0xAA #define SFS12_CLUSTERS_LIST_FREE 0x0000 #define SFS12_CLUSTERS_LIST_ERROR 0x0FF6 #define SFS12_CLUSTERS_LIST_END_CHAIN_BOOT 0x0FF7 #define SFS12_CLUSTERS_LIST_END_CHAIN_RESERVED 0x0FF8 #define SFS12_CLUSTERS_LIST_END_CHAIN_CLUSTERS_LIST 0x0FF9 #define SFS12_CLUSTERS_LIST_END_CHAIN_COPY_CLUSTERS_LIST 0x0FFA #define SFS12_CLUSTERS_LIST_END_CHAIN_ROOT_DIRECTORY 0x0FFB #define SFS12_CLUSTERS_LIST_END_CHAIN_ROOT_DIRECTORY_ITEMS 0x0FFC #define SFS12_CLUSTERS_LIST_END_CHAIN_DIRECTORY 0x0FFD #define SFS12_CLUSTERS_LIST_END_CHAIN_DIRECTORY_ITEMS 0x0FFE #define SFS12_CLUSTERS_LIST_END_CHAIN_FILE 0x0FFF #define SFS12_OBJECT_DESCRIPTION_STATUS_FREE 0 #define SFS12_OBJECT_DESCRIPTION_STATUS_OBJECT 1 #define SFS12_OBJECT_DESCRIPTION_INDEX_PARENT_ROOT_DIRECTORY 0 #pragma pack(1) struct SFS12_BootSector { char jmpCode[3]; char identifier[8]; char description[12]; unsigned char cylinders; unsigned char tracksInCylinder; unsigned char sectorsInTrack; unsigned short int bytesInSector; unsigned char sectorsInCluster; unsigned short int indexReserved; unsigned short int indexClusters; unsigned short int indexCopyClusters; unsigned short int indexRootDirectory; unsigned char unfinishedAction; char code[472]; char signature[2]; }; #pragma pack() #pragma pack(1) struct SFS12_ObjectDescription { unsigned char status; unsigned short int indexParent; char name[24]; char expansion[4]; unsigned char attributes; unsigned int size; char createDate[4]; char createTime[4]; char readDate[4]; char readTime[4]; char writeDate[4]; char writeTime[4]; unsigned short int indexData; unsigned short int items; }; #pragma pack() union SFS12_Union_UShortToChars { unsigned short int value; char bytes[2]; }; unsigned int SFS12_GetTextLength(const char* _src); unsigned int SFS12_GetTextLength(const char* _src,const unsigned int _maxLength); bool SFS12_SetText(char* _dsc,const unsigned int _dscLength,const char* _src); bool SFS12_SetText(char* _dsc,const unsigned int _dscLength,const char* _src,const unsigned int _srcLength); bool SFS12_SetDate(char* _dsc,const unsigned char _day,const unsigned char _month,const unsigned short int _year); bool SFS12_SetTime(char* _dsc,const unsigned char _hour,const unsigned char _minute,const unsigned char _second); bool SFS12_ClearCluster(char* _data,const unsigned short int _sectorsInCluster,const unsigned short int _indexCluster); bool SFS12_ClearClusters(char* _data,const unsigned short int _sectorsInCluster,const unsigned short int _indexCluster,const unsigned short int _clustersCount); bool SFS12_SetCluster(char* _data,const unsigned short int _sectorsInCluster,const unsigned short int _indexCluster,const char* _cluster); bool SFS12_SetClusters(char* _data,const unsigned short int _sectorsInCluster,const unsigned short int _indexCluster,const unsigned short int _clustersCount,const char* _clusters); bool SFS12_SetNotFullCluster(char* _data,const unsigned short int _sectorsInCluster,const unsigned short int _indexCluster,const char* _clusterPart,const unsigned short int _clusterPartSize); bool SFS12_SetNotFullClusters(char* _data,const unsigned short int _sectorsInCluster,const unsigned short int _indexCluster,const unsigned short int _clustersCount,const char* _clusters,const unsigned short int _clusterPartSize); bool SFS12_GetCluster(char* _cluster,const unsigned short int _sectorsInCluster,const char* _data,const unsigned short int _indexCluster); bool SFS12_GetClusters(char* _clusters,const unsigned short int _clustersCount,const unsigned short int _sectorsInCluster,const char* _data,const unsigned short int _indexCluster); |
Автор: | qeos [ 11 янв 2011, 17:44 ] |
Заголовок сообщения: | Re: Программирование дисковой подсистемы |
не вдавался в подробности, но все же: в чем преимущество это системы? |
Автор: | s3dworld [ 11 янв 2011, 17:48 ] |
Заголовок сообщения: | Re: Программирование дисковой подсистемы |
qeos писал(а): не вдавался в подробности, но все же: в чем преимущество это системы? Преимущество в простоте. Не хочу я вникать во всю суть FAT, поэтому сделал только самое важное, именно то, что поможет упрятать файлы и потом их отыскать. А в случае сбоя можно будет по списку секторов восстановить где файлы, где папки. |
Автор: | SII [ 11 янв 2011, 18:03 ] |
Заголовок сообщения: | Re: Программирование дисковой подсистемы |
Наверняка бред. Проще ФАТа некуда -- разве что если нет иерархической структуры каталогов. |
Автор: | s3dworld [ 11 янв 2011, 19:37 ] |
Заголовок сообщения: | Re: Программирование дисковой подсистемы |
Ну а почему нет проще FAT? Я сейчас сделал так, что у меня есть структура BootSector (собственно она всегда и везде есть). В ней информация о дискете (количество цилиндров, дорожек на цилиндре, секторов на дорожке и байтов в секторе) и информация о файловой системе (идентификатор, описание, количество секторов в кластере, где начинаются резервные кластера, где начинается описание кластеров, где начинается (если она вообще есть) копия описания кластеров, где начинается корневая папка и статус последнего действия). Вот как она выглядела бы на ассемблере: Код: jmpCode db 0x00,0x00,0x00 identifier db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 description db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 cylinders db 0x00 tracksInCylinder db 0x00 sectorsInTrack db 0x00 bytesInSector dw 0x0000 sectorsInCluster db 0x00 indexReserved dw 0x0000 indexClusters dw 0x0000 indexCopyClusters dw 0x0000 indexRootDirectory dw 0x0000 unfinishedAction db 0x00 code db ; Тут код загрузочного сектора на 472 байта signature db 0x00,0x00 Описания кластеров - это двух байтный массив, элемент которого кое-что характеризует. Характеристика следующая: 0x0000 - кластер свободен 0x0FF7 - кластер с ошибкой 0x0FF8 - кластер с загрузочным сектором 0x0FF9 - последний кластер цепочки резервных кластеров 0x0FFA - последний кластер цепочки характеристики кластеров 0x0FFB - последний кластер цепочки копии характеристики кластеров 0x0FFC - кластер с корневой директорией 0x0FFD - последний кластер цепочки элементов корневой папки 0x0FFE - последний кластер цепочки элементов папки 0x0FFF - последний кластер цепочки данных файла Значение в диапазоне от 0x0001 до 0x0B3F означают индекс кластера. Значения в диапазоне от 0x0B40 до 0x0FF6 и от 0x1000 до 0xFFFF запрещены! И есть структура ObjectDescription где содержится описание объекта (папки/файла). Там указывается индекс кластера, где лежит список описаний объектов, среди которого есть и описание папки, к которой принадлежит данный объект. Если в качестве индекса родительского объекта стоит значение 0x0000, то данный объект лежит в корневой папке. Ну и дальше обычные поля для описания объекта. Ничего тут особенного нет. Единственное, что есть специальное поле status, которое говорит о том, удалён ли объект или нет из списка. То есть в FAT для этого использовался первый символ в имени, а у меня отдельное поле. Вот как она выглядела бы на ассемблере: Код: status db 0x00 indexParent dw 0x0000 name db ; Тут имя объекта на 24 байта expansion db 0x00,0x00,0x00,0x00 attributes db 0x00 size dd 0x00000000 createDate db 0x00,0x00,0x00,0x00 createTime db 0x00,0x00,0x00,0x00 readDate db 0x00,0x00,0x00,0x00 readTime db 0x00,0x00,0x00,0x00 writeDate db 0x00,0x00,0x00,0x00 writeTime db 0x00,0x00,0x00,0x00 indexData dw 0x0000 items dw 0x0000 В общем так вот всё и устроено. Сейчас для неё пишу программу, чтобы можно было создавать образ, создавать в нём папки и испортировать в них файлы. И что, разве плохая файловая система? |
Автор: | SII [ 11 янв 2011, 19:51 ] |
Заголовок сообщения: | Re: Программирование дисковой подсистемы |
Лично я не вижу никаких преимуществ перед ФАТом, кроме несколько возросшего длины имени (что всё равно совершенно недостаточно с современной точки зрения). Зато недостатков как минимум два: 1) несовместимость с этим самым ФАТом, а значит, неспособность использовать носитель с такой ФС в любой ОС, если нет специального ПО; 2) лишний расход памяти, что для дискет критично в связи с их незначительной ёмкостью. Ну а вообще, даже не слишком удачный стандарт, как правило, на практике значительно лучше, чем даже супергениальное, но нестандартное решение. |
Автор: | s3dworld [ 11 янв 2011, 20:02 ] |
Заголовок сообщения: | Re: Программирование дисковой подсистемы |
SII Что значит не совместимость с FAT'ом? Это то что поля BootSector'а другие? |
Автор: | SII [ 11 янв 2011, 20:21 ] |
Заголовок сообщения: | Re: Программирование дисковой подсистемы |
То и значит -- это ж другая ФС, а все оси ожидают, что на дискете будет ФАТ-12. Соответственно, штатными средствами с этой дискетой ничего сделать будет нельзя. Ну и нафиг она такая нужна? За ФАТ отнюдь не просто так держатся и на дискетах, и на флэшках. |
Автор: | s3dworld [ 11 янв 2011, 20:41 ] |
Заголовок сообщения: | Re: Программирование дисковой подсистемы |
SII Я не хочу использовать FAT12, только потому, что мне не нравятся там несколько вещей: 1. Русские символы нельзя использовать (там ведь один из русских символов считается удалением). 2. Длина имени всего 8 символов. Конечно там как-то можно делать длинные имена, но я не знаю как и думаю что это как-то запутанно. 3. Не идёт учёт регистра для имён и расширений. А меня это не устраивает. Я хочу чтобы он учитывался. Именно поэтому я и придумываю свою файловую систему. |
Страница 8 из 9 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |