2008-11-08 1 views
18

파일을 열고 읽어야하는 Linux 커널 모듈을 작성 중입니다. 그 일을 수행하는 가장 좋은 방법은 무엇입니까? 당신이 open/read/close 시스템 호출에 relavent 함수 포인터에 대한 포인터를 얻을 수 있습니다 가정Linux 커널 모듈의 파일 I/O

+0

가능한 복제 (http://stackoverflow.com/questions/1184274/how-to-read-write-files-within-a-을 [리눅스 커널 모듈 내에서 파일을 쓰기?/읽는 방법] linux-kernel-module) –

답변

30

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

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

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

에반 테란 (Evan Teran)은 sysfs를 언급했는데, 나에게 좋은 생각 인 것 같습니다. 좀 더 세밀한 작업을해야한다면 항상 새로운 ioctrl을 만들 수 있습니다.

편집 :

확인, 나는 그것이 Linux Journal 출신, 내가 찾던 문서를 발견했다. 이런 종류의 일을하는 것이 일반적으로 나쁜 생각 인 이유를 설명하고 계속해서 어쨌든 그것을하는 방법을 알려줍니다.

+0

그것은 맞춤 모듈이며 배포되지 않습니다.inodes => 체크섬 매핑을 포함하는 파일을 열어야합니다. – mipadi

+1

@mipadi : 내가 생각했던 기사를 발견했다. 커널에서 파일을 열고 읽는 법을 정확하게 설명한다. ("do not do this"부분 이후). 나는 그것을 반영하고 링크를 포함하기 위해 내 게시물을 편집했습니다. 행운을 빕니다. – MBCook

8

, 당신은 이런 식으로 뭔가를 할 수 :

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를 만들어야합니다 그래도 보여 줬어. 더 좋은 방법이있을 것이라고 확신하지만이 방법이 효과가 있다고 믿습니다.

1

Linux Kernel Module Programing Guide에서 sys_call_open에 대한 정보를 찾을 수도 있습니다.

+0

그래, 나는 그것을 살펴 봤다. 덧붙여 말하자면, 나는 open (2) 시스템 호출을 패칭하고, 실제로 패치 된 버전 _inside_을 읽어야한다. – mipadi

2

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

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

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

이것은 커널 공간에서 파일을 여는 것보다 낫을 것입니다.

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

+0

나는 실제로/proc에있는 파일을 읽는 메커니즘을 변경 했으므로 아마도 파일을 직접 읽을 필요가 없을 것이다. – mipadi