하드디스크의 트랙마다 시작하는 섹터 찾는 방법점 가르쳐주세요

t2rhsu의 이미지

안녕하세요
하드디스크의 트랙마다 시작하는 섹터 찾는 방법점 가르쳐주세요
트랙마다 시작되는 섹터가 있지 않나요? 그 섹터를 찾으려고 하거든요

int main(){
fd=opne("/dev/sda",O_RDONLY);
lseek(fd,0,SEEK_SET);
gettimeofday(,);
read(fd,buf,SIZE);
gettimeofday(,);
}

핵심적인 부분만 적었어요 . 그러니깐 하드디스크에 접근해서 buf라는 변수에 SIZE(섹터의 크기)만큼 읽어 올 생각인데
read()를 수행하기전 시간이랑 수행후 시간을 gettimeofday() 를 사용하여 마이크로 세컨트의 값을 구할생각입니다
이것을 반복하면 현재 트랙에서 다음 트랙으로 헤드가 넘어갈때 약간의 지연 시간이 발생할것이고 이 시간이
다른 측정한 시간들(read()로 읽어 오는 시간) 보다 조금더 길것이라는 생각을하였고,
이부분이 트랙의 시작 섹터 라고 생각을해서 이렇게 수행할려고 하는데 ... 잘않되네여;
하드디스크의 캐시 메모리도 고려해야할것같고 그런거 고려해서 수행해봐도 찾기가 어렵네요...
제가 생각한 방법이 잘못되었거다 다른 방법이 있으면 점 가르쳐주세여
제가 초보라서 조금 자세히 설명해주시면 정말 감사하겠습니다
수고하세요 (열심히 배워야겠다...;;;=_=;;)

a287848의 이미지

기본적으로 read와 같은 시스템 콜로는 섹터단위의 접근이 불가능합니다.

왜냐하면 운영체제가 Page 크기 단위로 I/O 를 수행하기 때문에 512bytes를 읽어도

실제 일어나는 I/O 는 4kbytes 단위(page크기에 따라)로 일어나고요.

그리고 트랙의 첫번째 섹터를 읽어오는건 불가능한데 이건 두가지 이유에서 불가능할걸로 보이네요.

일단 트랙정보를 얻기 위해서는 HDD의 전체적인 geometry 정보를 얻어와야하는데

HDD는 자신의 geometry정보를 숨깁니다. 외부에서는 알수가 없고요.

fdisk 같은 툴로 보는 헤드 섹터 실린더 정보는 다 실제 geometry 정보가 아니라 가상의 정보고요. hd 가 255개일 수가없죠?^^

두번째 이유는 요즘 하드 디스크의 I/O operation에서 주소를 전달하는 방법은 용량때문에 CHS 가 아니라. LBA이기 때문입니다.

정말로 꼭 하셔야한다면 아주 오래된 HDD로 CHS addressing mode로 접근하시면 가능할지도 모르겠습니다.

Dig it.

Dig it.

t2rhsu의 이미지

그럼 오래된 HDD 말고는 현대 HDD에서는 접근할 방법이 없단 말인가요??
ㅠㅠ 에구 어렵네;; 어떻하면 좋지
정말 방법이 없을까요??...

bushi의 이미지

방법, 물론 있습니다. 있고 말고요.

OS 에 의존하지 않고 hdd 의 컨트롤러에 직접 접근하면 됩니다.
통신방법은 ATA-2(EIDE) spec. 문서를 보시면 됩니다.
(돈주고 사서 봅니다. 몇년 전에 draft 문서를 인터넷에서 건진 적이 있는데 다시 찾아보니 없군요.
안 찾아봐서 모르겠는데 어쩌면 SCSI 문서는 무료일지도.)

I/O 주소는 /proc/pci(?) 등을 통해서 알아내시고요.

hdd 를 뜯어서 disc 판때기 몇갠지 헤드가 몇갠지 알아냅니다.

hdd 벤더에 메일을 날려서 헤드 제어 알고리듬을 보내달라고 합니다.
더불어 error detection/correction 에 사용하는 codec 알고리듬도 같이 첨부하라고 합니다.

답신을 받으면, 이제 작업 들어가시면 됩니다.

받은 알고리듬들을 검토 해서 자기배열이 어떤 순서로 어떻게 이뤄지고,
헤드의 움직임이 어떻게 될 지 미리 계산을 합니다. 적절히.

파일시스템을 만들건, 새로운 block device 레이어를 만들건, 아무튼 뭐 하나 만들었다고 칩시다.

hdd 벤더에 다시 메일을 날립니다.
당신들이 준 정보를 참고해서 당신들 hdd 전용으로 이런 걸 만들었다.
당분간 계속 쓰고 싶으니 당신들 hdd 의 구조나 펌웨어상의 변동이 생기면 꼭 알려달라.

OTL

a287848의 이미지

위에 bushi 님께서 말씀을 꺼냈으니깐 말씀을 드리자면

섹터단위 접근 방법은 Block Device에 직접 접근하시면 됩니다.

다만 하실께 많아서 저도 말을 안꺼낸거고요.

예전에 구현해본적이 있는데 간단하게 설명드리자면 결국에 Page 단위 I/O는

디바이스 드라이버로 내려가면 몇번째 섹터를 읽어와라하는 sector 단위의 I/O 명령어로 바뀝니다.

bushi 님이 말씀하신데로 ATA 스펙을 보시거나 아니면 Linux Kernel 만 열어보셔도

읽을 섹터의 위치, 그 위치에서 몇개의 섹터를 읽을 것인가를 outbyte()함수를 통해 HDD로 전송하게 되어있습니다.

그래서 결국 sector 단위 접근은 Linux block device driver 를 참고해서 작성하시면 비교적 간단히 할수 있고요.

HDD geometry는 결국에는 HDD performance tunning 이랑 관련있는거라 HDD vendor쪽으로 알아보셔야 할꺼예요.

다만 예전에 제가 국내의 S모사 HDD 펌웨어 개발하는 쪽에 문의해본적이 있는데 별로 협조적이지 않았구요.

한가지 노파심에 말씀드리는건 LBA에 주소가 실제 HDD의 정확히 몇번째 sector에 mapping 된다는건 물리적인 HDD geometry에 따라

결정되지만 이는 결국 HDD 펌웨어에서 주소변환을 해줘서 가능한겁니다.

그래서 만약 어느 위치를 읽기 위해 명령어를 내렸는데 그 영역이 과거에 베드 섹터라면 HDD는 섹터 리매핑으로인해

잉여 섹터에 매핑 시키기 때문에 전혀 다른 곳에 있는 섹터일 수도 있습니다. 실제 하드디스크 제조 과정중에 발생하는 일이구요.

Dig it.

Dig it.

kyano의 이미지

간단하게 말해서 불가능하고 가능하다고 해도 매우 제한적이며 어렵습니다.
현재 하드디스크들은 다른 분들이 말씀하신 것처럼 내부의 정보는 철저하게 숨기고 있습니다.
외부에서 섹터 단위로 접근한다고 해봤자 LBA이며, 이는 이미 한번 재가공된 번호들이고 실제 하드디스크의 CHS구조에 대입하기 위한 정보는 업체마다 다르며 공개되어 있지 않습니다.

실제로 몇해전(최근 일로 알고 있습니다.) 관악산에 위치한 모 대학 연구실에서 이와 관련된 연구 때문에 국내 최대 전자기업에 정보제공을 요청하였으나 그곳에서 기밀사항이라는 이유로 거절하였습니다.
그 후 그 연구실에서는 각종 노가다성 실험으로 대략의 매핑 정보를 얻어내고 이를 토대로 하드디스트의 매핑 알고리즘 때려맞추기라는 주제로 논문도 발표하였습니다.
(논문 발표 후 국내 최대 전자기업에서 갑자기 친하게 지내자고 했다는 후문이 있더군요... 쿨럭...)

------------------------------------------------
Have you ever heard about Debian GNU/Linux?

--
Have you ever heard about Debian GNU/Linux?

a287848의 이미지

저도 geometry 정보 얻어 오는걸 직접 해보려고 했는데....

벌써 하셨군요.^^

Dig it.

Dig it.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.