파일을 열고 읽어야하는 Linux 커널 모듈을 작성 중입니다. 그 일을 수행하는 가장 좋은 방법은 무엇입니까? 당신이 open
/read
/close
시스템 호출에 relavent 함수 포인터에 대한 포인터를 얻을 수 있습니다 가정Linux 커널 모듈의 파일 I/O
답변
파일을 여는 이유는 무엇입니까?
저는 리눅스 개발 (호기심에서 벗어나, 저는 커널 개발자가 아니며 Java를 수행합니다)을 따르기를 좋아합니다. 이전에이 질문에 대한 토론을 보았습니다. 나는 이것에 관해 LKML message를 발견 할 수 있었다, 근본적으로 나쁜 생각을 근본적으로 언급했다. 나는 LWN이 작년에 그것을 커버했다는 것이 거의 긍정적이지만 기사를 찾는 데 어려움을 겪고 있습니다.
개인용 모듈 인 경우 (일부 맞춤 하드웨어의 경우와 같이 모듈을 배포하지 않음)이 작업을 수행 할 수 있지만 기본 코드에 코드를 제출하려는 경우 받아 들여지지 않을 수도 있습니다.
에반 테란 (Evan Teran)은 sysfs를 언급했는데, 나에게 좋은 생각 인 것 같습니다. 좀 더 세밀한 작업을해야한다면 항상 새로운 ioctrl을 만들 수 있습니다.
편집 :
확인, 나는 그것이 Linux Journal 출신, 내가 찾던 문서를 발견했다. 이런 종류의 일을하는 것이 일반적으로 나쁜 생각 인 이유를 설명하고 계속해서 어쨌든 그것을하는 방법을 알려줍니다.
, 당신은 이런 식으로 뭔가를 할 수 :
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_*
"함수 포인터의 I를 만들어야합니다 그래도 보여 줬어. 더 좋은 방법이있을 것이라고 확신하지만이 방법이 효과가 있다고 믿습니다.
Linux Kernel Module Programing Guide에서 sys_call_open에 대한 정보를 찾을 수도 있습니다.
그래, 나는 그것을 살펴 봤다. 덧붙여 말하자면, 나는 open (2) 시스템 호출을 패칭하고, 실제로 패치 된 버전 _inside_을 읽어야한다. – mipadi
일반적으로 말해서, 커널 모듈에서 파일을 읽고 쓰는 것이 필요하다면, 구조적으로 잘못된 일을하고있는 것입니다.
커널 모듈이 사용자 공간 도우미 프로세스와 통신 할 수있게하는 메커니즘 (예 : netlink, 문자 장치 등록)이 있습니다. 사용자 공간 도우미 프로세스는 원하는대로 할 수 있습니다.
사용자 공간에서 열린 파일 설명자를 가져 와서 커널에서 읽고 쓸 수있는 시스템 호출을 구현할 수도 있습니다.
이것은 커널 공간에서 파일을 여는 것보다 낫을 것입니다.
이미 커널 공간에서 파일을 여는 다른 것들이 있습니다 (루프 드라이버가 마음에 듭니까?).
나는 실제로/proc에있는 파일을 읽는 메커니즘을 변경 했으므로 아마도 파일을 직접 읽을 필요가 없을 것이다. – mipadi
/proc 파일 시스템은 개인적인 용도로도 적합하며 쉽게 사용할 수 있습니다.
http://www.linuxtopia.org/online_books/Linux_Kernel_Module_Programming_Guide/x773.html
가능한 복제 (http://stackoverflow.com/questions/1184274/how-to-read-write-files-within-a-을 [리눅스 커널 모듈 내에서 파일을 쓰기?/읽는 방법] linux-kernel-module) –