안녕하세요
하드디스크의 트랙마다 시작하는 섹터 찾는 방법점 가르쳐주세요
트랙마다 시작되는 섹터가 있지 않나요? 그 섹터를 찾으려고 하거든요
int main(){
fd=opne("/dev/sda",O_RDONLY);
lseek(fd,0,SEEK_SET);
gettimeofday(,);
read(fd,buf,SIZE);
gettimeofday(,);
}
핵심적인 부분만 적었어요 . 그러니깐 하드디스크에 접근해서 buf라는 변수에 SIZE(섹터의 크기)만큼 읽어 올 생각인데
read()를 수행하기전 시간이랑 수행후 시간을 gettimeofday() 를 사용하여 마이크로 세컨트의 값을 구할생각입니다
이것을 반복하면 현재 트랙에서 다음 트랙으로 헤드가 넘어갈때 약간의 지연 시간이 발생할것이고 이 시간이
다른 측정한 시간들(read()로 읽어 오는 시간) 보다 조금더 길것이라는 생각을하였고,
이부분이 트랙의 시작 섹터 라고 생각을해서 이렇게 수행할려고 하는데 ... 잘않되네여;
하드디스크의 캐시 메모리도 고려해야할것같고 그런거 고려해서 수행해봐도 찾기가 어렵네요...
제가 생각한 방법이 잘못되었거다 다른 방법이 있으면 점 가르쳐주세여
제가 초보라서 조금 자세히 설명해주시면 정말 감사하겠습니다
수고하세요 (열심히 배워야겠다...;;;=_=;;)
==================================================================================
섹터단위 접근 방법은 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는 섹터 리매핑으로인해
잉여 섹터에 매핑 시키기 때문에 전혀 다른 곳에 있는 섹터일 수도 있습니다. 실제 하드디스크 제조 과정중에 발생하는 일이구요.
===================================================================================
간단하게 말해서 불가능하고 가능하다고 해도 매우 제한적이며 어렵습니다.
현재 하드디스크들은 다른 분들이 말씀하신 것처럼 내부의 정보는 철저하게 숨기고 있습니다.
외부에서 섹터 단위로 접근한다고 해봤자 LBA이며, 이는 이미 한번 재가공된 번호들이고 실제 하드디스크의 CHS구조에 대입하기 위한 정보는 업체마다 다르며 공개되어 있지 않습니다.
실제로 몇해전(최근 일로 알고 있습니다.) 관악산에 위치한 모 대학 연구실에서 이와 관련된 연구 때문에 국내 최대 전자기업에 정보제공을 요청하였으나 그곳에서 기밀사항이라는 이유로 거절하였습니다.
그 후 그 연구실에서는 각종 노가다성 실험으로 대략의 매핑 정보를 얻어내고 이를 토대로 하드디스트의 매핑 알고리즘 때려맞추기라는 주제로 논문도 발표하였습니다.
(논문 발표 후 국내 최대 전자기업에서 갑자기 친하게 지내자고 했다는 후문이 있더군요... 쿨럭...)
'QnA' 카테고리의 다른 글
unit impulse와 unit step function (1) | 2010.10.13 |
---|---|
unifdef.c : conflicting types for getline function 해결 (0) | 2010.10.02 |
Reentrant 와 Thread-safe 의 차이 (0) | 2010.05.28 |
arm7에서 arm9으로 넘어가면서 pipeline이 두단계 들어난 것이 폰노이만 구조에서 하버드 구조로 넘어간 것과 연관이 있나? (0) | 2010.05.08 |
Data, Bss Segment 사이즈 변화 (0) | 2010.05.05 |
WRITTEN BY
- RootFriend
개인적으로... 나쁜 기억력에 도움되라고 만들게되었습니다.