Android探索与驱动开发学与思(10)
打印内核的调试信息printk:
printk与printf区别:
printk 函数该函数的用法与printf函数类似,具不过printk函数运行内核空间,printk函数运行在用户空间。也就是说,像Linux驱动这样的Linux内核程序只能使用prink函数输出调试信息。
其次应该防止printk函数可以很方便地将消息写入日志文件或控制台,但是大量使用printk函数频繁操作日志文件或控制台设备文件会严重影响Linux驱动的性能,因此这就要求Linux驱动只在开发阶段使用printk函数输出消息,在正式发布Linux驱动时将可能影响性能的printk函数去掉。
然后通过虚拟文件系统进行数据交互。
必要性:在linux文件系统中,/proc经常被用来作为内核空间进行数据交互的工具。/proc是虚拟文件系统,也就是说,/proc并不是真正的文件系统,而是内存映射。所有读写/proc的操作军事对内存读写的操作。所以读写/proc文件系统的速度远比读写/dev要快。因此,/proc文件系统也可作为linux驱动与用户空间程序交互的工具。
很多信息就是通过/proc文件系统由内核空间的程序向外届提供的。例如:当前系统内存资源就是通过/proc/meminfo文件读取的,读者可以使用如下命令:查看/proc/meminfo文件的内容:Cat /proc/meminfo.我们可以通过执行free命令看看显示的信息是否和meminfo文件中的部分内容相匹配。
在linux驱动程序中可以使用内核函数在/proc目录中创建和删除虚拟文件,也可以建立和删除虚拟目录。
1. create_proc_entry 创建proc 文件
struct proc_dir_entry *create_proc_entry(const char *name, mode_t mode,struct proc_dir_entry *parent);
name: 要创建的文件名称;
mode: 该文件的保护掩码;
parent: 确定文件所在目录,如果置NULL ,则位置为/proc 下。
2. proc_mkdir 创建目录
/* 该函数在父目录parent 下创建一个目录name* */
struct proc_dir_entry * proc_mkdir (const char *name,struct proc_dir_entry *parent);
@name : 要创建的目录名
@parent : 这个目录的父目录
3.remove_proc_entry 删除文件或目录
/* 这个函数从proc 文件系统中删除一个文件或目录。
* 注意:1 .是通过参数name ,而不是通过创建时返回的指针来删除的。
* 2 .该函数不会递归删除目录下的文件。
* 3 .data 变量保存了分配的内存,要先释放对应内存,再删除该文件。
* */
void remove_proc_entry (const char *name,struct proc_dir_entry *parent);
@name : 要删除的文件或目录名
@parent : 所在的父目录
4.create_proc_read_entry 创建只读proc 文件
struct proc_dir_entry * create_proc_read_entry (const char
*name,mode_t mode,struct proc_dir_entry *parent,read_proc_t*
read_proc,void *data);
@name : 要创建的文件名
@mode : 要创建的文件的属性 默认0755
@parent : 这个文件的父目录
@read_proc : 当用户读这个文件时,内核调用的函数
@data : 传给read_proc 的参数
注意:删除虚拟文件目录之前,要先删除目录中的虚拟文件。
执行build.sh脚本文件,会将proc_demo驱动安装在Ubuntu Linux、开发板或Android虚拟机上。然后执行下面的命令查看/proc/proc_demo目录中的内容。
Ls –al /proc/proc_demo/bin2dec
Cat /proc/proc_demo/bin2dec
Cat /proc_demo/readonly
用gdb调试用户空间程序、用gdbserver远程调试用户空间程序、用kgdb远程调试内核程序。
总结:Proc-makedir
Name:虚拟目录名称
Parent:虚拟目录父目录的proc-dir-entry结构体指针
Creat-proc-entry
Name:虚拟文件名称
Mode:虚拟文件的访问权限
Parent:虚拟文件父目录的proc-dir-entry结构体指针
Cereat-proc-read-entry
Name:虚拟文件系统
Mode:虚拟文件的访问权限
Base:虚拟文件目录的
pro-dir-entry:结构体指针
Read-proc-:处理读动作的函数指针
Data:用于虚拟文件系统的数据
Remove-proce-entry:
Name:要删除的虚拟文件的名称
Parent:虚拟文件父目录
Proc-dir-entry:结构体指针
本章中我学到了:
1.打印内核的调试信息printk。
2.然后通过虚拟文件系统进行数据交互。