我想用不同的系统调用表构建自己的自定义内核。 (相同的系统调用,但位置/数字不同)
我正在研究内核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]
4)我使用live cd从外部访问文件系统,以便使用glibc
安装新的make install install_root=[the original file system]
(因此系统在安装过程中不会中断)
我希望新的glibc
已正确构建,但我不确定。
之后,在启动系统时,启动会在(initrafms)shell屏幕中停止:
我想我需要重建initrd
,但是如何根据新的系统调用表进行编译呢?
答案 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)
你必须学会阅读恐慌转储的信息并向我们展示内核恐慌。没有这些信息,人们很难帮助您或为您提供有用的建议。