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