저도 현재 커널 개발 공부를 열심히 하고 있는 공학도입니다. 이호님의 웹사이트에서 좋은 정보를 얻곤 합니다. :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);
}
[답글] 커널 모드에서 사용자 모드의 DS(데이타 세그먼트) 접근
*이호님의 글을 참고하였음을 밝힙니다. :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)]
댓글 달기