<script>function StorePage(){d=document;t=d.selection?(d.selection.type!='None'?d.selection.createRange().text:''):(d.getSelection?d.getSelection():'');void(keyit=window.open('http://www.365key.com/storeit.aspx?t='+escape(d.title)+'&u='+escape(d.location.href)+'&c='+escape(t),'keyit','scrollbars=no,width=475,height=575,left=75,top=20,status=no,resizable=yes'));keyit.focus();}</script>
作者:刘洪涛,华清远见嵌入式培训中心讲师。
在Linux2.6内核中,devfs被认为是过时的方法,并最终被抛弃,udev取代了它。Devfs的一个很重要的特点就是可以动态创建设备结点。那我们现在如何通过udev和sys文件系统动态创建设备结点呢?
下面通过一个实例,说明udev、sys动态创建设备结点的方法。注意代码中红色的部分是为了实现动态创建设备结点添加的。
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/fs.h>
#include <linux/cdev.h>
#include <asm/uaccess.h>
#include <linux/device.h>
MODULE_LICENSE ("GPL");
int hello_major = 252;
int hello_minor = 0;
int number_of_devices = 1;
char data[50]="foobar not equal to barfoo";
struct cdev cdev;
dev_t dev = 0;
static int hello_open (struct inode *inode, struct file *file)
{
printk (KERN_INFO "Hey! device opened\n");
return 0;
}
static int hello_release (struct inode *inode, struct file *file)
{
printk (KERN_INFO "Hmmm... device closed\n");
return 0;
}
ssize_t hello_read (struct file *filp, char *buff, size_t count, loff_t *offp)
{
ssize_t result = 0;
if (copy_to_user (buff, data, sizeof(data)-1))
result = -EFAULT;
else
printk (KERN_INFO "wrote %d bytes\n", count);
return result;
}
ssize_t hello_write (struct file *filp, const char *buf, size_t count, loff_t *f_pos)
{
ssize_t ret = 0;
printk (KERN_INFO "Writing %d bytes\n", count);
if (count>127) return -ENOMEM;
if (count<0) return -EINVAL;
if (copy_from_user (data, buf, count)) {
ret = -EFAULT;
}
else {
data[127]='\0';
printk (KERN_INFO"Received: %s\n", data);
ret = count;
}
return ret;
}
struct file_operations hello_fops = {
.owner = THIS_MODULE,
.open = hello_open,
.release = hello_release,
.read = hello_read,
.write = hello_write
};
struct class *my_class;
static void char_reg_setup_cdev (void)
{
int error, devno = MKDEV (hello_major, hello_minor);
cdev_init (&cdev, &hello_fops);
cdev.owner = THIS_MODULE;
cdev.ops = &hello_fops;
error = cdev_add (&cdev, devno , 1);
if (error)
printk (KERN_NOTICE "Error %d adding char_reg_setup_cdev", error);
/* creating your own class */
my_class =class_create(THIS_MODULE, "farsight_class");//add by lht
if(IS_ERR(my_class)) {
printk("Err: failed in creating class.\n");
return ;
}
/* register your own device in sysfs, and this will cause udevd to create corresponding device node */
class_device_create(my_class,NULL, devno, NULL,"farsight_dev");
// device_create(my_class,NULL, devno,"farsight_dev");
}
static int __init hello_2_init (void)
{
int result;
dev = MKDEV (hello_major, hello_minor);
result = register_chrdev_region (dev, number_of_devices, "test");
if (result<0) {
printk (KERN_WARNING "hello: can't get major number %d\n", hello_major);
return result;
}
char_reg_setup_cdev ();
printk (KERN_INFO "char device registered\n");
return 0;
}
static void __exit hello_2_exit (void)
{
dev_t devno = MKDEV (hello_major, hello_minor);
cdev_del (&cdev);
unregister_chrdev_region (devno, number_of_devices);
class_device_destroy(my_class, devno);
class_destroy(my_class);
}
module_init (hello_2_init);
module_exit (hello_2_exit);v
在编译了驱动后,可以查看/dev/farsight_dev设备结点,和 /sys/class/farsight_class/farsight_dev/ 本代码的测试环境是Ubantu7.04,内核版本是2.6.20-15-generi。在不同版本的内核中,有些系统函数的参数可能不太一样。
分享到:
相关推荐
动态创建 Linux 设备结点使用 udev 和 sys 文件系统 udev 是 Linux 系统中的设备管理器,它可以动态创建设备结点。devfs 是 Linux 早期的设备文件系统,但是在 2.6 内核中,devfs 被认为是过时的方法,并最终被抛弃...
通过这个示例,我们可以了解到如何在Linux环境中利用udev和sysfs动态创建设备节点,以及如何定义和注册字符设备驱动。这在嵌入式系统和ARM技术中尤其重要,因为这些系统通常需要与各种硬件设备进行交互,如传感器、...
“Udev 在 Linux 设备装载时实现易于识别的设备文件名” Linux 操作系统中,设备文件名的命名方式是一种重要的技术难题。随着计算机技术的发展和应用的广泛,计算机挂载的设备越来越多,虽然 Linux 依据设备类型...
总结来说,udev是Linux设备管理的重要组成部分,它提供了对设备的动态管理和自定义命名,以及权限和所有权的控制,使得系统管理员能更有效地管理和识别系统中的各种设备。了解和熟练掌握udev的使用,对于日常的系统...
Linux 系统中的设备管理是操作系统与硬件交互的关键部分,其中udev是现代Linux发行版中用于动态管理设备文件的核心组件。udev替代了早期的devfs,提供了更为灵活和高效的设备命名及管理机制。 udev的核心功能在于它...
- **动态管理**:udev能够根据内核发送的事件动态地创建或删除设备文件,这意味着只有实际连接的设备才会在`/dev`目录下生成对应的设备文件,避免了大量的无用设备文件占据磁盘空间。 - **自定义命名规则**:通过...
通过以上步骤,我们就成功地利用udev和sysfs动态创建了一个设备节点。这种方法允许系统更加灵活地管理硬件设备,尤其是在设备频繁插拔或自动发现新设备的场景下。同时,udev和sysfs结合使用,使得设备管理更加标准化...
在Linux系统中,udev是设备管理系统的核心组成部分,它负责动态管理和命名硬件设备。当我们插入一个U盘时,udev会自动检测到这个事件,并为U盘分配一个设备节点,提供访问U盘的路径。这个过程涉及到了Linux内核、USB...
在Linux早期,设备文件仅仅是是一些带有适当的属性集的普通文件,它由mknod命令创建,文件存放在/dev目录下。后来,采用了devfs,一个基于内核的动态设备文件系统,他首次出现在2.3.46 内核中。Mandrake,Gentoo等...
Udev 是 Linux 系统中的一种设备管理机制,它可以实时监控和管理系统中的设备事件。Udev 的主要功能是对系统中的设备进行自动挂载和卸载操作,以便提高系统的灵活性和可靠性。 Udev 的配置文件位于 `/etc/udev/udev...
在Linux 2.6内核中,udev取代了传统的devfs(设备文件系统),它在系统启动时以及在运行时设备被添加或移除时,动态地创建设备文件,并且基于可识别的硬件属性来命名设备文件。udev的这些特性对于确保ASM使用的设备...
Linux中的udev是一个重要的设备管理器,自Linux内核3.10版本以来,它已经取代了devfs和hotplug等旧的设备管理系统。udev运行在用户空间,负责处理硬件的添加和删除,确保用户空间对设备的操作能够正确、稳定地进行。...
- **UDEV**:UDEV是Linux的设备管理器,它管理着设备文件,通过UDEV规则,管理员可以自定义设备的名称和属性,从而方便了设备的管理和使用。 - **ASM(自动存储管理)**:ASM是Oracle数据库提供的一个组件,它用于...
2. Udev:Udev是Linux系统中的设备管理机制。它可以自动检测和管理系统中的设备,包括磁盘、网络接口、USB设备等。Udev可以根据设备的属性和类型来执行相应的动作,例如加载驱动程序、设置权限等。 3. Udev规则文件...
通过阅读《LINUX设备驱动程序》(Linux.Device.Driver) 第三版,开发者将能够深入了解Linux内核的工作机制,掌握编写高效设备驱动程序的关键技能,从而更好地利用Linux系统实现对硬件设备的控制和优化。
8. **udev规则**:udev是Linux系统下的设备管理器,它根据设备属性生成设备节点,并赋予相应的权限,驱动开发者需要了解如何配置udev规则。 9. **sysfs和procfs**:这两个虚拟文件系统提供了与内核交互的接口,驱动...
在Linux4.0内核版本中,设备驱动模型进行了许多改进,比如引入了统一的设备模型(UDEV),使得设备管理更加灵活和自动化。 驱动开发首先需要理解Linux设备模型,包括总线、设备、驱动的抽象概念。书中会介绍如何...