6

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

我正在研究内核 3.2.29。

更改内核非常简单:

1) 在arch/x86/kernel/syscall_table_32.S中改变系统调用位置</p>

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

3)编译安装新内核

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

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

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


我采取的步骤是:

1)如我的问题中所述构建和安装内核

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

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

4)我使用live cd从外部访问文件系统以安装新的glibc,使用make install install_root=[the original file system](因此系统在安装过程中不会中断)

我希望新glibc的建造得当,但我不确定。

之后,在引导系统时,引导停止在 (initrafms) shell 屏幕中:我想我需要重新构建initrd,但是如何根据新的 syscall 表编译它?

4

4 回答 4

1

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

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

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

于 2013-02-22T22:41:47.290 回答
0

您还没有说引导在什么时候失败,但是即使内核启动,initrd 压缩 ramdisk 中包含的关键程序也可能会失败,因为它们具有硬编码的原始系统调用号。您还需要重建和重新打包它们。

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

于 2012-11-30T15:58:00.460 回答
0

打乱系统调用号码真的会很痛苦。您至少需要重建系统和 initrd 上的所有静态链接二进制文件(如果您使用的话)。

于 2012-11-30T13:54:05.607 回答
0

你必须学会​​阅读 pansic dump 的信息并向我们展示什么是 kenrel 恐慌。没有这些信息,人们几乎无法帮助您或为您提供有用的建议。

于 2012-12-12T01:54:38.953 回答