环境 Aarch64 Qemu aarch64-linux-gnu-gcc linux-4.14   概述     栈回溯的目的是将函数的调用栈打印出来,对于分析函数调用和debug系统异常会很有帮助.对于Aarch64,x29用于用来当做帧指针,x30用来存放函数返回地址.   正文 原理 首先通过一个简单的程序分析一下栈回溯的原理,下面是测试程序: #include <stdio.h> int func3(int b) { ; printf("a = %d\n", a…
  参考内核文档: Documentation/printk-formats.txt   在内核中使用dump_stack的时候可以看到如下用法: static inline void print_ip_sym(unsigned long ip) { printk("[<%px>] %pS\n", (void *) ip, (void *) ip); }   然后我们就可以看到类似如下的内核log:   可以看到,上面不光输出了运行地址,还把对应的函数名以及偏移地址都列了出…
环境 Linux-4.14 Aarch64   正文 在前面的分析中调用print_symbol("PC is at %s\n", instruction_pointer(regs))输出当前PC地址的时候,输出的的内容却是:PC is at demo_init+0xc/0x1000 [demo] 下面分析一下这个函数print_symbol. , ) void __check_printsym_format(const char *fmt, ...) { } static inlin…
一丶内核中的数据类型 在内核中.程序的编写不能简单的用基本数据类型了. 因为操作系统不同.很有可能造成数据类型的长度不一.而产生重大问题.所以在内核中. 数据类型都一定重定义了. 数据类型 重定义数据类型 Unsigned long ULONG Unsigned char UCHAR Unsigned int UINT Void VOID Unsigned long * PULONG Unsigned char * PCHAR Unsigned int * PUINT Void * PVOID…
转自:https://blog.csdn.net/jasonchen_gbd/article/details/44066815?utm_source=blogxgwz8 版权声明:本文为博主原创文章,转载请附上原博链接. https://blog.csdn.net/jasonchen_gbd/article/details/44066815内核中的dump_stack()获得内核中当前进程的栈回溯信息需要用到的最重要的三个内容就是: 栈指针:sp寄存器,用来跟踪程序执行过程. 返回地址:ra寄存…
1 环境准备 运行系统:vmware下安装的ubuntu10.10 32bit桌面版. 编译内核版本: linux-2.6.32.63 内核目录: /home/wanchouchou/linuxKernel/linux-2.6.32.63 为了方便,使用chmod 777 -R linux-2.6.32.63/ 将所有的内核文件都改为全权限,这样就可以在非root状态修改文件进行编译了. 2 添加系统调用 首先进入linux-2.6.32.63目录下.以后的文件路径都是以此目录为“根目录”的.…
在上一篇博文中笔者讨论了关于原子操作和自旋锁的相关内容,本篇博文将继续锁机制的讨论,包括内存屏障.读写自旋锁以及顺序锁的相关内容.下面首先讨论内存屏障的相关内容. 三.内存屏障 不知读者是是否记得在笔者讨论自旋锁的禁止或使能的时候,提到过一个内存屏障函数.OK,接下来,笔者将讨论内存屏障的具体细节内容.我们首先来看下它的概念,Memory Barrier是指编译器和处理器对代码进行优化(对读写指令进行重新排序)后,导致对内存的写入操作不能及时的反应到读操作中(锁机制无法保证时序正确).可能读起来…
大话Linux内核中锁机制之内存屏障.读写自旋锁及顺序锁 在上一篇博文中笔者讨论了关于原子操作和自旋锁的相关内容,本篇博文将继续锁机制的讨论,包括内存屏障.读写自旋锁以及顺序锁的相关内容.下面首先讨论内存屏障的相关内容. 三.内存屏障 不知读者是是否记得在笔者讨论自旋锁的禁止或使能的时候,提到过一个内存屏障函数.OK,接下来,笔者将讨论内存屏障的具体细节内容.我们首先来看下它的概念,Memory Barrier是指编译器和处理器对代码进行优化(对读写指令进行重新排序)后,导致对内存的写入操作不能…
目录 一丶简介 二丶原理 3.代码实现. 一丶简介 在内核中有时候想通过PID 获取进程的全路径以达到监控的作用 比如我们设置了进程回调.则可以根据PID看下进程的全路径. 二丶原理 原理就是在内核中 通过 ZwQueryInformationProcess 这个未公开的函数 进行查询. 查询好是 ** ProcessImageFileName ** 也就是27号功能. 但是查询出来的路径是Dos路径.还需要进行转化. 1.传入PID 使用 ZwOpenProcess打开PID获取Handle…
linux内核中的get_user和put_user 在 内核空间和用户空间交换数据时,get_user和put_user是两个两用的函数.相对于copy_to_user和 copy_from_user(将在另一篇博客中分析),这两个函数主要用于完成一些简单类型变量(char.int.long等)的拷贝任务,对于一些 复合类型的变量,比如数据结构或者数组类型,get_user和put_user函数还是无法胜任,这两个函数内部将对指针指向的对象长度进行检查,在 arm平台上只支持长度为1,2,4,…