我是驱动程序编程的新手我开始编写简单的char驱动程序。然后我为我的char驱动程序 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命令。 。请详细说明这是怎么发生的
答案 0 :(得分: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)
size_t count
)。最好检查缓冲区(在某些情况下会抛出警告)copy_to_user
用于在复制操作期间检查内核标志。)一旦读取函数将缓冲区返回给cat。和cat刷新std_out上的缓冲区内容,这只是你的控制台。
答案 1 :(得分:0)
cat将使用glibc的一些posix版本的read调用。 Glibc会将参数放在堆栈或寄存器中(这取决于您的硬件架构)并将切换到内核模式。在内核中,值将被复制到内核堆栈。最后,您的读取功能将被调用。