[File-io] Linux 커널 모듈의 파일 I / O


Answers

파일을 여는 이유는 무엇입니까?

나는 리눅스 개발 (호기심에서 벗어난, 나는 커널 개발자가 아니며, 나는 자바 다.)을 따르기를 좋아한다. 나는 전에이 문제에 대한 논의를 보았다. 나는 이것에 관한 LKML 메시지 를 발견 할 수 있었고, 기본적으로 나쁜 생각이라고 언급했다. 나는 LWN이 작년에 그것을 커버했다는 것이 거의 긍정적이지만 기사를 찾는 데 어려움을 겪고 있습니다.

이 모듈이 개인용 모듈 인 경우 (일부 맞춤 하드웨어의 경우와 같이 모듈이 배포되지 않음)이 작업을 수행 할 수는 있지만 기본 코드에 코드를 제출하려는 경우 받아 들여진다.

Evan Teran은 sysfs에 대해 언급했습니다. 이것은 나에게 좋은 생각입니다. 좀 더 세밀한 작업을해야한다면 항상 새로운 ioctrl을 만들 수 있습니다.

편집하다:

좋아, 나는 찾고 있던 기사를 발견했다. 그것은 Linux Journal 에서 나온 것이다. 이런 종류의 일을하는 것이 일반적으로 나쁜 생각 인 이유를 설명하고 계속해서 어쨌든 그것을하는 방법을 알려줍니다.

Question

나는 파일을 열고 읽어야하는 리눅스 커널 모듈을 작성 중이다. 그 일을 수행하는 가장 좋은 방법은 무엇입니까?




relavent 함수 포인터에 대한 포인터를 open / read / close 시스템 호출 포인터로 가져올 수 있다고 가정하면 다음과 같이 할 수 있습니다 :

mm_segment_t fs = get_fs();
set_fs(KERNEL_DS);

fd = (*syscall_open)(file, flags, mode);
if(fd != -1) {
    (*syscall_read)(fd, buf, size);
    (*syscall_close)(fd);
}
set_fs(fs);

당신은 " syscall_* "함수 포인터를 만들 필요가있다. 더 좋은 방법이있을 것이라고 확신하지만이 방법이 효과가 있다고 믿습니다.







일반적으로 말하자면, 커널 모듈에서 파일을 읽거나 쓰려면, 구조적으로 잘못된 일을하고있는 것입니다.

커널 모듈이 사용자 공간 도우미 프로세스와 대화 할 수있게하는 메커니즘 (예 : netlink, 또는 문자 장치 등록)이 존재합니다. 사용자 공간 도우미 프로세스는 원하는대로 할 수 있습니다.

사용자 공간에서 열린 파일 디스크립터를 가져 와서 커널에서 읽고 쓸 수있는 시스템 호출을 구현할 수도있다.

이것은 아마도 커널 공간에서 파일을 열려고 시도하는 것보다 낫을 것입니다.

이미 커널 공간에서 파일을 여는 다른 것들이 있습니다 (루프 드라이버가 마음에 듭니까?).