0

我是驱动程序编程的新手,我开始编写简单的字符驱动程序。然后我为我的字符驱动程序mknod /dev/simple-driver c 250 0创建了特殊文件。当它键入cat /dev/simple-driver时。它显示字符串“来自内核模式的Hello world!”。我知道那个功能

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;
    }

被调用。这被映射到我的驱动程序的 file_opreation 结构中的 (*read)。我的问题是如何调用这个函数,如何传递 struct file、char、count、offset 等参数 bcoz 是我只是键入了 cat 命令。请详细说明这是怎么发生的

4

2 回答 2

0

在 Linux 中,所有内容都被视为文件。文件的类型,是驱动文件还是普通文件,取决于它的挂载点。例如:如果我们考虑您的情况:cat /dev/simple-driver遍历设备文件的挂载点。

  • 它从设备文件名simple-driver中检索主要和次要编号。

  • 从这些编号(尤其是次要编号)中,它将驱动程序文件关联到您的字符驱动程序。

  • 从驱动程序中,它使用struct file ops结构来查找读取函数,这不过是您的读取函数:

static ssize_t device_file_read(struct file *file_ptr, char __user *user_buffer, size_t count, loff_t *possition)

  • User_buffer 将始终采用 sizeof( size_t count)。最好检查缓冲区(在某些情况下它会引发警告)
  • 字符串被复制到 User_buffer(copy_to_user用于在复制操作期间检查内核标志)。
  • 第一个副本的位置为 0,它按 count:position+=count 的顺序递增。

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

于 2013-03-24T13:32:25.873 回答
0

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

于 2013-03-25T23:26:27.390 回答