kernel五大功能:文件管理,进程管理,网络管理,内存管理,设备管理
设备管理:设备驱动管理
字符设备驱动
块设备驱动
linux内核三要素----
ctags工具的使用
安装: sudo apt-get install ctags
创建索引: ctags -R 索引文件名:tags
内核目录下makefile实现了ctags
命令:make tags
追代码 vi -t 内容
快捷键 ctrl +] ctrl+t
驱动静态编译(内部编译)
1.拷贝demo.c 到内核drivers/char目录下
2.在drivers/char目录下找到Kconfig文件,参考其他,添加选项菜单
3.在顶层目录下执行make menuconfig ,修改drivers/char 下的菜单
(4.)修改后可在.config下查看保存的信息
4.到drivers/char 目录下修改makefile文件(参考其他修改)
5.编译内核 命令
make uImage
外部编译
#KERNELDIR=/home/linux/kernel/kernel-3.4.39/
#KERNELDIR=/lib/moudles/$(shell uname -r)/build/
PWD=$(shell pwd)
MNAME?=demo
all:
make -C $(KERNELDIR) M=$(PWD) modules
// make -c目录 到该目录下执行make命令
//M=$(PWD)指定编译模块路径
//modules 编译模块
clean:
make -C $(KERNELDIR) M=$(PWD) clean
obj-m:=$(MNAME).o
模块安装卸载命令
安装: insmod xx.ko
查看: lsmod
卸载: rmmod xxx (无.ko)
内核中的打印
printk(打印级别"");
vi -t KERN_EMERG "<0>"
也可以直接使用<0>
内核中打印级别定义
cat /proc/sys/kernel/printk
//查看开发板中的级别
cat /sys/kernel/printk
//查看ubuntu中的级别
//echo可以进行修改
4 4 1 7
终端级别 默认消息级别 终端最高级别 终端最低级别
导出符号表
在一个内核模块中调用另外一个内核模块中的函数。需要提供者将函数的符号表导出给调用者直接使用。
作用:
1.解决代码冗余问题。
2.编写内核驱动时,内核工程师提供给驱动工程师一些接口。
代码
int add(int a,int b)
{
return (a+b);
}
EXPORT_SYMBOL_GPL(add);
//宏定义实现
编译会生成 module.symvers 文件,即记录add函数的符号表
使用者需要将此文件拷贝到自己的目录下
安装顺序:
提供者先安装
卸载顺序:
调用者先卸载
内核模块传参
1.安装时候传参
sudo insmod demo.ko a=100 b=20
2.驱动运行时候传参
/sys/module/驱动命名的目录/parameters/
参数文件:其他用户无写权限
函数:
module_param(name,type,perm)
功能:接受内核传递的参数
参数:
@name:变量名
@type :变量类型
@权限 :权限(0664 0775)(其他用户无可写权限)
MODULE_PARM_DESC(a,"this is para") ;
功能:变量的描述
参数:
@变量名
@描述字段