2012-12-29 2 views
1

proc을 사용하면이 예제에서와 같이 write & write 시스템 호출을 쉽게 사용할 수 있습니다. write on /proc entry through user space디바이스 드라이버에서 디버그 ---에 데이터를 쓰십시오.

하지만 debugfs를 사용하여 드라이버에서 사용자 공간으로 정보를 전달하고 있습니다. 이 두 예제 코드를 찾을 수 있습니다. 여기서 응용 프로그램은 mmap() 시스템 호출을 사용하여 debugfs 파일을 읽고 쓸 수 있습니다. http://people.ee.ethz.ch/~arkeller/linux/code/mmap_user.c

http://people.ee.ethz.ch/~arkeller/linux/code/mmap_simple_kernel.c

    • 그러나 debugfs의 장치 드라이버 파일을 사용하여 통신하는 내 경우 요구 사항에 가정 :

      user-space application <-------> debugfs file <-------> Device driver 
      
      1. 그래서 내가 동일한 코드 mmap_simple_kernel를 사용할 수 있습니다. c --- 내 장치 드라이버 코드 --- >> 및 tr 드라이버에서 직접 debugfs로 데이터를 전송 하시겠습니까? 그러나이 경우에는 드라이버에 두 개의 file_operations 구조가 생겨 어떤 문제가 발생합니까? 올바른 접근인가?

      2. 또는 응용 프로그램이 다음과 같은 프로세스 인 경우 - mmap_user.c --- 동일한 프로세스 - 내 장치 드라이버 프로그램을 따르십시오. 그리고 debugfs 항목에 대한 seprate 모듈로 mmap_simple_kernel.c를 유지 하시겠습니까? kmemleak는 mm/kmemleak.c에 debugfs의를 사용하는 방법

  • +0

    당신은) (읽기'와'사용할 수있는 해결 방법으로 file_operation 구조체에

    사용 debugfs_create_file_unsafe()를 .mmap 필드를 무시합니다'쓰기()'파일을 debugfs에 저장한다. 예를 들어 더 많은 양의 데이터를 전달해야한다면'mmap()'이 유용 할 수 있지만, 반드시 사용해야하는 것은 아니다. – Eugene

    +0

    내 프로젝트 중 하나에서 debugfs 파일을 사용하여 사용자 공간에 일부 데이터를 제공하고 커널 공간 시스템을 제어합니다. 예를 들어 [this file] (http://code.google.com/p/)을 참조하십시오. kernel-strider/source/browse/sources/core/resolve_ip.c). debugfs (_ "i_addr"_, _ "func_name"_ 및 _ "func_i_start"_)에 3 개의 파일이 만들어지고 첫 번째 파일은 쓰기 가능이고 나머지 두 파일은 읽기 전용입니다. 'debugfs_create_file()'이 거기에서 어떻게 사용되는지를 보라. 나는 또한 다른 [debugfs_create _ \ * functions] (http://lxr.free-electrons.com/source/include/linux/debugfs.h)를 볼 것을 제안 할 것이지만, 그들은 당신의 필요에 더 잘 맞을 것이다. – Eugene

    +0

    'mmap()'을 사용하는 또 다른 예로서, 링크는 [이 주석에서] (http://stackoverflow.com/questions/11501527/ioctl-vs-netlink-vs-memmap-to-communicate-between- 커널 공간 및 사용자 공간 # comment15219915_11501527). 당신이 성취하고자하는 것에 따라 이것은 유용 할 수 있습니다. – Eugene

    답변

    2

    당신은 좀 걸릴 수 있습니다 :

    static const struct seq_operations kmemleak_seq_ops = { 
         .start = kmemleak_seq_start, 
         .next = kmemleak_seq_next, 
         .stop = kmemleak_seq_stop, 
         .show = kmemleak_seq_show, 
    }; 
    
    static int kmemleak_open(struct inode *inode, struct file *file) 
    { 
         return seq_open(file, &kmemleak_seq_ops); 
    } 
    
    static int kmemleak_release(struct inode *inode, struct file *file) 
    { 
         return seq_release(inode, file); 
    } 
    
    static ssize_t kmemleak_write(struct file *file, const char __user *user_buf, 
               size_t size, loff_t *ppos) 
    {...} 
    
    static const struct file_operations kmemleak_fops = { 
         .owner   = THIS_MODULE, 
         .open   = kmemleak_open, 
         .read   = seq_read, 
         .write   = kmemleak_write, 
         .llseek   = seq_lseek, 
         .release  = kmemleak_release, 
    }; 
    
    
    dentry = debugfs_create_file("kmemleak", S_IRUGO, NULL, NULL, 
              &kmemleak_fops); 
    
    1

    이 질문의 mmap의 debugfs의에 대한 구글의 상위 검색 결과입니다. 여기에 중요한 정보를 추가하고 있습니다. 커널이 https://lkml.org/lkml/2016/5/21/73 포스트 debugfs_create_file()에 따르면 4.8.0 이상이

    관련 문제