2013-11-23 4 views
1

У меня есть особая потребность в хранении данных блоков. Мои данные - это форматированные блоки данных размером 4096. Для высокой эффективности я хочу напрямую манипулировать блоком в секторе жесткого диска и не хочу обрабатывать блок данных как файл. Я думаю, что один из способов - обработать устройство как файл, например/dev/sda1, и использовать lseek() read() и write() для чтения и записи данных. Однако я не знаю, является ли глава файла первым сектором жесткого диска. Я также подозреваю эффективность этого метода.Прямой и эффективный сектор записи и записи жесткого диска

Я работаю над Linux OS и языком программирования C.

Каков наиболее эффективный способ обработки сектора жесткого диска? Должен ли я писать блок-модуль linux. Тем не менее, я мало знаю об этом. Какие функции ядра следует использовать для чтения и записи на блочном устройстве?

+0

Это: http://stackoverflow.com/questions/3520459/linux-hard-disk-direct-access-without-any-fs-from-c-program Релевантно для вас? Кажется, ответы на большинство вопросов «как», хотя вам, возможно, придется делать фундаментальные исследования для точных функций. – Avery

+0

Это актуально, но я не знаю, какой метод имеет хорошую производительность скорости ввода-вывода для случайного доступа к жесткому диску. – chenatu

+0

Этот вопрос может быть тем, о котором вы должны ответить сами, поскольку он очень субъективен и не очень хорошо подходит для этого формата. – Avery

ответ

4

«Блоки размером 4096» не является особой потребностью, и вы не упомянули никаких шаблонов доступа, которые нарушили бы встроенные механизмы кэширования ядра.

Наиболее эффективным способом чтения и записи данных является использование файла.

1
int ReadSector(int numSector,char* buf) 
{ 
    int retCode = 0; 
    BYTE sector[512]; 
    DWORD bytesRead; 
    HANDLE device = NULL; 

    device = CreateFile("\\\\.\\H:", // Drive to open 
     GENERIC_READ,   // Access mode 
     FILE_SHARE_READ,  // Share Mode 
     NULL,     // Security Descriptor 
     OPEN_EXISTING,   // How to create 
     0,      // File attributes 
     NULL);     // Handle to template 

    if(device != NULL) 
    { 
     // Read one sector 
     SetFilePointer (device, numSector*512, NULL, FILE_BEGIN) ; 

     if (!ReadFile(device, sector, 512, &bytesRead, NULL)) 
     { 
      Print("Error in reading1 floppy disk\n",numligne++); 
     } 
     else 
     { 
      // Copy boot sector into buffer and set retCode 
      memcpy(buf,sector, 512);retCode=1; 
     } 

     CloseHandle(device); 
     // Close the handle 
    } 

    return retCode; 
} 

Эта моя функция для чтения секторов, и она такая же удобная для записи. Сектор ноль будет первым сектором перегородки

+1

@ Даниил: хороший намек, к сожалению, вы не упомянули о необходимых вам, которые вы используете с вашей функцией :-) – Robert

+0

Этот код предназначен для Windows, а не для Linux, как запрошенный OP. – duskwuff

Смежные вопросы