【2020-12-14 Linux 内核中根据函数指针输出函数名】教程文章相关的互联网学习教程文章

在Linux内核中根据函数指针输出函数名称【代码】

在使用Linux内核提供的打印函数时,使用“%p”可以实现很多额外的效果,对于我们调试内核代码也有一定帮助。比如当我们看到函数指针变量,想获取这个函数指针对应的是哪个函数,可以使用“%pF”,示例: 1 #include <linux/init.h>2 #include <linux/module.h>3 4staticint test_function(void)5{6 printk("%s enter.\n", __func__);7 8return0;9} 1011staticint __init printk_demo_init(void) 12{ 13int (*func)(void); ...

Linux C标准库API:文件fdopen-将文件描述词转为文件指针、fopen-打开文件、fclose-关闭文件【代码】

一、fdopen——将文件描述词转为文件指针 1.原函数 表头文件 #include "stdio.h" 定义函数 FILE *fdopen(int fildes, const char *mode);函数说明——把fildes(文件描述符)转换成文件指针后返回此文件指针 fildes——文件描述符 mode——必须和此文件描述符对应文件的权限一样 返回值——成功返回指向该文件的文件指针。失败返回NULL,并把错误代码存在errno中2.参数取值 mode参数:r 打开只读文件,该文件必须存在。r+ 打开可读...

2020-12-14 Linux 内核中根据函数指针输出函数名【代码】【图】

Linux 内核中根据函数指针输出函数名 一、kernel内核一个函数指针变量可能指向N多个函数,在开发调试的时候想获取这个函数指针对应的是哪个函数,可以使用“%pF”。 printk("%s: %pF\n", __func__, pm_power_off); 二、比如我的代码里面pm_power_off 可能指向这么多函数。三、在代码里面添加printk("%s: %pF\n", __func__, pm_power_off);就可以确认到底是调用哪个函数了。四、查看log,可以知道是实际调用psci_sys_poweroff函...

linux-获取功能指针以在我未直接加载的共享库中运行

我的Linux应用程序(A)链接到我没有源代码的第三方共享库(B).该库使用了我没有源代码(C)的另一个第三方共享库.我相信(B)使用dlopen来访问(C)而不是直接链接.我的理由是(B)上的’ldd’不显示(C),而objdump -X(B)显示对dlopen / dlclose / dlsym的引用. 我的要求是我需要在代码中为(A)获取指向位于(C)中的函数foo()的函数指针.通常,我会为此使用dlsym,但是我需要将它传递给我从dlopen返回的句柄,因为(B)没有公开它,所以我没有这个句柄...

linux-用户空间和内核空间中的空指针取消引用

如果我们在用户空间和内核空间中取消引用空指针,将会发生什么? 据我了解,行为是基于编译器,体系结构等的. 但通常对于分配了虚拟内存的每个用户空间程序,使用分页表使用分页将虚拟地址转换为物理地址. 因此,如果我们在用户空间中取消引用空指针,则该地址无效,因此上下文切换将发生,并且在内核中基于此空指针取消引用的中断“将出现分段错误或将出现页面错误”. 在内核空间中: 如果我们取消引用NULL指针,则可能导致系统崩溃或内核可...

linux-文件指针宽度和最大文件大小之间的关系是什么

只是对Linux上一些流行的文件系统提供的最大文件大小限制感到好奇,我已经看到一些文件达到了TB规模. 我的问题是,如果文件指针是32位宽(与我们今天遇到的大多数Linux一样),那是否意味着我们可以寻址的最大距离是2 ^ 32-1个字节?那么我们如何存储大于4GB的文件? 此外,即使我们可以存储这样的文件,如何定位超出2 ^ 32范围的位置?解决方法:要使用大于4 GB的文件,在Linux上需要“大文件支持”(LFS). LFS引入的更改之一是文件偏移量是...

linux – 如何强制中止“glibc detect *** free():无效指针”

在Linux环境中,当获取“glibc *** free():无效指针”错误时,如何识别导致它的代码行? 有没有办法强迫中止?我记得有一个ENV var可以控制它吗? 如何在gdb中为glibc错误设置断点?解决方法:我相信如果你将MALLOC_CHECK_设置为2,glibc会在检测到“free():invalid pointer”错误时调用abort().请注意环境变量名称中的尾随下划线. 如果MALLOC_CHECK_为1,则glibc将打印“free():无效指针”(和其他错误类似的printfs).如果MALLOC_CHE...

从linux中的内核模块控制鼠标指针

好的,所以这就是问题所在:我必须编写一个控制鼠标光标的linux内核模块.例如,要将光标在屏幕上移动到给定的x / y坐标,请发送随机鼠标点击等. 我必须写的原因是我正在编写一个使用手机作为触摸板的应用程序.因为它是我的uni的项目,所以计算机端控制器必须是Linux内核模块.所以,问题是,如何从内核模块控制鼠标行为?我用谷歌搜索了一段时间,但我没有在’网的深处找到任何结论,可悲的是:(解决方法:内核是错误的地方 – 内核完全没有意...

linux – 禁用鼠标指针移动

我想禁用鼠标移动,由bash脚本控制,因此xdotool可以接管并撞击鼠标,否则不会成为问题. 但是,我需要按钮才能继续工作,因此不能选择禁用鼠标. 这是与this one相同的问题,但那里的解决方案对我不起作用.我的鼠标似乎没有这些属性. xinput list显示鼠标3次. ID 10具有最多属性,其他两个具有选项子集. 输入xinput list-props 10: 设备’罗技游戏鼠标G502’: 设备已启用(152):1 坐标转换矩阵(154):1.000000,0.000000,0.000000,0...

linux – 为什么存在不兼容的指针类型警告?【代码】

我正在使用内核3.13.0编写Linux设备驱动程序,我很困惑为什么我收到此警告.warning: initialization from incompatible pointer type [enabled by default].read = read_proc,^ warning: (near initialization for ‘proc_fops.read’) [enabled by default]据我所知,我的file_operations设置proc函数与设备函数相同.我可以读/写/ dev / MyDevice没有问题,也没有警告. proc写入函数不会发出警告,只会读取.我做错了什么?/**********...

在Linux上,在C/C++中,指针是否会有MSB设置?

我想使用一个长整数,当设置MSB时它将被解释为数字,否则它将被解释为指针.那么这项工作还是会在C或C中遇到问题? 这是在64位系统上. 编辑清晰和更好的描述.解决方法:在x86-64上,你将有一个超过47位的指针,其地址设置为第63位,因为“架构支持的最大位数”(当前为48位)以上的所有位都必须具有相同的值作为价值本身最重要的一点. (这是0007以上的任何地址FFFF FFFF FFFF将是FFF8 0000 0000 0000 – 其间的所有内容都是“无效”作为指针...

linux内核指针和错误值

很多内部内核函数返回一个指针值给调用者. 许多这些函数也可能失败. 大部分情况, 失 败由返回一个 NULL 指针值来指示. 这个技术是能用的, 但是它不能通知问题的确切特性. 一些接口确实需要返回一个实际的错误码以便于调用者能够基于实际上什么出错来作出正 确的判断. 许多内核接口通过在指针值中对错误值编码来返回这个信息. 这样的信息必须小心使用, 因为它们的返回值不能简单地与 NULL 比较. 为帮助创建和使用这类接口, 一小部...

Linux如何记住其内核堆栈指针?

我知道Linux中有两种类型的堆栈:每个用户线程的用户堆栈和内核线程的内核堆栈(但是1个进程).中断,更准确地说是中断过程,是这两种模式(内核(0)和用户(3))之间的桥梁.中断向量表让处理器在PC寄存器中加载正确的指令地址,但是当它在内核模式下切换时,堆栈指针寄存器是如何改变的?子例程是否在第一条指令之前指示内核堆栈的位置?或者处理器使用两个堆栈指针寄存器(我真的怀疑它)? “从中断返回”如何知道返回的位置? PCB是保存在内...

linux – 获取有关分段错误或崩溃的指令指针(对于x86 JIT编译器项目)?【代码】

我正在为生成x86代码的JavaScript JIT编译器实现后端.有时,由于错误,我会遇到分段错误.追溯导致它们的原因可能非常困难.因此,我一直想知道是否会有一些“简单”的方法来捕获分段错误和其他此类崩溃,并获取导致错误的指令的地址.这样,我可以将地址映射回已编译的x86程序集,甚至可以返回源代码. 这需要在Linux上运行,但理想情况下适用于任何符合POSIX标准的系统.在最坏的情况下,如果我无法捕获seg故障并在运行JIT中获取IP,我希望能够...

linux – 指针初始化的疑问【代码】

我们可以在C中初始化这样的字符指针. char * c =“test”; 其中c指向第一个字符(t). 但是当我给出如下代码时.它给出了分段错误.#include<stdio.h> #include<stdlib.h> main() {int *i=0;printf("%d",*i); }当我给#include<stdio.h> #include<stdlib.h> main() {int *i;i=(int *)malloc(2);*i=0;printf("%d",*i); }它工作(给出输出0). 当我给malloc(0)时,它工作(给出输出0). 请告诉我们发生了什么解决方法:你的第一个例子是seg faul...