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 文件系统中删除一个文件或目录。

注意:.是通过参数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.然后通过虚拟文件系统进行数据交互。

原文地址:https://www.cnblogs.com/wstone/p/5651003.html