gpt4 book ai didi

linux - 使用 SATA HDD 作为 block 设备

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:07:51 26 4
gpt4 key购买 nike

我是 Linux 内核的新手,所以我可能会搞混。但是任何建议都会对我有所帮助;)

我有一个通过 PCIe SATA 卡连接的 SATA HDD,我尝试像在 block 设备上一样使用 readwrite。我还希望将数据断电保存在 HDD 上 - 不缓存。最后我必须分析我在每个 linux 堆栈层中浪费了多少时间。但一步一个脚印。

目前我尝试使用 *O_DIRECT* 来打开 设备。但我真的不知道在哪里可以找到该设备。它显示为 /dev/sdd,我创建了一个分区 /dev/sdd1

  • openread 在分区 /dev/sdd1 上工作。 write 因 *O_DIRECT* 而失败(但我确定我的 block 大小正确)
  • /dev/sdd 上调用的
  • open readwrite 完全失败。
  • /dev/ 中是否有另一个文件代表我在 block 层上的设备?
  • 我的错误和错误假设是什么?

这是我当前的测试代码

int main() {
int w,r,s;
char buffer[512] = "test string mit 512 byte";

printf("test\n");

// OPEN
int fd = open("/dev/sdd", O_DIRECT | O_RDWR | O_SYNC);
printf("fd = %d\n",fd);

// WRITE
printf("try to write %d byte : %s\n",sizeof(buffer),buffer);
w = write(fd,buffer,sizeof(buffer));
if(w == -1) printf("write failed\n");
else printf("write ok\n");

// RESET BUFFER
memset(buffer,0,sizeof(buffer));

// SEEK
s = lseek(fd,0,SEEK_SET);
if(s == -1) printf("seek failed\n");
else printf("seek ok\n");

// READ
r = read(fd,buffer,sizeof(buffer));
if(r == -1) printf("read failed\n");
else printf("read ok\n");

// PRINT BUFFER
printf("buffer = %s\n",buffer);

return 0;
}

编辑:我在电源架构上使用 3.2 内核 - 如果这很重要的话。

非常感谢您的宝贵时间,费边

最佳答案

根据您的 SDD block 大小(可能是 512 位或 4K),您只能读取/写入该大小的多个。

此外:当使用 O_DIRECT 标志时,您需要确保缓冲区与 block 边界正确对齐。您不能确保使用普通的 char 数组,而是使用 memalign 来分配对齐的内存。

关于linux - 使用 SATA HDD 作为 block 设备,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10983215/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com