设备和模块的分类
设备分为3种基本类型,字符设备,块设备及网络设备,对应的模块及字符模块,块模块,网络模块。
- 字符设备:串口,键盘等。用"c"标识。
- 块设备:硬盘。用“b"标识。
- 网络设备:网卡。
设备号
Linux中的每个设备都有唯一的设备号,设备号由主设备号和次设备号组成。主设备号一般代表一类设备,次设备号则代表具体的设备。
内核中用dev_t表示一个设备号,设备号可以手动申请,也可以动态申请。下面是常用的几个相关的宏。
#define MAJOR(dev) ((unsigned int) ((dev) >> MINORBITS)) //根据设备号获取主设备号
#define MINOR(dev) ((unsigned int) ((dev) & MINORMASK)) //获取次设备号
#define MKDEV(ma,mi) (((ma) << MINORBITS) | (mi)) //根据指定的主设备和次设备号生成设备号
通过ls -l 可以查看设备号及类型,第一项的’c’代表是字符设备,第5,6表示主设备号和次设备号。由于不是磁盘中真实的文件,都是系统启动过程中加载的,这些文件的大小都是0。
创建设备文件
命令如下:
Usage: mknod [OPTION]… NAME TYPE [MAJOR MINOR]
TYPE may be:
b create a block (buffered) special file
c, u create a character (unbuffered) special file
p create a FIFO
例如:mknod /dev/test c 100 1
加载模块和卸载模块
通过insmod可将模块test加载入内核中,也可以通过modprobe,不同之处是modprobe加载自动需要依赖的模块。
$ insmod test.ko
卸载模块
$ rmmod test
查看已经加载的模块
$ lsmod
申请动态内存的几种方式:kmalloc、kzalloc、vmalloc
void *kmalloc(size_t size, gfp_t flags);
kmalloc申请出来的内存未进行置0,内存在物理内存上是连续的。flags为标志(常为GFP_KERNEL)。
如果系统的空闲内存低于某警戒线,kmalloc()将睡眠,等待对换程序释放内存。所以在调用这个函数的时候不能使用自旋锁。
void *kzalloc(size_t size, gfp_t flags);
kzalloc申请的内存已置0,flags为标志(常为GFP_KERNEL)。
void kfree(const void *objp);
kfree回收kmalloc/kzalloc所申请的内存。
void *vmalloc(unsigned long size);
vmalloc是申请大内存空间,但是物理内存不一定是连续的。
void *vfree(const void *addr);
回收vmalloc申请的内存。
copy_to_user与copy_from_user
.由于空户空间不能和内核空间直接进行数据交换,内核需要通过copy_from_user去获取用户空间传下来的数据,copy_to_user传回给用户空间。
copy_to_user和copy_from_user都可能会睡眠,所以在调用这两个函数的时候不能使用自旋锁。
.
.