美文网首页
Linux相关技术总结

Linux相关技术总结

作者: Sma11_Tim3 | 来源:发表于2020-04-06 17:25 被阅读0次

    Linux环境下的GDB调试方法
    https://blog.csdn.net/horotororensu/article/details/82256832
    网上很多,这篇比较全,建议收藏或自行总结。

    GOT表和PLT表知识详解
    https://blog.csdn.net/qq_18661257/article/details/54694748

    关于fork函数和execl函数

    fork函数的特性。fork被调用一次,却能够返回两次,它可能有三种不同的返回值:
    1)在父进程中,fork返回新创建子进程的进程ID;
    2)在子进程中,fork返回0;
    3)如果出现错误,fork返回一个负值;

    在fork函数执行完毕后,如果创建新进程成功,则出现两个进程,一个是子进程,一个是父进程。在子进程中,fork函数返回0,在父进程中,fork返回新创建子进程的进程ID。我们可以通过fork返回的值来判断当前进程是子进程还是父进程。

    execl函数说明
    int execl(const char * path,const char * arg,....);
    execl()用来执行参数path字符串所代表的文件路径,
    接下来的参数代表执行该文件时传递过去的argv(0)、argv[1]……,
    最后一个参数必须用空指针(NULL)作结束。*/

    MODULE_LICENSE("GPL")
    模块的许可证声明
    从2.4.10版本内核开始,模块必须通过MODULE_LICENSE宏声明此模块的许可证,否则在加载此模块时,会收到内核被污染 “kernel tainted” 的警告。从linux/module.h文件中可以看到,被内核接受的有意义的许可证有 “GPL”,“GPL v2”,“GPL and additional rights”,“Dual BSD/GPL”,“Dual MPL/GPL”,“Proprietary”。

    在同时支持2.4与2.6内核的设备驱动中,模块可按如下方式声明自己的许可证。

    适用于2.4与2.6内核的模块许可证声明模板

    MODULE_LICENSE(“GPL”);

    获得内核函数地址的四种方法
    1、从 System.map 文件中直接得到地址
    grep sys_read /boot/System.map
    2、使用 nm 命令读取 vmlinux 的信息
    nm /usr/lib/debug/boot/vmlinux-4.4.0-72-generic | grep sys_read
    3、从 /proc/kallsyms 文件获得地址
    cat /proc/kallsyms | grep perf_trace_do_sys_open
    4、使用内核函数接口
    使用 kallsyms_lookup_name( )
    该函数在 kernel/kallsyms.c 文件中定义的, 要使用它必须启用 CONFIG_KALLSYMS 编译内核.
    kallsyms_lookup_name( ) 接受一个字符串格式内核函数名, 返回那个内核函数的地址.
    kallsyms_lookup_name("函数名");
    更多详细介绍:https://blog.csdn.net/gatieme/article/details/78310036

    CR0的宏,网上扒的

    #define CLEAR_CR0    asm ("pushl %eax\n\t"             \
    "movl %cr0, %eax\n\t"        \
    "andl $0xfffeffff, %eax\n\t"     \
    "movl %eax, %cr0\n\t"        \
    "popl %eax");
     
    #define SET_CR0        asm ("pushl %eax\n\t"             \
    "movl %cr0, %eax\n\t"         \
    "orl $0x00010000, %eax\n\t"     \
    "movl %eax, %cr0\n\t"        \
    "popl %eax");
    

    作用:用于根据一个结构体的一个成员获取这个结构体的首地址。(根据成员指针获取父结构体变量指针。)
    关于函数IS_ERR()
    IS_ERR()来判断内核函数的返回值是不是一个有效的指针。
    vim命令查看内核源码
    shell脚本

    #!/bin/sh
    DIR=`pwd`
    ctags -R --languages=C,C++ --c++-kinds=+p --fields=+iaS --extra=+q $DIR
    find $DIR -name "*.h" -o -name "*.c" -o -name "*.cc" > cscope.files
    cscope -bkq -i cscope.files
    

    运行脚本
    在内核源码目录运行该脚本
    说明:建立tag需要点时间,请耐心等待。
    然后,用gvim快速查找函数、结构体等的定义与声明。
    vim [arguments] -t tag edit file where tag is defined
    例如:查找init_rootfs函数的定义,使用gvim -t init_rootfs,如果定义只有一处,它会立即自动打开这个文件,并跳转到结构体上,否则会提示你选择哪个文件的哪一处定义。

    查看ubuntu系统的版本信息

    打开终端输入

    cat /proc/version
    

    显示如下
    Linux version 4.10.0-28-generic (buildd@lgw01-12) linux内核版本号
    gcc version 5.4.0 gcc编译器版本号
    Ubuntu 5.4.0-6ubuntu1 Ubuntu版本号

    打开终端输入

    uname -a
    

    显示linux的内核版本和系统是多少位的:X86_64代表系统是64位的。

    打开终端输入

    lsb_release -a
    

    显示如下
    Distributor ID: Ubuntu //类别是ubuntu
    Description: Ubuntu 16.04.3 LTS //16年3月发布的稳定版本,LTS是Long Term Support:长时间支持版本,支持周期长达三至五年
    Release: 16.04 //发行日期或者是发行版本号
    Codename: xenial //ubuntu的代号名称

    相关文章

      网友评论

          本文标题:Linux相关技术总结

          本文链接:https://www.haomeiwen.com/subject/ogecactx.html