gpt4 book ai didi

linux-kernel - 更改linux内核系统调用号

转载 作者:行者123 更新时间:2023-12-02 23:16:02 27 4
gpt4 key购买 nike

我想使用不同的系统调用表构建自己的自定义内核。 (相同的系统调用,但位置/编号不同)

我正在开发内核 3.2.29。

更改内核非常简单:

1) 更改 arch/x86/kernel/syscall_table_32.S 中的系统调用位置

2) 更改 arch/x86/include/asm/unistd_32.h 中的系统调用宏编号

3)编译并安装新内核

我交换了系统调用:sys_open 取代了 sys_read 的位置和数量,反之亦然。

我想,如果我使用修改后的内核头编译 glibc,我就可以拥有一个正在运行的系统,但不幸的是,这还不够,我的系统无法启动。

我错过了什么吗?为了拥有一个正在运行的系统,我还需要做什么?

<小时/>

我采取的步骤是:

1)按照我的问题中的描述构建和安装内核

2) 使用 make headers_install INSTALL_HDR_PATH=[path] 提取新的内核头文件

3) 使用参数--with-headers=[path/include]构建glibc

4) 我使用 live cd 从外部访问文件系统,以便安装新的 glibc,使用 make install install_root=[原始文件系统] (这样系统在安装过程中就不会崩溃)

我希望新的 glibc 已正确构建,但我不确定。

之后,启动系统时,启动会停止在 (initrafms) shell 屏幕中:我想我需要重建initrd,但是如何根据新的系统调用表来编译它?

最佳答案

你将不得不重建一切。即使所有二进制文件都是动态链接的,旧的系统调用也可能内联到二进制文件中,因为许多 C 函数只是 return syscall(__NR_somecall,...)

可以手动执行此操作,但除非您使用诸如 buildroot、aboriginal 或类似工具链,否则很难保持工具链正常。选择最适合您的(我更喜欢 Rob Landley 的原住民 - http://landley.net/aboriginal/ )

然后,为了让你的 initrd 只需使用 {z,bz,xz}cat oldinit.rd |cpio -id; 扩展旧的 initrd; rm oldinit.rd。用新的和 cpio 替换旧的内核模块、库和二进制文件并将其压缩回来(cpio 需要 -H newc 选项)...或者现在您可以重建内核并将 initramfs 指向该目录,但不建议如果您的 initrd 可能需要经常更改,例如您正在测试一个全新的系统调用结构并且必须进行大量调试。

关于linux-kernel - 更改linux内核系统调用号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13646207/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com