2013-09-23 2 views
2

이 링크 (http://www.spinics.net/lists/newbies/msg41016.html)를 발견 했으니 까. 나는이 문서에서보고 된 이후 난 정말 혼란 스러워요 그래서리눅스 커널에서 파일의 크기를 어떻게 얻습니까?

/root/kernelmodule/hello.c:15: warning: passing argument 1 of ‘vfs_getattr’ from incompatible pointer type 
include/linux/fs.h:2563: note: expected ‘struct vfsmount *’ but argument is of type ‘struct path *’ 
/root/kernelmodule/hello.c:15: warning: passing argument 2 of ‘vfs_getattr’ from incompatible pointer type 
include/linux/fs.h:2563: note: expected ‘struct dentry *’ but argument is of type ‘struct kstat *’ 
/root/kernelmodule/hello.c:15: error: too few arguments to function ‘vfs_getattr’ 

:

#include <linux/path.h> 
#include <linux/namei.h> 
#include <linux/fs.h> 

struct path p; 
struct kstat ks; 
kern_path(filepath, 0, &p); 
vfs_getattr(&p, &ks); 
printk(KERN_INFO "size: %lld\n", ks.size); 

때문에 컴파일되지 않습니다 : 그래서 커널 모듈에 코드를 작성 지금 http://lxr.free-electrons.com/source/fs/stat.c#L40

및 I /linux/fs.h에서 vfs_getattr의 프로토 타입은 다음과 같습니다.

extern int vfs_getattr(struct vfsmount *, struct dentry *, struct kstat *); 

아무도 내 구현 도와 드릴까요? 나는 vfsmount와 dentry를 읽고 있지만 여전히 길을 잃고 있습니다.

+1

"리눅스 커널에서"- 커널 랜드 코드를 작성하려고한다는 뜻입니까? 그렇지 않다면, 단지'stat()'또는'ftell()'. –

+1

예 이것은 커널 모듈 내부에 있습니다. – wright8191

답변

3

이 기능은 사용중인 커널 버전에 따라 호출이 변경됩니다. 두 개의 논의 버전은 3.8과 3.9 사이에 도입되었습니다. 그러므로 커널 3.8이나 그 이전 버전을 사용한다면 "세 개의 인수"가 필요하고 이후에는 두 개의 인수가 필요합니다.

당신이 정말로 3.9보다 오래된 커널, 커널 모드에서이 작업을 수행하려는 경우, 당신은 눈살을 찌푸리게되는 커널 내부의 파일을 처리, 그러나 vfs_fstat 또는 vfs_stat

를 사용하는 것이 더하고 있습니다 더 나은 대안이 없는지 고려해보십시오. 예를 들어 시스템에있는 보드의 메모리에 파일을로드하려는 경우 사용자 모드 프로세스에서 파일을로드 할 수 있습니다. 그런 다음로드 된 부분을 일부 개인 IOCTL 유형 기능을 통해 커널에 전달하십시오. 이것은 훨씬 "커널 친화적"이며, 전반적인 커널 소스 코드에 드라이버/모듈을 포함 시키려고 계획하고 있다면 아마도 이것을해야 할 것입니다.

+0

응답 해 주셔서 감사합니다. vfs_fstat에 전달할 파일 디스크립터를 어떻게 얻을 수 있습니까? @ MatPetersson – wright8191

+0

아마도 파일을여시겠습니까? 그것은 전통적으로 그것이 완료되는 방식입니다 ...;) –

관련 문제