Linux kernel 关于如何在简单字符驱动程序中向read函数传递参数

Linux kernel 关于如何在简单字符驱动程序中向read函数传递参数,linux-kernel,linux-device-driver,device-driver,kernel-module,kernel,Linux Kernel,Linux Device Driver,Device Driver,Kernel Module,Kernel,我是驱动程序编程新手,我开始编写简单的字符驱动程序。然后我为我的char驱动程序mknod/dev/simple driver c 250 0创建了一个特殊文件。它显示字符串“Hello world from Kernel mode!”。我知道这个函数 static const char g_s_Hello_World_string[] = "Hello world tamil_vanan!\n\0"; static const ssize_t g_s_Hello_World_si

我是驱动程序编程新手,我开始编写简单的字符驱动程序。然后我为我的char驱动程序mknod/dev/simple driver c 250 0创建了一个特殊文件。它显示字符串“Hello world from Kernel mode!”。我知道这个函数

static const char    g_s_Hello_World_string[] = "Hello world tamil_vanan!\n\0";
    static const ssize_t g_s_Hello_World_size = sizeof(g_s_Hello_World_string);


    static ssize_t device_file_read(
                   struct file *file_ptr
                , char __user *user_buffer
                , size_t count
                , loff_t *possition)
    {
       printk( KERN_NOTICE "Simple-driver: Device file is read at offset = 
           %i, read bytes count = %u", (int)*possition  , (unsigned int)count );

       if( *possition >= g_s_Hello_World_size )
          return 0;

       if( *possition + count > g_s_Hello_World_size )
          count = g_s_Hello_World_size - *possition;

        if( copy_to_user(user_buffer, g_s_Hello_World_string + *possition,         count) != 0              )
          return -EFAULT;   

       *possition += count;
       return count;
    }

就是被叫。这被映射到我的驱动程序的文件结构中的(*read)。我的问题是如何调用此函数,结构文件、字符、计数、偏移量等参数是如何传递的,因为我只需键入cat命令。请说明在Linux中如何将这一切视为文件。文件的类型,无论是驱动程序文件还是普通文件,都取决于其装入的装入点。 对于EG:如果我们考虑您的情况:<代码> CAT/DEV/简单驱动程序< /代码>遍历设备文件的挂载点。
  • 从设备文件名
    简单驱动程序
    中检索主要和次要编号

  • 从这些数字(特别是从次要数字),它将关联角色驱动程序的驱动程序文件

  • 从驱动程序中,它使用
    struct file ops
    structure查找读取函数,该函数只不过是您的读取函数:

static ssize\u t device\u file\u read(结构文件*文件ptr、字符用户*用户缓冲区、大小计数、loff\u t*位置)

  • 用户缓冲区将始终采用sizeof(
    size\t count
    )。最好检查缓冲区(在某些情况下,它会抛出警告)
  • 字符串被复制到用户缓冲区(
    copy\u to\u User
    用于在复制操作期间检查内核标志)
  • 第一次复制的位置为0,并按计数顺序递增:位置+=计数

一旦读取,函数将缓冲区返回cat。cat会在std_out上刷新缓冲区内容,std_out只不过是您的控制台。

cat将使用来自glibc的posix版本的read调用。Glibc将把参数放在堆栈或寄存器中(这取决于您的硬件架构),并将切换到内核模式。在内核中,这些值将被复制到内核堆栈中。最后,您的读取函数将被调用。

Hi,您的模块已插入。“cat”命令用于从文件中读取数据并将其转储到控制台上。由于内核中的所有内容都是文件,“/dev/simple driver”设备节点是一个特殊的文件,它包含诸如主编号和次编号之类的信息。在您的init函数中,您将使用主要的no、驱动程序名和文件操作注册您的驱动程序,所以“cat”指向驱动程序的read函数。Echo映射到驱动程序的写入函数。即使我这样认为,我仍然对用户缓冲区、占有参数有疑问。缓冲区是一种用户空间内存,它的指针被发送到内核空间以复制数据,位置被用来跟踪到目前为止复制的元素数(char)。我认为这是一个很好的解释,因为这是一个简单的c函数,从内核的角度来看,唯一需要知道的是缓冲区的位置以及使用位置的原因(解释很清楚)。此外,如果您有任何疑问,请将一些printk和printf用于打印缓冲区地址和位置计数器值。