字符设备驱动结构

    这篇文章主要介绍linux中一些基本点,包括文件系统结构、字符设备驱动中的结构、驱动中的并发控制。
Linux 命名习惯
Windows 下:
    int minValuw;                   //变量,第一个单词正常,其后单词第一个字母大写
    Void SendData(void);      //函数,所有单词第一个字母大写
Linux 下:
    int min_value; 
    void send_data(void);
LICENSE
LINUX 2.6 内核模块最常见的以 MODULE_LICENSE("Dual BSD/GPL")  语句声明模块采用 BSD/GPL  双LICENSE。

Linux 文件系统
17 个目录:
/bin 命令;                      /boot 内核及引导系统程序所需的文件;   
/dev 设备文件目录          /etc 配置文件    
/home 用户目录             /lib 内核提供了一组用于操作cdev
/mnt 挂载                       /tmp 临时 
/sys sysfs 文件系统映射目录    /initrd
(1)SYSFS 文件系统,是一个虚拟文件系统,它可以产生一个包括所有系统硬件的层级视图。
①kobject 内核对象
   Kobject 结构体是linux2.6 引入的设备管理机制,这个数据结构使所有设备在底层都有统一的接口,kobject 提供了基本的对象管理能力。
②kset 内核对象集合
   Kobject 通过kset 组织成层次化的结构,kset 是具有相同类型的kobject 的集合。Kset 中的所有kobject 被组织成一个双向循环链表,kset 中还内嵌一个kobject 对象,所有属于这个kset 的kobject 对象的parent 均指向这个内嵌的对象。
③subsystem 内核对象子系统
  Subsystem 是一系列kset 的集合,它描述系统中某一类设备子系统。
    一个设备用device 对象来描述;
    总线由struct bus_type 来描述;
    每个bus_type 对象都对应/sys/bus 目录下的一个子目录,
    如/sys/bus/pci。在这个目录下存在两个子上目录:devices 和drivers.
    Struct class 描述一类设备。
字符设备驱动结构
(1)字符设备采用struct cdev 来描述,主要成员:
    ①dev_t 描述设备号,32 位。
    ②file_oprerations 定义了字符设备驱动提供给虚拟文件系统的接口函数。
(2)Linux 内核提供了一组用于操作cdev 结构体的函数:
    ①cdev_init(),初始化cdev 成员,建立cdev 和file_operations 之间的连接。
    ②cdev_alloc(),申请cdev 的内存。
    ③cdev_add, cdev_del,向系统添加和删除一个cdev.
File_operations 成员函数:
    ①read():最终调用copy_to_user()实现;
    ②write():最终调用copy_from_user()实现;
    ③ioctl():用switch(cmd) case 结构实现。
设备驱动中的并发控制
并发(concurrency)指的是多个执行单元同时、并行被执行,而产切的执行单元对共享资源的访问很容易导致竟态。
解决竞态的途径是对共享资源的互斥访问,访问共享资源的代码区域称为临界区。有中断屏蔽、原子操作、自旋锁、信号量。
①中断屏蔽:进入临界区之前屏蔽系统的中断。进程调度等操作都依赖中断来实现,屏蔽中断后内核抢占进程之间的并发也就避免了。
Locl_irq_disable()         缺点:期间所有中断无法得到处理,长时间屏蔽中断是很危险的。
     ....... 临界区
Local_irq_enable()
②原子操作:指在执行过程中不会被别的代码所中断的操作。
      内核提供了一系列函数来实现内核的原子操作,可分为整形原子操作和位原子操作。Atomic_set,atomic_dec_and_test.
③自旋锁:定义自旋锁,初始化自旋锁(spin_lock_init(lock)),获得自旋锁(spin_lock(lock)),释放自旋锁(spin_lock(lock)).
④信号量:semaphore.步骤与自旋锁一样。
         Down(&sem); .................up(&sem);
⑤互斥体:mutex。Mutex_lock(&mymutex); ....................... Mutex_unlock(&mymutex);



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值