[질문] SATA Direct IO에 대해 질문 드립니다..
글쓴이: freemckang / 작성시간: 화, 2009/08/18 - 11:26오전
이런 저런 이유로 좋고 평탄한 길 놔두고 ioctl(HDIO_DRIVE_CMD)로 SATA HDD에 접근(R/W)해야 할 일이 생겼습니다... -.-
흠.. 이 방법으로라면 ATA spec을 보고 일일이 command를 내려주어야 하는 판국인데, 이 방법 말고 다른 방법으로(번거롭지 않게.. ^^;;) direct IO (파일 시스템 없이...) 가 가능할까요???
경험 있으신 분들의 답변 부탁드립니다~~
Forums:
'평탄한 길'이라고
'평탄한 길'이라고 언급하신게 read()/write() 라면, 이것들을 제외하고는 ioctl() 밖에 없습니다.
64bit OS 라면 mmap() 으로도 될 것 같긴 한데 read()/write() 를 못 쓰는 상황이라면 mmap() 도 가능성이 낮아보이네요.
OTL
/dev/sdX O_DIRECT로
/dev/sdX O_DIRECT로 열어서 read/write 하시면 안되나요? RW외의 명령어를 보내려면 HDIO_DRIVE_CMD 보다는 SG_IO로 SAT passthrough 커멘드 보내시는 게 좋습니다. hdparm 소스를 참고하세요.
HDIO_DRIVE_CMD에 한계가 있네요..
답변 감사드립니다..
제가 원했던 것은, ATA의 Read / Write stream command를 사용하려고 했었던 것인데요... 커널 소스쪽을 타고 내려가다보니 이쪽은 구현이 안되어있더군요... (사용중인 커널은 2.6.18.6입니다)
Stream command에서 눈치채셨듯이 A/V play/record 전용 FS를 만들어볼까 했는데 쉽지가 않네요 ^^;;
하여 HDIO_DRIVE_CMD를 사용하여 ATA command를 직접 내려주는 방법을 찾아보았으나 커널의 Documentation을 확인한 결과 HDIO_DRIVE_CMD의 argument는 4bytes를 사용하게 되어있더군요.
문제는 ATA의 Read / Write stream command의 인자에 start lba address가 들어가야 한다는 것이고, 이것은 현재의 대세로 놓고 본다면 48bit가 되어야 할 텐데... VFS를 사용해서 접근하는 것은 힘들겠다는 생각이 드네요.
tj님이 말씀하신대로 hdparm 소스를 참고하는데, 제가 찾는 부분에 대한 해답은 없는 듯 합니다..
그래서 아무래도 제가 원하는 것을 하려면 커널 모듈을 새로 만들거나 해당 ioctl을 특화시켜서 동작하게끔 하거나.. 어쨌든 커널에 손을 대야 하는 상황이 될 것으로 판단되네요.
그런데 또 한가지 질문이 있습니다. MBR의 4개 partition table에 Start LBA address가 32bit로 되어있는데, 48bit LBA address mode라면 나머지 16bit는 어디서 지원하는 걸까요? 구글링을 미친듯이 해보았으나 검색 내공의 부족인지 원하는 답이 나오지 않네요.
http://wiki.osdev.org/Partition_Table 에서 Unofficial한 정보를 보면 CHS 개념을 제거하고 그쪽에 상위 16bit를 넣었다.. 라는 얘기가 있어서 MBR을 뒤집어봤더니 또 그건 아닌 것 같더군요...
혹시 MBR에서 나머지 16bit는 어디를 참조해야 되는지 아시는 분 답변 부탁드리겠습니다. 즐거운 하루 되세요 :)
句日新, 日新 日新 又日新.
句日新, 日新 日新 又日新.
댓글 달기