커널에서 파일 억세스하기

young93의 이미지

안녕하세요.

드라이버 모듈에서 파일을 억세스하려고 하는데
잘 안되네요.

여기저기 찾아 보니까
filp_open, generic_file_open 을 쓰면될것 같은데,
filp_open으로 파일을 열면
-14번 에러(EFAULT:Bad Address)가 발생합니다.

그래서 sys_open을 써보았는데, 마찬가지이고요.

물론 함수 파라미터는 맞는걸 확인했습니다.

모듈에서 파일 억세스를 하는데 어떤 제한 사항이 있나요?

조언 부탁드립니다.

new5244의 이미지

Quote:
filp_open, generic_file_open 을 쓰면될것 같은데,
filp_open으로 파일을 열면

System call 서비스 이므로 Parameter 가 user 영역에 있어야 합니다.

Quote:
-14번 에러(EFAULT:Bad Address)가 발생합니다.

그래서 위와 같은 에러가 발생합니다...

get_ds(), set_ds() 커널 함수를 이용하면 위 문제를 해결할 수 있습니다.

Linux Device Driver 책에 관련 내용 있을 것입니다.

from saibi

young93의 이미지

new5244 wrote:

get_ds(), set_ds() 커널 함수를 이용하면 위 문제를 해결할 수 있습니다.

한참 찾아도 못 찾았는데, 이곳에 글을 올린 다음에
다른 곳에서 찾았습니다.
자문자답이 될뻔했네요.

예를들면 이렇게 하면 된답니다.

mm_segment_t oldfs;

oldfs = get_fs();
set_fs(get_ds());

// use functions expecting user space pointers

set_fs(oldfs);

전에 비슷한 코드를 본적이 있는데 뭐하는 건지는
모르고 그냥 넘어 갔습니다.
이제야 확실히 알겠군요.

답변주셔서 감사합니다.

wonsmon의 이미지