Linux 内核的静态调用图生成

2024-04-03

我正在寻找一个工具来静态生成 Linux 内核的调用图(对于给定的内核配置)。生成的调用图应该是“完整的”,即包含所有调用,包括潜在的间接调用,我们可以假设在 Linux 内核的情况下只能通过使用函数指针来完成调用。

例如,这可以通过分析函数指针类型来完成:这种方法会导致图中出现多余的边,但这对我来说没问题。

ncc http://students.ceid.upatras.gr/~sxanth/ncc/似乎实现了这个想法,但是我没有成功地使它在 3.0 内核上工作。还有其他建议吗?

我猜测这种方法在使用函数指针转换的情况下也可能导致边缘丢失,所以我也有兴趣知道这是否可能出现在 Linux 内核中。

附带说明一下,似乎还有其他工具能够对源代码进行语义分析以推断潜在的指针值,但据我所知,它们都不是设计用于 Linux 内核等项目的。

任何帮助将非常感激。


我们已经完成了 2600 万行(18,000 个编译单元)的整体 C 系统的全局指向分析(使用间接函数指针)和完整调用图构建。

我们用我们的DMS 软件再造工具包 http://www.semanticdesigns.com/Products/DMS/DMSToolkit.html, its C前端 http://www.semanticdesigns.com/Products/FrontEnds/CFrontEnd.html和它的相关的流动分析机器 http://www.semanticdesigns.com/Products/DMS/FlowAnalysis.html。点分析机制(以及其他分析)是保守的;是的,您会得到一些虚假的指向,因此会调用边缘。这些是很难避免的。 您可以通过提供有关关键功能的某些关键事实以及利用诸如“嵌入式系统[和操作系统]在调用图中往往没有循环”之类的知识来帮助此类分析器,这意味着您可以消除其中的一些。当然,你必须允许例外;我的道德观是:“在大系统中,一切都会发生。”

该特定问题包括使用特定于该特定软件的特殊加载方案动态加载(!)C 模块,但这只是增加了问题。

不应该对函数指针进行强制转换lose边缘;保守的分析应该简单地假设强制转换指针与系统中具有与强制转换结果相对应的签名的任何函数匹配。更成问题的是产生某种兼容签名的强制转换;如果在实际调用的函数接受 int 时将函数指针强制转换为 void* foo(uint),则分析点必然会保守地选择错误的函数。你不能为此责怪分析仪;演员阵容就在这种情况下。是的,我们在2600万行的系统中看到了这种垃圾。

这当然是分析 Linux 的正确规模(我认为只有 800 万行左右:-)。但我们还没有专门在 Linux 上尝试过。

设置此工具很复杂,因为您必须捕获有关编译本身的所有详细信息,特别是要生成的 Linux 内核的配置。因此,您几乎必须拦截编译器调用才能获取命令行开关等。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux 内核的静态调用图生成 的相关文章

  • ARM Cortex A8 PMNC 读取在启用后也给出 0.. 有什么想法/建议吗?

    MODULE LICENSE GPL MODULE DESCRIPTION user mode access to performance registers int init arm init void unsigned int valu
  • Linux 内核模块 Makefile 不能包含相对路径

    我正在尝试构建 Linux 内核模块 KBUILD EXTRA SYMBOLS Module symvers KBUILD EXTRA SYMBOLS dir0 Module symvers KDIR kernel linux 4 9 IN
  • Linux Slab 分配器和缓存性能

    来自指南理解Linux内核第三版 第 8 2 10 章 板坯着色 从第 2 章我们知道 同一个硬件缓存行映射许多不同的 RAM 块 在这个 在本章中 我们还看到相同大小的对象最终存储在缓存中的相同偏移量处 不同板内具有相同偏移量的对象将以相
  • C 语言中这个奇怪的函数指针声明是什么意思? [复制]

    这个问题在这里已经有答案了 谁能解释一下什么int foo int int 在这呢 int fooptr int int foo int int Can t understand what this does int main fooptr
  • 使用 bitbake 为 BBB 构建 .dtbo 覆盖

    我使用内核 linux ti staging 4 14 和自定义设备树为我的 BBB 构建了 yocto 发行版 rocko 由于我需要将一个旧项目从 Debian 移植到 Yocto 因此我还需要在内核中启用 UIO 功能 这也可以正常工
  • 调试严重的 SIGILL 崩溃:文本段损坏

    我们的系统是基于 PowerPC 的运行 Linux 的嵌入式系统 我们遇到了随机的 SIGILL 崩溃 这种情况在各种应用程序中都会出现 崩溃的根本原因是将要执行的指令归零 这表明内存中的文本段已损坏 由于文本段是以只读方式加载的 因此应
  • 套接字对和一对无名管道有什么区别吗?

    我不仅想知道用户端的差异 还想知道 Linux 内核实现中的差异 共同部分 管道是单向的 因此需要两个管道才能进行双向通信 而套接字对是双向的 管道始终是面向流的 而套接字对可以是面向数据报的 套接字对正常AF UNIX套接字 这意味着辅助
  • 比较 std::functions 是否相等?

    如何比较两个 C 11std functions with operator 并返回true如果两者都说functions 引用同一个函数指针吗 你实际上可以让它工作 target template
  • x86 平台中的 KVM 影子页表处理

    据我了解 在没有硬件支持来宾虚拟到主机物理地址转换的处理器上 KVM 使用影子页表 当来宾操作系统修改其页表时 会构建和更新影子页表 硬件中有没有专门的指令 以x86为参考 来修改页表 除非有特殊说明 否则不会对VMM 造成陷阱 Linux
  • 如何在 Linux 内核空间使用 ioctl()?

    可以打电话吗ioctl来自 Linux 内核模块 谁能提供一个如何使用它的例子吗 您可以尝试拨打电话sys ioctl 如果内核是用以下命令编译的 则它会被导出CONFIG COMPAT 或者 如果您有设备驱动程序struct file o
  • 是否可以将 CFLAGS 设置为 Linux 内核模块 Makefile?

    例如 常见设备模块的Makefile obj m jc o default MAKE C lib modules shell uname r build M shell pwd modules clean MAKE C lib module
  • 在 Go 中执行字节数组

    我正在尝试在 Go 程序中执行 shellcode 类似于使用其他语言执行此操作的方式 示例 1 C 程序中的 Shellcode https stackoverflow com questions 16626857 shellcode i
  • 函数类型有什么用?

    鉴于以下两个typedefs typedef void pftype int typedef void ftype int 我明白第一个定义pftype作为指向一个函数的指针 该函数接受一个int参数并且不返回任何内容 第二个定义ftype
  • Xenomai 中的周期性线程实时失败

    我正在创建一个周期性线程 它在模拟输出上输出方波信号 我正在使用 Xenomai API 中的 Posix Skin 和 Analogy 我使用示波器测试了代码的实时性能 并查看了方波信号 频率为 1kHz 的延迟 我应该实现 250us
  • C++ 中的函数指针与仿函数

    使用函子和函数指针有什么区别 例如 Functor struct add x int x add x int y x y int operator int y return x y Function int func int x retur
  • Linux、ARM:为什么仅当启动时存在 I2C GPIO 扩展器时才创建 gpiochip

    在 imx6sx 硬件平台 NXP 嵌入式 ARM 上使用 Linux 3 14 52 问题是设备树中指定的 PCF8575 I2C GPIO 扩展器不会实例化为 sys class gpio 结构中的设备 除非它们在内核启动期间存在 这些
  • modinfo srcversion:如何从我的源生成此版本?

    我有一个 Linux 模块的编译版本 然后我有大约 20 多个其源代码的变体 由于各种愚蠢的错误 我已经不知道哪个版本的源代码是我用来制作模块的实际版本了 我注意到modinfo
  • 了解 U-Boot 内存占用

    我不明白加载 U Boot 时 RAM 中发生了什么 我正在开发 Xilinx Zynq ZC702 评估套件 并尝试使用 U Boot 在其上加载 Linux 内核 于是我使用Xilinx工具Vivado和SDK生成了一个BOOT bin
  • 如何模拟ARM处理器运行环境并加载Linux内核模块?

    我尝试加载我的vmlinux into gdb并使用 ARM 内核模拟器 但我不明白为什么我会得到Undefined target command sim 这是外壳输出 arm eabi gdb vmlinux GNU gdb GDB 7
  • 内存调试:如何获取 Linux 用户空间/内核空间中的锁定页面信息

    有什么方法可以获取Linux用户空间 内核空间中的锁定页面 虚拟内存页面 信息 我想了解详细信息 例如 谁锁定了页面 有多少页被锁定 进程名称 谁锁定了页面 还让我了解内核空间和用户空间的内存调试技术 对于内存中的每个页面 都会为其分配标志

随机推荐

  • CSS 剪辑动画

    我正在尝试使用 CSS3 过渡来制作 CSS 动画clip没有成功 图像只是剪辑而没有过渡 我缺少什么 clipped position absolute width auto clip rect 100 100 100 100 webki
  • Facebook Connect 发布对话框文本?

    您好 我已经让 Facebook Connect 与功能性登录和注销按钮一起使用 另外 当我按下按钮时 我想发布到 Facebook 我可以做到这一点 有点 你看 我有一个用户事先自定义的指定字符串 它叫做 statusUpdates 我不
  • 如何让现有分支跟踪远程分支?

    我正在尝试使用以下命令跟踪现有分支到远程分支 track or set upstream to 但出现以下错误 git branch track master origin master fatal A branch named maste
  • qml 无框窗户的阴影

    我有无框主窗口 由 qml 创建 ApplicationWindow 在我的 main qml 文件中 我通过以下方式实例化 qmlQQmlApplicationEngine load Qt5 1中引入的类 如果我设置Qt Frameles
  • 深度优先搜索 (DFS) 与广度优先搜索 (BFS) 伪代码和复杂性

    我必须为计算连接数量的算法开发伪代码 给定顶点 V 和边 E 图中的分量 G V E 我知道我可以使用深度优先搜索或广度优先搜索来计算连接组件的数量 但是 我想使用最有效的算法来解决这个问题 但我不确定每个算法的复杂度 下面是用伪代码形式编
  • Xcode 8 Shell 脚本调用错误

    I m trying to fix this issue for hours but it still persists Tried everything on the forums nothing helped I m using Coc
  • C#,使用 zlib 解压缩流

    我正在尝试解压缩字节数组 byte bloc 120 156 211 97 144 76 247 142 98 228 98 0 2 70 101 6 166 8 16 131 133 131 145 129 209 134 129 133
  • shell 解析一行来查找某个标签

    我计划创建一个简单的脚本来根据属性文件中存储的值编辑文件 所以本质上我计划循环遍历原始文件中的每一行 当它遇到一行中的某个标签时 比如 它将获取该标签后面的文本 即证书 然后实现一个函数来解析属性文件获取某些值并将它们添加到原始文件中 例如
  • HTML5 的子集或约束可以完美映射到 XHTML5,反之亦然?

    我需要在 a 中表示内容通用语 也就是说 在当今时代 HTML5标准 我的目标不是在网络浏览器中显示页面 我需要代表仅有内容 没有界面 没有布局 没有逻辑 没有Javascript 正如所记得的其他问题 https stackoverflo
  • 如何枚举所有HID设备? C#

    我需要枚举连接到我的 PC 的所有 HID 设备 我尝试使用这个答案 https stackoverflow com a 3331509 902424 但它枚举了 USBHub 设备 但我在那里找不到我的 HID 设备 EDIT 我很高兴知
  • TCP recvfrom() 不存储“from”

    我正在使用 TCP 制作一个服务器程序 我想获取我刚刚收到的消息发送者的 IP 地址 这是我的代码 case FD READ Incoming data get ready to receive char buffer DEFAULT BU
  • 如何让 jquery 拖动在移动设备上工作?

    我有一个应用程序 允许用户拖动一些图像 它使用jquery 我试图让它在移动设备上工作 在iPhone上 如果我拖动图像 那么它会拖动整个页面 我想使用 jquery 移动 这是正确的方法吗 如果是这样 从常规 jquery 过渡到 jqu
  • 使用查询结果作为表名

    如果我们有如下表 A Table 如何执行涉及以下值的查询A table作为表名 我的意思是这样的 SELECT Table as tbl FROM A SELECT FROM tbl 但在一份声明中 SQLite没有内置的动态构造SQL语
  • Gephi 中的平行边是什么?导入边列表时如何处理它们?

    当我导入 gexf 文件时 它会标记一堆平行边 我不知道什么是平行边以及为什么我的图表存在问题 我正在尝试创建一个动态 gephi 图 如果一对两个节点之间有多条边 这些边彼此平行 因此它们是平行边 Gephi 中无法表示平行边 因此 Ge
  • Github 错误:找不到存储库(是的,还有另一个)

    我在这里搜索并阅读了大多数类似的问题 但似乎没有一个与我的相同 我在 Github 上有一个私人仓库 一个小时前我可以很好地推送 现在 我收到错误 未找到存储库消息 我的 ssh config 中有以下内容 Host github Host
  • GitHub:我为什么要分叉?

    我知道分叉是在服务器端克隆存储库 但我不明白为什么我要这么做 为什么不将原始存储库克隆到我的计算机 添加我的代码 而不是将新分支推送到 GitHub 并发出拉取请求 我知道分叉是在服务器端克隆存储库 差不多是这样吧 在 GitHub 上 分
  • JQuery 将变量从 href 传递到 load()

    我试图在 JQuery 中将 href id 传递给 load 我可以从警报中看到返回的 id 960 所以我知道 id 值已经过去了 我只是不知道如何附加加载 url refreshme add id 是重要的部分 我用它来刷新数据库拉取
  • 检查具有关联的对象

    我有两个模型 其中 A has many B 如果我加载 A 包括关联的 B a A find first include bs a inspect只显示a的属性 gt a 我能怎么做a inspect这样它就会显示所有关联的a bs 默认
  • Android 旋转位图而不进行复制

    有没有办法旋转位图而不复制它 或者也许是保存位图的图像视图 现在我有类似的东西 Bitmap bm BitmapFactory decodeFile get the orientation Matrix m new Matrix m pos
  • Linux 内核的静态调用图生成

    我正在寻找一个工具来静态生成 Linux 内核的调用图 对于给定的内核配置 生成的调用图应该是 完整的 即包含所有调用 包括潜在的间接调用 我们可以假设在 Linux 内核的情况下只能通过使用函数指针来完成调用 例如 这可以通过分析函数指针