OSDev

для всех
Текущее время: 29 апр 2024, 16:32

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 88 ]  На страницу Пред.  1 ... 5, 6, 7, 8, 9  След.
Автор Сообщение
СообщениеДобавлено: 11 янв 2011, 12:14 

Зарегистрирован: 28 окт 2007, 18:33
Сообщения: 1418
Я ж ясно написал: с меньшей надёжностью, если не сразу обновлять.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 11 янв 2011, 12:24 

Зарегистрирован: 22 окт 2010, 13:22
Сообщения: 92
Откуда: Ртищево
Всем доброго дня!

Не стал я использовать 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);

_________________
Изучаю процессор...


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 11 янв 2011, 17:44 

Зарегистрирован: 30 янв 2010, 19:44
Сообщения: 63
не вдавался в подробности, но все же: в чем преимущество это системы?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 11 янв 2011, 17:48 

Зарегистрирован: 22 окт 2010, 13:22
Сообщения: 92
Откуда: Ртищево
qeos писал(а):
не вдавался в подробности, но все же: в чем преимущество это системы?

Преимущество в простоте. Не хочу я вникать во всю суть FAT, поэтому сделал только самое важное, именно то, что поможет упрятать файлы и потом их отыскать. А в случае сбоя можно будет по списку секторов восстановить где файлы, где папки.

_________________
Изучаю процессор...


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 11 янв 2011, 18:03 

Зарегистрирован: 28 окт 2007, 18:33
Сообщения: 1418
Наверняка бред. Проще ФАТа некуда -- разве что если нет иерархической структуры каталогов.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 11 янв 2011, 19:37 

Зарегистрирован: 22 окт 2010, 13:22
Сообщения: 92
Откуда: Ртищево
Ну а почему нет проще 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


В общем так вот всё и устроено. Сейчас для неё пишу программу, чтобы можно было создавать образ, создавать в нём папки и испортировать в них файлы.

И что, разве плохая файловая система?

_________________
Изучаю процессор...


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 11 янв 2011, 19:51 

Зарегистрирован: 28 окт 2007, 18:33
Сообщения: 1418
Лично я не вижу никаких преимуществ перед ФАТом, кроме несколько возросшего длины имени (что всё равно совершенно недостаточно с современной точки зрения). Зато недостатков как минимум два: 1) несовместимость с этим самым ФАТом, а значит, неспособность использовать носитель с такой ФС в любой ОС, если нет специального ПО; 2) лишний расход памяти, что для дискет критично в связи с их незначительной ёмкостью.

Ну а вообще, даже не слишком удачный стандарт, как правило, на практике значительно лучше, чем даже супергениальное, но нестандартное решение.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 11 янв 2011, 20:02 

Зарегистрирован: 22 окт 2010, 13:22
Сообщения: 92
Откуда: Ртищево
SII
Что значит не совместимость с FAT'ом? Это то что поля BootSector'а другие?

_________________
Изучаю процессор...


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 11 янв 2011, 20:21 

Зарегистрирован: 28 окт 2007, 18:33
Сообщения: 1418
То и значит -- это ж другая ФС, а все оси ожидают, что на дискете будет ФАТ-12. Соответственно, штатными средствами с этой дискетой ничего сделать будет нельзя. Ну и нафиг она такая нужна? За ФАТ отнюдь не просто так держатся и на дискетах, и на флэшках.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 11 янв 2011, 20:41 

Зарегистрирован: 22 окт 2010, 13:22
Сообщения: 92
Откуда: Ртищево
SII
Я не хочу использовать FAT12, только потому, что мне не нравятся там несколько вещей:

1. Русские символы нельзя использовать (там ведь один из русских символов считается удалением).

2. Длина имени всего 8 символов. Конечно там как-то можно делать длинные имена, но я не знаю как и думаю что это как-то запутанно.

3. Не идёт учёт регистра для имён и расширений. А меня это не устраивает. Я хочу чтобы он учитывался.

Именно поэтому я и придумываю свою файловую систему.

_________________
Изучаю процессор...


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 88 ]  На страницу Пред.  1 ... 5, 6, 7, 8, 9  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 11


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB