[질문] SATA Direct IO에 대해 질문 드립니다..

freemckang의 이미지

이런 저런 이유로 좋고 평탄한 길 놔두고 ioctl(HDIO_DRIVE_CMD)로 SATA HDD에 접근(R/W)해야 할 일이 생겼습니다... -.-

흠.. 이 방법으로라면 ATA spec을 보고 일일이 command를 내려주어야 하는 판국인데, 이 방법 말고 다른 방법으로(번거롭지 않게.. ^^;;) direct IO (파일 시스템 없이...) 가 가능할까요???

경험 있으신 분들의 답변 부탁드립니다~~

bushi의 이미지

'평탄한 길'이라고 언급하신게 read()/write() 라면, 이것들을 제외하고는 ioctl() 밖에 없습니다.

64bit OS 라면 mmap() 으로도 될 것 같긴 한데 read()/write() 를 못 쓰는 상황이라면 mmap() 도 가능성이 낮아보이네요.

OTL

tj의 이미지

/dev/sdX O_DIRECT로 열어서 read/write 하시면 안되나요? RW외의 명령어를 보내려면 HDIO_DRIVE_CMD 보다는 SG_IO로 SAT passthrough 커멘드 보내시는 게 좋습니다. hdparm 소스를 참고하세요.

freemckang의 이미지

답변 감사드립니다..

제가 원했던 것은, 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를 사용하게 되어있더군요.

          Commands other than WIN_SMART
            args[0]     COMMAND
            args[1]     NSECTOR
            args[2]     FEATURE
            args[3]     NSECTOR

문제는 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는 어디를 참조해야 되는지 아시는 분 답변 부탁드리겠습니다. 즐거운 하루 되세요 :)

句日新, 日新 日新 又日新.

句日新, 日新 日新 又日新.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.