C 直接高效地读写硬盘扇区

C 直接高效地读写硬盘扇区,c,linux,linux-kernel,hard-drive,C,Linux,Linux Kernel,Hard Drive,我特别需要块数据存储。我的数据是4096大小的格式化数据块。为了提高效率,我希望直接操作硬盘扇区上的块,而不希望将数据块视为文件。我认为一种方法是将设备视为/dev/sda1之类的文件,并使用lseek()read()和write()读取和写入数据。但是我不知道文件的头是否是硬盘的第一个扇区。我也怀疑这种方法的效率 我正在研究Linux操作系统和C编程语言 处理硬盘扇区最有效的方法是什么?我应该写一个linux的块设备模块吗。然而,我对它了解不多。我应该使用哪些内核函数在块设备上读写?“4096

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

我正在研究Linux操作系统和C编程语言

处理硬盘扇区最有效的方法是什么?我应该写一个linux的块设备模块吗。然而,我对它了解不多。我应该使用哪些内核函数在块设备上读写?

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

读写数据最有效的方法是使用文件

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;
}
这是我读扇区的功能,写扇区也是一样。
扇区0将是分区的第一个扇区

这:与您相关吗?似乎回答了大多数“如何”的问题,尽管您可能需要对确切的功能进行基础研究。这是相关的,但我不知道哪种方法对随机访问硬盘具有良好的I/O速度性能。为什么要避免使用文件系统?考虑到硬盘比RAM慢100万倍,SSD比RAM慢数千倍,文件系统开销非常小,通常无法察觉。磁盘控制器(在磁盘内部,任何软件都无法避免)现在正在做很多事情(扇区重组等)。例如,您可以(从用户土地应用程序)使用普通
read(2)
access(数据大小为4Kbytes的倍数,并对齐4Kbyte)。此外,文件系统也被缓存@andrewcooke:人们有时会因为“X-Y问题”而询问问题的更多细节:“-当问题的解决方案似乎比原来的问题更具体时,这是一件很常见的事情。@andrewcooke:因为如果我看到有人问如何使用枪来切指甲,我认为向他解释指甲钳已经足够有用了。@Daniel:很好的提示,不幸的是你没有提到你在函数中使用的必要的include:-)这段代码是针对Windows的,而不是像OP要求的那样针对Linux的。@Robert#include