【发布时间】: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