Linux 커널 모듈의 파일 I/O
-
07-07-2019 - |
문제
파일을 열고 읽어야하는 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()
모듈에 포함시킬 수있는 기능.
그리고 언제나 그렇듯이 파일의 내용을 캐스팅 하여이 기능을 사용하여 공허 포인터 대신 문자 포인터에 파일 내용을 저장할 수 있습니다.