基本介绍
在操作系统中,设备分为两种:字符设备和块设备。字符设备包括键盘、鼠标等,块设备包括硬盘。字符设备驱动的作用就是将系统内核与字符设备连接起来,使用户可以通过系统调用来读写字符设备。
在Linux中,设备文件被视为文件系统的一部分,位于/dev目录下。字符设备对应的设备文件类型是“c”,使用mknod命令可以创建字符设备文件。如:mknod /dev/mydev c 246 0 表示创建一个名为mydev的字符设备文件,它的主设备号是246,次设备号是0。
在本视频中,我们将会深入了解字符设备驱动的工作原理,并通过图解来演示一个简单的字符设备驱动程序的编写过程。
驱动程序基本结构
字符设备驱动程序结构很简单,由两个主要的函数组成:初始化函数和I/O操作函数。初始化函数在驱动程序装载时调用,它会注册字符设备,指明其对应的主设备号和次设备号,并建立与I/O操作函数之间的关系。操作函数包括read()和write()两种操作函数,分别用于读取和写入字符设备的数据。
初始化函数主要是使用register_chrdev()函数完成注册操作,需要包含头文件
实战演练
在本视频中,我们将会通过图解的方式来演示一个简单的字符设备驱动程序的编写过程。首先,在用户空间下创建一个设备文件,名为“mydev”:
$ mknod /dev/mydev c 246 0
接着,在内核空间下创建一个字符设备驱动程序,源代码如下:
```c MODULE_LICENSE("Dual BSD/GPL"); static int major; static int mydev_open(struct inode *indode, struct file *file) static int mydev_release(struct inode *inode, struct file *file) static ssize_t mydev_read(struct file *file, char *buf, size_t count, loff_t *ppos) static ssize_t mydev_write(struct file *file, const char *buf, size_t count, loff_t *ppos) static struct file_operations mydev_fops = static int init_mydev_module(void) if (major < 0) { printk("failed to register device: %d\n", major); return major; } printk("mydev module loaded!\n"); return 0;}static void cleanup_mydev_module(void){ unregister_chrdev(major, "mydev"); printk("mydev module cleaned up!\n");}module_init(init_mydev_module);module_exit(cleanup_mydev_module);``` 在上述代码中,我们定义了mydev_fops结构体,指明了所有的I/O操作函数;同时初始化函数init_mydev_module中,我们使用register_chrdev()函数完成了驱动程序的注册操作,注册好的驱动程序会接受来自用户空间的I/O操作。 需要注意的是,在使用load驱动程序后,我们需要进入/dev目录将设备文件的访问权限更改为可写才能够对设备文件进行读、写操作。如: $ sudo chmod 666 /dev/mydev 通过以上步骤,我们就成功地实现了一个简单的字符设备驱动程序。 本文来自投稿,不代表亲测学习网立场,如若转载,请注明出处:https://www.qince.net/arm-bnf.html 郑重声明: 本站所有内容均由互联网收集整理、网友上传,并且以计算机技术研究交流为目的,仅供大家参考、学习,不存在任何商业目的与商业用途。 若您需要商业运营或用于其他商业活动,请您购买正版授权并合法使用。 我们不承担任何技术及版权问题,且不对任何资源负法律责任。 如遇到资源无法下载,请点击这里失效报错。失效报错提交后记得查看你的留言信息,24小时之内反馈信息。 如有侵犯您的版权,请给我们私信,我们会尽快处理,并诚恳的向你道歉!
#include
{
printk("mydev_open\n");
return 0;
}
{
printk("mydev_release\n");
return 0;
}
{
printk("mydev_read\n");
return 0;
}
{
printk("mydev_write\n");
return count;
}
{
.owner = THIS_MODULE,
.open = mydev_open,
.release = mydev_release,
.read = mydev_read,
.write = mydev_write,
};
{
major = register_chrdev(0, "mydev", &mydev_fops);