zoukankan      html  css  js  c++  java
  • 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.然后通过虚拟文件系统进行数据交互。

  • 相关阅读:
    sqli-libs(3)
    python学习之路(18)
    BZOJ3534:[SDOI2014]重建——题解
    洛谷省选斗兽场全通关祭~以及之后的打算!
    BZOJ4596:[SHOI2016]黑暗前的幻想乡——题解
    BZOJ2732:[HNOI2012]射箭——题解
    BZOJ1486:[HNOI2009]最小圈——题解
    BZOJ4552:[HEOI2016/TJOI2016]排序——题解
    BZOJ2830 & 洛谷3830:[SHOI2012]随机树——题解
    BZOJ4889 & 洛谷3759:[TJOI2017]不勤劳的图书管理员——题解
  • 原文地址:https://www.cnblogs.com/wstone/p/5651003.html
Copyright © 2011-2022 走看看