Используйте жесткий диск SATA в качестве блочного устройства
Я совершенно новичок в ядре Linux, поэтому я, наверное, все перепутал. Но любой совет мне поможет;)
У меня есть жесткий диск SATA, подключенный через карту SATA PCIe, и я пытаюсь использовать read
а также write
как на блочном устройстве. Я также хочу, чтобы отключение питания данных сохранялось на жестком диске - не кэшировалось. И в конце я должен проанализировать, сколько времени я теряю в каждом слое стека Linux. Но по одному шагу за раз.
На данный момент я пытаюсь open
устройство с *O_DIRECT*. Но я не совсем понимаю, где я могу найти устройство. Это проявляется как /dev/sdd
и я создал один раздел /dev/sdd1
,
open
а такжеread
на раздел/dev/sdd1
работает.write
не удается с *O_DIRECT* (но я уверен, что у меня правильный размер блока)open
read
а такжеwrite
призвал/dev/sdd
терпит неудачу полностью.- Может быть, есть еще один файл в
/dev/
который представляет мое устройство на блочном слое? - Каковы мои ошибки и неправильные предположения?
Это мой текущий тестовый код
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 на мощной архитектуре - если это важно.
Большое спасибо за ваше время, Фабиан
1 ответ
В зависимости от размера блока вашего SDD (может быть 512 бит или 4K), вы можете только читать / записывать кратные из этого размера.
Также: при использовании флага O_DIRECT необходимо убедиться, что буфер правильно выровнен по границам блоков. Вы не можете гарантировать, что используя обычный массив символов, используйте memalign для выделения выровненной памяти.