2017-03-25 1 views
0

이것은 커널에서 파일에 쓰는 코드입니다. (커널에서 직접 읽고 쓰는 것이 좋지는 않지만 단지 테스트에 불과합니다.)vfs_write는 커널 패닉을 야기합니다.

static void write_startup_file(char *startstring) 
{ 
    mm_segment_t oldfs; 
    struct file *f; 
    loff_t pos=0; 

    f = filp_open("/bin/startupcheck",O_WRONLY|O_CREAT, 0644); 
    oldfs = get_fs(); 
    set_fs (KERNEL_DS); 
    if(f) 
    { 
    vfs_write(f,startstring, strlen(startstring), &pos); 
    set_fs(oldfs); 
    filp_close(f, NULL); 
    } 
    else 
    printk(KERN_CRIT "Unable to open startfile...\n"); 
} 

와 나는 dbval 내가 커널을 컴파일하고 (필자는 VM웨어에 실행)를 실행할 때 read.But되는 값입니다

if(dbval==NULL) { write_startup_file("FAILED");} 

같은 다른 기능 ourVeryOwnFunction()에 문의하십시오. 내가받는 커널 패닉은 here

분명히 뭔가 잘못되었습니다. 도움이 필요하십니까? 감사.

+0

'filp_open '이 실패하면'old_fs'는 어떻게 될까요? – MirkoBanchi

답변

1

먼저 struct file * 포인터를 초기화하십시오. NULL에 대해 반환 된 포인터의 간단한 확인에 의존하지 마십시오. 대신 IS_ERR 매크로를 사용하십시오. 솔직히, 일반적으로 다른 무엇이 잘못되었을지를 말하기는 어렵습니다. 이 http://ytliu.info/notes/linux/file_ops_in_kernel.html 같은 것을 읽거나 File I/O in a Linux kernel module

How to read/write files within a Linux kernel module?

어쩌면 그것은 당신에게 몇 가지 통찰력을 제공 또는 물건에 대한 몇 가지 실마리를 SO에 이러한 질문을 참조하십시오. 그리고 커널의 fs에 쓰지 마라.

HTH.

+0

필자는 필자가'filp_open '전에'set_fs()'를 모두 만들고,'struct file *'을 초기화했고'IS_ERR' 매크로를 사용하여 파일을 열어 보았지만'vfs_read'에서 여전히 커널 패닉이 발생했습니다. – linuxnoob

+0

다시 한번, 귀하의 경우에 공포의 원인을 밝히기가 어렵습니다. 완전한 소스 코드에 액세스하지 않고 특정 조건에 대한 추가 지식 없이는 항상 어렵습니다. 이것은 특히 커널에 해당됩니다. 여기에 작고 오묘한 테스트 커널 모드 작성자 http://pastebin.com/kPPLqdcd이 작은 편의'file_xxx' API를 사용할 수 있습니다. 삽입 후, 모듈은'/ root/test.txt' 파일을 생성하고 커널에서 그것을 쓴다. 언로드하면 파일로부터 6 바이트를 읽고 그것을 닫는다. dmesg를 사용하여 작성자를 관찰하십시오. gcc 6.3으로 빌드 된 Linux 4.10.5 x86-64에서 테스트되었습니다. HTH. – rfx

+0

그리고'filp_open()'과'get | set_fs()'. 내 잘못이야. 부름 명령에 아무런 문제가 없습니다. 그러나'vfs_write()'와'vfs_read()'같은 루틴에서는 여전히 중요합니다. – rfx

관련 문제