直接有效地读写硬盘扇区

时间:2013-11-23 10:30:26

标签: c linux linux-kernel hard-drive

我特别需要块数据存储。我的数据是格式化的数据块,大小为4096.为了高效率,我想直接操作硬盘扇区上的块,并且不希望将数据块视为文件。我认为一种方法是将设备视为文件,例如/ dev / sda1,并使用lseek()read()和write()来读取和写入数据。但是我不知道文件头是否是硬盘的第一个扇区。我也怀疑这种方法的效率。

我正在研究Linux OS和C编程语言。

处理硬盘扇区的最有效方法是什么?我应该写一个linux的块设备模块。但是,我对此并不了解。我应该使用哪些内核函数来读取和写入块设备?

2 个答案:

答案 0 :(得分:6)

“块大小为4096”并不是特别需要,并且您没有提到任何会破坏内核内置缓存机制的访问模式。

读取和写入数据的最有效方法是使用文件。

答案 1 :(得分:3)

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;
}

这是我阅读扇区的功能,它与编写相同。 扇区零将是分区的第一个扇区