Linux设备驱动笔记:基础杂记

设备和模块的分类

    设备分为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都可能会睡眠,所以在调用这两个函数的时候不能使用自旋锁。
.
.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值