Linux相关技术总结

2020-04-06  本文已影响0人  Sma11_Tim3

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的代号名称

上一篇下一篇

猜你喜欢

热点阅读