更改linux内核系统调用号

时间:2012-11-30 13:26:55

标签: linux-kernel glibc system-calls

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

我正在研究内核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=[the original file system](因此系统在安装过程中不会中断)

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

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

4 个答案:

答案 0 :(得分:1)

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

可以手动执行此操作,但除非你使用像buildroot,原住民或类似的交叉编译工具链,否则很难保持工具链的直线。挑选最适合你的人(我更喜欢Rob Landley的原住民 - http://landley.net/aboriginal/

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

答案 1 :(得分:0)

加扰系统电话号码确实会受到伤害。您至少需要重建系统和initrd上的所有静态链接二进制文件(如果使用的话)。

答案 2 :(得分:0)

您还没有说过启动失败的时间点,但即使内核出现,initrd压缩ramdisk中包含的关键程序也可能会失败,因为它们具有硬编码的原始系统调用号。您还需要重建和重新包装它们。

您可以考虑首先用静态hello-world类型的程序替换init,以验证您的内核是否可以支持用户空间;然后查看使现代linux用户空间匹配的所有复杂性的细节。

答案 3 :(得分:0)

你必须学会​​阅读恐慌转储的信息并向我们展示内核恐慌。没有这些信息,人们很难帮助您或为您提供有用的建议。