커널내부(파일시스템 레벨)에서 디스크접근하려면...?

you의 이미지

다시말해서 open, read를 사용못하구요
디스크에 접근하여 읽어들일 데이터가 있는데...
어떻게 해야할지 난감하네요
ll_rw_block() 같은 함수를 사용하려고 했더니
디스크의 어느부분에 접근할지...안될거같고...

예를들어
커널내에서 /dev/hda7의 첫번째블록을 읽어들이고자 한다면
그에 해당하는 함수나 무슨 방법이 없을까요?
아, 그리고 커널에 붙일 모듈프로그램입니다.

부탁드립니다.

박계현의 이미지

*이호님의 글을 참고하였음을 밝힙니다. :shock:

저도 현재 커널 개발 공부를 열심히 하고 있는 공학도입니다. 이호님의 웹사이트에서 좋은 정보를 얻곤 합니다. :arrow: (http://linuxkernel.net)

위에 적힌 웹사이트에서 필요하신 정보 많이 얻어가시기 바랍니다. :lol:

[방법 순서를 정해봤습니다.]

1. 커널 모드에서 사용자 모드에서의 DS(데이타 세그먼트)를 FS(데이타 세그먼
트) 셀렉터에 저장(유지)한다.
mm_segment_t oldfs = get_fs();
2. DS(데이타 세그먼트)를 KERNEL_DS(커널 모드의 데이타 세그먼트)로 교체를 한다.
set_fs(KERNEL_DS);
3. 그래서 사용자 모드에서 커널 모드로 진입하는 데이타들은 커널의 주소 공간에 들어 있게 된다.

4. 커널 모드에서 사용자 모드 데이타를 접근할 때는 저장된 FS 셀렉터를 참조한다.
mm_segment_t oldfs;
5. 따라서 커널 모드에서 FS 셀렉터를 일시적으로 KERNEL_DS 로 고침으로써 서비스 루틴에서 커널 주소 공간에 있는 데이터를 접근할 수 있게 할 수 있다.

6. 원래 대로 돌려놓기
set_fs(oldfs);

[예 - 쓰기(write)]

if ( (filep = filep_open("/tmp/testfile", O_CREAT | O_WRONLY | O_TRUNC, S_IRUGO | S_IWUSR)) != NULL)
{
   /* 사용자 모드에서의 DS를 얻은 후, FS 셀렉터에 저장한다. */
   oldfs = get_fs();           
   
   /* 사용자 모드의 DS를 KERNEL_DS로 교체한다. */
   set_fs(KERNEL_DS);

   /* buf에 있는 내용을 filp 디스크립터에 0 위치부터 buf 길이만큼 쓴다. */
   writelen = filp->f_op->write(filp, buf, strlen(buf), &filp->f_pos);

   /* 사용자 모드의 DS를 아까 저장해둔 FS 셀렉터로 되돌린다. */
   set_fs(oldfs);
   
   /* 파일 디스크립터를 해제한다. */
   fput(filp);
}