当前位置: 首页 > 面试题库 >

替换Linux内核3中的系统调用

隆向晨
2023-03-14
问题内容

我有兴趣用将在Linux内核3中实现的自定义替换系统调用。我了解到sys调用表不再公开。

有任何想法吗?

对此http://www.linuxtopia.org/online_books/linux_kernel/linux_kernel_module_programming_2.6/x978.html示例的任何引用,对于内核3都将不胜感激:)

谢谢!


问题答案:

我建议使用kprobes进行此类工作,如果需要,您可以使用内核模块轻松中断任何内核地址(或符号…)并更改执行路径,所有这些都在运行时进行。

Kprobes通过用中断(例如x86上的int3)动态替换一条指令(例如,系统调用条目的第一条指令)来工作。在do_int3处理程序内部,一个通知程序通知kprobes,后者又将执行传递给已注册的函数,从这一点上您几乎可以执行任何操作。

Documentation /
kprobes.txt中
提供了一个非常好的文档,因此作为samples
/ kprobes /
kprobes_example.c中的

一个小示例(在本示例中,它们在do_fork上中断以记录系统上的每个fork)。它具有非常简单的API,并且如今非常易于移植。

警告
:如果您需要更改执行路径,请确保您的kprobes没有经过优化(例如,处理程序的jmp指令代替了您中断的指令,而不是int3),否则您将无法真正轻松地更改执行(退出函数后,系统调用函数仍将照常执行)。如果您仅对跟踪感兴趣,那就很好,您可以放心地忽略此问题。



 类似资料:
  • vsyscalls 和 vDSO 这是讲解 Linux 内核中系统调用章节的第三部分,前一节讨论了用户空间应用程序发起的系统调用的准备工作及系统调用的处理过程。在这一节将讨论两个与系统调用十分相似的概念,这两个概念是vsyscall 和 vdso。 我们已经了解什么是系统调用。这是 Linux 内核一种特殊的运行机制,使得用户空间的应用程序可以请求,像写入文件和打开套接字等特权级下的任务。正如你所

  • Linux 内核如何处理系统调用 前一小节 作为本章节的第一部分描述了 Linux 内核system call 概念。 前一节中提到通常系统调用处于内核处于操作系统层面。前一节内容从用户空间的角度介绍,并且 write系统调用实现的一部分内容没有讨论。在这一小节继续关注系统调用,在深入 Linux 内核之前,从一些理论开始。 程序中一个用户程序并不直接使用系统调用。我们并未这样写 Hello Wo

  • 简介 这次提交为 linux-insides 添加一个新的章节,从标题就可以知道, 这一章节将介绍Linux 内核中 System Call 的概念。章节内容的选择并非偶然。在前一章节我们了解了中断及中断处理。系统调用的概念与中断非常相似,这是因为软件中断是执行系统调用最常见的方式。我们将讨论系统调用概念的各个方面。例如,用户空间发起系统调用的细节,内核中一组系统调用处理器的执行过程, VDSO

  • 问题内容: 我对这个内核东西很陌生。我要做的只是向内核添加一个新的系统调用。我正在遵循以下指南:http : //hekimian-williams.com/?p=20。 问题是存在于arch / x86 / kernel下的syscall_table_32.S文件中,但是在内核版本3.3中找不到x86系统的文件。我仍然需要编辑文件并为新添加的系统调用追加一行吗?还是我需要做其他事情让内核知道我的

  • 这不是 linux-insides 中的一般章节。正如你从题目中理解到的,它主要描述 Linux 内核中的内部系统数据结构。比如说,中断描述符表 (Interrupt Descriptor Table), 全局描述符表 (Global Descriptor Table) 。 大部分信息来自于 Intel 和 AMD 官方手册。

  • 系统调用 我们要想启动一个进程,需要操作系统的调用(system call)。实际上操作系统和普通进程是运行在不同空间上的,操作系统进程运行在内核态(todo: kernel space),开发者运行的进程运行在用户态(todo: user space),这样有效规避了用户程序破坏系统的可能。 如果用户态进程想执行内核态的操作,只能通过系统调用了。Linux提供了超多系统调用函数,我们关注与进程相