这篇文章主要介绍linux中一些基本点,包括文件系统结构、字符设备驱动中的结构、驱动中的并发控制。
int minValuw; //变量,第一个单词正常,其后单词第一个字母大写
Void SendData(void); //函数,所有单词第一个字母大写
Linux 下:
int min_value;
void send_data(void);
/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 描述一类设备。
①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 结构实现。
解决竞态的途径是对共享资源的互斥访问,访问共享资源的代码区域称为临界区。有中断屏蔽、原子操作、自旋锁、信号量。
①中断屏蔽:进入临界区之前屏蔽系统的中断。进程调度等操作都依赖中断来实现,屏蔽中断后内核抢占进程之间的并发也就避免了。
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);
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);