Linux 字符设备

来源:互联网 发布:星球基地mac 编辑:程序博客网 时间:2024/05/29 17:02

Linuxdevice主要可以分为三种:

1char device

2block device

3network device


本文主要描述chardevice

1:主、次设备号(Major and Mirror Numbers

    通过ls的时候就可以看到,每个设备都有主、次设备号,其中主设备号用于表示哪个驱动,次设备号用于表示哪个设备;

    可以通过MAJOR(dev_t dev)、MINOR(dev_tdev)从一个设备号获取主、次设备号;

    可以通过MKDEV(int major, intminor)将主、次设备号组合成一个设备号。  

     

    1)设备号的申请

   设备号可以动态申请,也可以用户指定

   用户指定:int register_chrdev_region(dev_tfrom, unsigned count, const char *name);

   动态申请:int alloc_chrdev_region(dev_t *dev,unsigned baseminor, unsigned count,

constchar *name)

    2)设备号的释放

          unregister_chrdev_region


2:主要数据结构

struct cdev {

structkobject kobj;

structmodule *owner;

const struct file_operations *ops;

structlist_head list;

dev_tdev;

unsignedint count;

};

其中ops为常见的文件操作接口(readwrite等),

当用户态open一个字符设备文件,并通过readwrite等系统调用操作字符设备文件时,由于内核态不能直接访问用户态的地址,必须在系统调用处理函数入口通过copy_to_usercopy_from_user来完成用户态空间与内核态地址的数据交换,原因如下:

1):在不同的架构以及不同的配置下,用户态的指针在内核态下可能是无效的,没有映射的;

2):如果用户态指针所映射的内存区域被交换出去,那在内核态访问的话就会导致缺页异常,而内核是不允许缺页的;

3):处于安全的考虑,如果不做用户态指针的判断与转换,那即使传进来一个恶意的地址,内核也会直接去访问、修改。

 

内核在处理copy_to_usercopy_from_user时,如果用户态的地址空间还没有建立物理页映射,则会产生异常,不过内核针对copy_to_usercopy_from_user产生的异常做了特殊判断,保证内核产生缺页异常时不会挂死;

 

3:注册一个字符设备主要步骤

     1):分配设备号

                register_chrdev_region或alloc_chrdev_region      

     2):分配字符设备控制块(一般用全局变量)

                cdev = cdev_alloc();

     3):设置字符设备处理函数

               cdev->ops = fops;

     4):设置kobjectname,用于在sysfs里显示

               kobject_set_name(&cdev->kobj,"%s", name);

     5):通过cdev_add将新的字符设备注册到系统中


原创粉丝点击