【问题标题】:Changing linux kernel system call number更改linux内核系统调用号
【发布时间】:2012-11-18 17:34:24
【问题描述】:

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

我正在开发内核 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,但是如何根据新的系统调用表编译它?

【问题讨论】:

  • 请不要对主题问题进行近距离投票,尤其是当他们有投票和答案时。
  • @JonasWielicki 在有人“帮助”编辑它之前,解释说这是在学校分配添加新系统调用之后的实验。尽管实用性值得怀疑,但此处考虑的更改肯定会引起人们对事物如何工作以及存在许多依赖关系的关注。破解一个没人依赖的系统可能是学习事物的好方法。
  • @ChrisStratton 啊,感谢您的澄清。学习和搞乱是处理事情的好方法,我只是想知道:)

标签: linux-kernel glibc system-calls


【解决方案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 可能需要经常更改,例如您正在测试一个全新的系统调用结构并且必须进行大量调试。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 动态构建应用程序中的启动代码也可能会执行一两个系统调用(如 exit(2))
    • @tmyklebu 你认为glibc 可以编译到新系统上工作,而不是使用新系统编译吗?如果是这样,那么需要采取哪些一般步骤才能做到这一点?
    • @tmyklebu 我想要一个最小的工作系统,所以我将只重建必要的静态链接二进制文件,但是你能告诉我谁为新系统重建 initrd 吗?跨度>
    • @tmyklebu 我还需要在内核中进行哪些更改?
    【解决方案3】:

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

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

    【讨论】:

    • 我编辑了问题以更好地描述过程以及启动失败的时间
    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 2010-09-20
      • 1970-01-01
      • 2013-04-25
      • 2011-01-07
      • 2018-09-15
      • 1970-01-01
      • 2012-01-07
      • 2013-11-01
      • 1970-01-01
      相关资源
      最近更新 更多