하드디스크에 있는 파일에 접근하는 방법? 이 궁금합니다. (뭐가 궁금한 건지 잘 모르겠네요..)
안녕하세요. C를 다시 공부하고 있다가 궁금한 점이 생겨 kldp에 질문 올립니다.
1. 알고 있던 지식.
-----
하드디스크에 있는 파일에 접근하려면, 해당 파일이 있는 곳을 알아야 한다.
임의의 메모리 위치에 접근하려면 포인터를 이용할 수 있는데, 포인터의 크기는
CPU가 다룰 수 있는 가장 적합한 자료형인 int에 의존한다. 즉 sizeof(void *)==sizeof(int)이다.
하드디스크도 하나의 메모리 집합이므로, 파일에 접근하기 위해 포인터를 사용할 수 있다.
이 때 포인터는 바이트 단위로 주솟값을 저장한다. 즉 포인터가 가리킬 수 있는 메모리의 범위는
NULL(0)바이트부터 NULL-1바이트까지이다.
-----
라고 알고 있었습니다.
2. 문제 상황.
이렇게 알고 있었더니
-----
32bit CPU를 사용하는 컴퓨터의 하드디스크의 총 용량이 512GB인 상황을 가정하자.
unsigned int 타입의 범위는 0x00000000 ~ 0xFFFFFFFF까지 총 (2^32)이다.
이 값으로 표현 가능한 메모리의 범위는 0부터 2^32-1까지가 되는데,
2^32bit는 4GB와 같으므로 포인터로 표현 가능한 메모리의 범위는 0B부터 4GB-1B까지이다.
그렇다면 남는 508GB에는 접근할 수 없는 것인가?
-----
이렇게 이상한 점이 생겨버리네요.
제가 한 단계 더 도약할 수 있는 계단을 지금 만난 것 같습니다.
완전 엉터리로 알고 있는지도 모르고.. 무엇보다 어떻게 검색해야 뭐가 나올지 알 수가 없어서
(제목에도 적었듯이.. 제가 뭘 궁금해하는 건지조차 모르겠네요.)
검색하지도 못하고 kldp에 먼저 질문을 올리게 되었습니다.
초보자처럼 두루뭉술하게 질문을 해버리고 말았는데, 고수 분들의 답변 바랍니다.
언제나 조언은 감사합니다. 감사합니다.
수정합니다
FileSystem
완벽한 세상을 위하여!
filesystem에 대해서
filesystem에 대해서 찾아보세요.
http://en.wikipedia.org/wiki/File_system
피할 수 있을때 즐겨라! http://melotopia.net/b
snowall 님 말씀처럼..filesystem 에대해서 찾아보세요.
우선 님의 가설대로라면 , 남은 508GB 에는 접근 할수없어야됩니다.
그런데 현재 하드디스크는 508GB 영역에 까지 접근하여 정상적으로 작동하죠?
-> 이부분에서 님이 생각하고있는 잘못된 부분을 고쳐야 합니다.
님이 생각하시는 이론은 , cpu 레지스터에 읽을 곳의 주소와 읽은 데이터를 넣을 메모리의 주소를 각각 1개씩 넣고
한방에 읽기명령을 내린다는 내용인데요 , 하드디스크를 직접 접근하던 , 하드디스크의 내용을 메모리로 올리고 메모리로 접근하던 어쨋든간에 508GB 의 주소영역은 님이생각하신 이유로 인해 접근할수없습니다.
그러면 어떻게 현재 하드디스크가 잘 작동하는가 하는것은, 님이생각하신 가설과 다른 방법으로 동작하기 때문인데요..
메모리 와 뭐 기타 다른문제는 제쳐두고 , 하드디스크에서 읽고/쓰는 내용 만 두고봤을때 , 적어도 INTEL X86 Machine Code 에는 하드디스크의 번지를 직접지정해서 메모리 혹은 하드디스크의 특정번지로 읽은 내용을 옮기는 명령 따위는 없습니다.
그것이 없으므로 MachineCode 를 이용하는 고급언어에서도 그런 구현은 없겠죠..
음.. snowall 님 말씀대로 filesystem 을 찾아보세요. read,write 연산을 따라 kernel 로 내려가고 metadata 영역에서 inodetable,datablock -> copy_to_user,copy_from_user 뭐 이런 비슷한 것들에 대해서 찾아보시면 답을 찾지않으실까합니다.
linux 에서 찾아보세요 소스코드가 공개되어있어서 실험하거나 연습하시기가 편할겁니다.
아 그리고 이글은 jw8704 가 썼습니다.
로그인을 안해서.. 별건아니지만 제 이곳 ID 는 jw8704 입니다.
답변 주신 champion님, snowall님, jw8704님 모두 감사합니다.
지금 snowall 님이 걸어주신 링크를 번역본, 원본으로 인쇄해서 보고 있는 중입니다.
이해하지 못하는 부분이 생기면 다시 답글로 질문 드려볼게요. 감사합니다 ㅎㅎ
저는 이렇게 생각했습니다.
댓글 달기