2012-11-30 83 views
6

我想用另一个syscall表构建我自己的定制内核。 (相同的系统调用,但在不同的位置/数字)更改linux内核系统调用号

我正在研究内核3.2.29。

改变内核是很容易:

1)改变在拱系统调用位置/ 86 /内核/ syscall_table_32.S

2)改变在拱系统调用宏数/ 86 /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表编译它?

+0

请不要对题目问题进行近距离投票,特别是当他们有upvotes和答案时。 –

+0

为什么会这样做? –

+0

@JonasWielicki在某人“帮助”编辑出问题之前,有人解释说,这是在学校任务后添加一个新的系统调用的实验。尽管存在有问题的效用,但这里所考虑的改变确实提醒人们注意事情是如何工作的,并且存在许多依赖关系。破解一个没有人依赖的系统可能是学习东西的好方法。 –

回答

0

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

+0

和动态构建应用程序的启动代码也可能会执行一个或两个系统调用(如exit(2)) –

+0

@tmyklebu您认为'glibc'可以编译到新系统上工作,使用新系统进行编译呢?如果是这样,那么为了做到这一点需要采取哪些一般性步骤? – assafmo

+0

@tmyklebu我想要一个最低限度的工作系统,所以我只会重建基本的静态链接的二进制文件,但是你能否给我带来谁来重建新系统的initrd? – 4x6hw

0

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

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

+0

我编辑了这个问题来更好地描述这个过程,以及何时引导失败 – 4x6hw

0

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

1

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

可能这样做手动,但它可能很难保持工具链直,除非你使用像buildroot,原住民或类似的交叉编译工具链。无论选择哪种最适合你(我更喜欢罗布·兰德利原住民 - http://landley.net/aboriginal/

然后让你的initrd的只是使用{Z,BZ,XZ}猫oldinit.rd扩大旧|的cpio -id; rm oldinit.rd。用new和cpio替换旧的内核模块,库和二进制文件,并将其压缩(cpio需要-H newc选项)...或者现在可以重新构建内核并将initramfs指向该目录,但不会推荐如果您的initrd可能需要频繁更改,例如您正在测试一个全新的系统调用结构并且需要进行大量调试。