0
  1. linux 2.6 与 2.4 有何不同?
  2. 我们可以修改源内核吗?
  3. 我们可以修改 int 0x80 服务程序吗?
4

2 回答 2

6

更新:
1. 0x80 处理程序在 2.4 和 2.6 之间基本相同,尽管从处理程序调用的函数由 2.6 中 x86-64 的“syscall”指令处理程序调用。2. 0x80 处理程序可以像内核的其余部分一样进行修改。
3. 你不会因为修改它而破坏任何东西,除非你删除向后兼容性。例如,如果您愿意,可以添加自己的跟踪或后门。另一篇文章说,如果您修改处理程序,您将破坏您的库和工具链是不正确的。如果你破坏了调度算法,或者错误地修改了调度表,那么你就会破坏事情。
3a。正如我最初发布的那样,扩展 0x80 服务的最佳方法是扩展系统调用处理程序。

正如内核源代码所说:

What:内核系统调用接口
描述:
        该接口与 POSIX 接口的大部分内容相匹配,并且基于
        在它和其他基于 Unix 的接口上。它只会被添加到
        随着时间的推移,并没有从它删除的东西。

    Note that this interface is different for every architecture
    that Linux supports.  Please see the architecture-specific
    documentation for details on the syscall numbers that are to be
    mapped to each syscall.


i386 的系统调用表条目位于:
arch/i386/kernel/syscall_table.S

请注意,该表是一个指针序列,因此如果您想与内核维护者保持一定程度的前向兼容性,您需要在放置指针之前填充该表。系统调用向量号在.h

中定义, 然后 traps.c 设置函数的地址 via ,它将条目放入中断描述符表中。该函数本身在entry.S 中,并从系统调用表中调用所请求的指针。 有一些看家的细节,看代码可以看到,但是直接修改0x80中断处理是在entry.S里面完成的irq_vectors
system_callset_system_gatesystem_call
system_call功能。以一种更理智的方式,您可以修改系统调用表,插入您自己的函数而不修改调度机制。

事实上,在阅读了 2.6 的源代码后,它直接说 int 0x80 和 x86-64 系统调用使用相同的代码,到目前为止。因此,您可以对 x86-32 和 x86-64 进行可移植的更改。
END 更新

INT 0x80 方法调用系统调用表处理程序。这将寄存器参数与调用表匹配,根据 EAX 寄存器的内容调用内核函数。您可以轻松扩展系统调用表以添加自定义内核 API 函数。

这甚至可能适用于 x86-64 上的新系统调用代码,因为它也使用系统调用表。

如果您以任何方式更改当前系统调用表而不是扩展它,您将破坏所有依赖库和代码,包括 libc、init 等。

这是当前 Linux 系统调用表:http ://asm.sourceforge.net /syscall.html

于 2009-02-26T17:44:42.477 回答
5
  1. 这是一次架构大修。一切都在内部发生了变化。SMP 支持已经完成,进程调度程序得到了极大的改进,内存管理得到了彻底的改进,还有很多很多其他的事情。
  2. 是的。它是开源软件。如果您没有源代码的副本,您可以从供应商或kernel.org获得。
  3. 是的,但这是不可取的,因为它破坏 libc,它破坏你的基本布局,如果你改变现有系统调用的顺序,它破坏你的工具链,并且几乎所有你可能认为你想做的事情都应该在用户空间中完成一切皆有可能。
于 2009-02-26T17:36:37.563 回答