문제

파일을 열고 읽어야하는 Linux 커널 모듈을 작성하고 있습니다. 그것을 달성하는 가장 좋은 방법은 무엇입니까?

도움이 되었습니까?

해결책

왜 파일을 열려고하는지 물어봐도 될까요?

나는 Linux 개발 (호기심으로 인해 커널 개발자가 아니고 Java를합니다)을 따르고 싶습니다. 그리고 나는이 질문에 대한 논의를 전에 보았습니다. 나는 찾을 수 있었다 LKML 메시지 이것에 대해, 기본적으로 그것은 일반적으로 나쁜 생각입니다. LWN이 작년에 그것을 다루었다는 것은 거의 긍정적이지만 기사를 찾는 데 어려움을 겪고 있습니다.

이것이 개인 모듈 인 경우 (일부 사용자 정의 하드웨어 및 모듈이 배포되지 않음)이 작업을 수행 할 수 있지만, 코드를 메인 라인에 제출하려는 경우에는 그렇지 않을 수 있습니다. 받아 들여집니다.

에반 테란 (Evan Teran)은 SYSFS를 언급했습니다. 정말로 더 어려운 사용자 정의 작업을해야한다면 항상 새로운 IOCTRL을 만들 수 있습니다.

편집하다:

좋아, 내가 찾고 있던 기사를 찾았는데 리눅스 저널. 왜 이런 종류의 일을하는 것이 일반적으로 나쁜 생각인지 설명하고, 어쨌든 어떻게 해야하는지 정확히 알려줍니다.

다른 팁

당신이 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 또는 캐릭터 장치를 등록)이 있습니다. 그 사용자 공간 도우미 프로세스는 원하는대로 할 수 있습니다.

또한 사용자 공간에서 열린 파일 디스크립터를 가져 와서 커널에서 읽고 쓰기 위해 시스템 호출 (또는 같은)을 구현할 수도 있습니다.

이것은 커널 공간에서 파일을 열려고하는 것보다 깔끔 할 것입니다.

커널 공간에서 이미 파일을 열어 놓은 다른 것들이 있습니다. 당신은 그것들을 볼 수 있습니다 (루프 드라이버가 떠오르고 있습니까?).

이것에서 sys_call_open에 대한 정보를 찾을 수도 있습니다. Linux 커널 모듈 프로그래밍 안내서.

/Proc FileSystem은 개인 용도에도 적합하며 쉽습니다.
http://www.linuxtopia.org/online_books/linux_kernel_module_programming_guide/x773.html

모든 커널 개발자는 커널 공간의 파일 I/O가 나쁘다고 말하지만 (특히 경로별로 이러한 파일을 참조하는 경우) 주류 커널은 펌웨어를로드 할 때이를 수행합니다. 파일에서 읽어야하는 경우

kernel_read_file_from_path(const char *path, void **buf, loff_t *size, loff_t max_size, enum kernel_read_file_id id)

기능, 펌웨어 로더 코드가 사용하는 것입니다. include/linux/fs.h. 이 함수는 오류에서 음수 값을 반환합니다.

나는 실제로 요점을 확신하지 못한다 id 결국 변수, 코드를 보면 실제로 사용되지 않으므로 다음과 같은 것을 넣으십시오. READING_FIRMWARE 거기 (인용문 없음).

buf NULL이 종료되지 않고 대신 크기를 나타냅니다. size. 널 종료되기 위해 필요한 경우 문자열을 만듭니다. size + 1 바이트 길이가 길고 복사하거나 다시 작성하십시오 kernel_read_file() 기능 (사용 kernel_read_file_from_path(), 정의 된 fs/exec.c) 그리고 하나를 추가하십시오 i_size 메모리가 할당되는 곳. (이 작업을 수행하려면 재정의 할 수 있습니다. kernel_read_file() 전체 커널 수정을 피하기 위해 다른 함수 이름으로 모듈의 함수.)

파일에 편지를 써야한다면 kernel_write() 기능 (유사합니다 kernel_read(), 이에 의해 사용됩니다 kernel_read_file() 따라서 또한 kernel_read_file_from_path()), 그러나 아니요 kernel_write_file() 또는 kernel_write_file_from_path() 기능. 당신은 코드를 볼 수 있습니다 fs/exec.c Linux 커널 소스 트리에 파일을 파일하십시오 kernel_read_file() 그리고 kernel_read_file_from_path() 자신의 글을 쓰도록 정의됩니다 kernel_write_file() 그리고 kernel_write_file_from_path() 모듈에 포함시킬 수있는 기능.

그리고 언제나 그렇듯이 파일의 내용을 캐스팅 하여이 기능을 사용하여 공허 포인터 대신 문자 포인터에 파일 내용을 저장할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top