首页 > 其他分享 >find_sys_call_table和kallsysms_lookup_name的区别

find_sys_call_table和kallsysms_lookup_name的区别

时间:2024-05-29 15:55:02浏览次数:8  
标签:name call kallsysms kallsyms sys lookup table

find_sys_call_tablekallsyms_lookup_name 都可以用于查找内核符号,但它们的具体作用和使用场景有所不同。以下是两者的详细对比:

1. find_sys_call_table

作用

find_sys_call_table 是一种通过遍历内核内存或者其他方式来手动查找系统调用表地址的技术。这种方法通常在某些情况下使用,比如系统没有启用 kallsyms_lookup_name 或者内核版本不支持直接符号查找。

使用场景

  • 内核版本不支持 kallsyms_lookup_name:在某些老版本内核中,kallsyms_lookup_name 可能不可用或者被禁用。
  • 无符号信息的内核:某些内核可能没有编译符号信息,这时无法通过符号名直接查找地址。
  • 调试和分析工具:在某些情况下,调试工具可能需要手动查找系统调用表。

实现方法

find_sys_call_table 通常通过扫描内存中的特定模式来找到系统调用表。以下是一个简化的示例,展示了如何通过遍历内存来找到 sys_call_table

unsigned long **find_sys_call_table(void) {
    unsigned long offset;
    unsigned long **sct;

    for (offset = PAGE_OFFSET; offset < ULLONG_MAX; offset += sizeof(void *)) {
        sct = (unsigned long **)offset;

        if (sct[__NR_close] == (unsigned long *) sys_close) {
            return sct;
        }
    }
    return NULL;
}

这个示例通过遍历从 PAGE_OFFSET 开始的内核内存地址空间,查找包含 sys_close 函数地址的位置,来确定系统调用表的位置。

2. kallsyms_lookup_name

作用

kallsyms_lookup_name 是内核提供的一个函数,用于通过符号名称查找其地址。这在调试和开发内核模块时非常方便,能够直接获取符号(如函数、变量等)的地址。

使用场景

  • 内核开发和调试:在开发内核模块时,通过符号名称快速查找函数或变量的地址。
  • 符号查找:需要查找特定符号的地址时,如 sys_call_table 的地址。

使用方法

使用 kallsyms_lookup_name 需要确保内核配置启用了 CONFIG_KALLSYMSCONFIG_KALLSYMS_ALL,并且函数是GPL导出的。以下是一个示例代码:

#include <linux/kallsyms.h>
#include <linux/module.h>

static int __init init_module_func(void) {
    unsigned long address;

    address = kallsyms_lookup_name("sys_call_table");
    if (address) {
        printk(KERN_INFO "sys_call_table address: %lx\n", address);
    } else {
        printk(KERN_ERR "sys_call_table not found\n");
    }
    return 0;
}

static void __exit cleanup_module_func(void) {
    printk(KERN_INFO "Module exiting\n");
}

module_init(init_module_func);
module_exit(cleanup_module_func);

MODULE_LICENSE("GPL");

总结

  • 查找方法find_sys_call_table 通过遍历内存查找特定模式找到系统调用表,而 kallsyms_lookup_name 通过符号名称直接查找地址。
  • 适用场景find_sys_call_table 适用于符号信息不可用或者不支持 kallsyms_lookup_name 的情况,而 kallsyms_lookup_name 适用于开发和调试,需要通过符号名称快速查找地址的情况。
  • 实现复杂度find_sys_call_table 通常实现较复杂,需要了解内核内存布局和系统调用表特征;kallsyms_lookup_name 使用方便,只需提供符号名称即可。

两者在使用场景和实现复杂度上有显著区别,应根据具体需求选择合适的方法。

标签:name,call,kallsysms,kallsyms,sys,lookup,table
From: https://www.cnblogs.com/linhaostudy/p/18220478

相关文章

  • C++中以类的成员函数作为Windows callback函数需要设置成static函数
    在看代码时,发现很多CALLBACK函数,所以仔细研究了一下C++中的CALLBACK函数首先,我们来理解一下,什么是C++中的CALLBACK函数 =>凡是由你设计,但是由Windows操作系统调用的函数,我们把它统称为CALLBACK函数,这些函数都有一定的类型,以方便配合Windows的调用动作某些WindowsAPI函数会要......
  • Excel无法filter出#Name?
    Excelfilter list里显示有错误数据#name? 但是filter此数据总是不显示内容 为什么呢,我也没找到原因,但是通过排序可以让它显示出来 临时解决问题,具体原因没查到,等待大神 ......
  • __dirname is not defined in ES module scope
    在package.json中的type=module的项目中,我创建了一个ts文件,类型是esm的类型。这里的报错是因为我们错误的使用了module的语法到esm的文件中,要解决这个问题的方法有两种,第一种改为module,另一种是改为esm的写法。首先是第一种改为module的写法,那就是把import改为require,然后由于......
  • 关于Interrupted system call 报错
    Socket编程或者其他的一些慢速系统调用中,我们经常会碰到“interruptedsystemcall”的问题。这些系统调用包括:长时间读取磁盘,等待网络连接i.e.Accept,阻塞的系统调用,i.e.Read/Writeepoll_wait/kevent这是因为系统调用在执行过程中有可能收到来自外部的信号中断,那么该系......
  • Java三种方法实现多线程,继承Thread类,实现Runnable接口,实现Callable接口
    目录线程:继承Thread类:实现Runnable类:实现Callable接口:验证多线程:线程:定义:进程可以同时执行多个任务,每个任务就是线程。举个例子:一个Java程序,如果同时有两个循环同时进行,就是线程。再比如,你用百度网盘,边看视频,边下载。继承Thread类:步骤写在代码里的classmythrea......
  • Makefile中,call `$(call)` 函数
    在Makefile中,`$(call...)`是一个函数调用语法,它允许你定义一个名为函数的宏,并在Makefile的其他地方调用它。这种功能提供了一种重用Makefile中复杂或经常重复的代码的方法。`$(call...)`语法的基本形式如下:```make$(callfunction_name,arg1,arg2,...)```这里,`function_nam......
  • React中何时使用memo、useCallback、useMemo以及useRef进行性能优化
    react无法做到像vue一样自动收集依赖更新(期待react19的ReactCompiler),需要开发人员手动的进行性能优化,此时memo、useCallback、useMemo、useRef就是性能优化中的重要API本文虽然介绍可应用场景,但是正常开发中,尤其是useCallback。除非遇到性能问题或者组件库封装,亦或......
  • Error creating bean with name ‘dataSource‘ defined in class path resource解决
    报错信息ERROR3592—[restartedMain]o.s.boot.SpringApplication:Applicationrunfailedorg.springframework.beans.factory.BeanCreationException:Errorcreatingbeanwithname‘dataSource’definedinclasspathresource[org/springframework/boot/autoconfi......
  • Hadoop HDFS NameNode核心原理分析
    胡弦,视频号2023年度优秀创作者,互联网大厂P8技术专家,SpringCloudAlibaba微服务架构实战派(上下册)和RocketMQ消息中间件实战派(上下册)的作者,资深架构师,技术负责人,极客时间训练营讲师,四维口袋KVP最具价值技术专家,技术领域专家团成员,2021电子工业出版社年度优秀作者,获得2023电......
  • NameCheap域名怎么样,如何注册购买域名?如何解析域名?
    Namecheap介绍Namecheap是一家国外域名注册商和网站托管公司,成立于2000年,提供域名注册、虚拟主机、电子邮件托管、SSL证书、免费的WHOIS保护、CDN、VPS主机和独立服务器。Namecheap怎么样?在Namecheap中注册、购买域名也是不需要备案的,价格方面相对于Namesilo来说也会便宜许多,操......