0

我正在尝试在 Xeon-phi 上启动自定义内核,而不是默认的 Linux 内核。在此链接上,我找到了一种交叉编译内核的方法,该内核使用 k1om-mpss-linux-gcc 交叉编译器成功编译。交叉编译是否足够?我得到错误

mykernel.img 不是 k1om Linux bzImage

编辑:所以,我使用 /usr/linux-k1om-4.7/bin/x86_64-k1om-linux-gcc 编译器来编译一个简单的 helloworld.c 程序和内核源代码。我在可执行文件上得到了 objdump -f 的两种不同类型的结果。

对于 helloworld.c:

hello: file format elf64-k1om architecture: k1om, flags 0x00000112: EXEC_P, HAS_SYMS, D_PAGED start address 0x0000000000400400

对于我的内核:

mykernel: file format elf32-i386 architecture: i386, flags 0x00000112: EXEC_P, HAS_SYMS, D_PAGED start address 0x0010000c

我使用相同的编译器编译,但它们显示不同的架构。这是什么原因?

4

2 回答 2

0

您最初问题的答案 - 不,不幸的是,它不像交叉编译那么简单。对 MPSS 附带的内核进行了许多更改。我不知道所有的变化,但我知道的一个很大的变化是他们必须添加对协处理器上更大寄存器集的支持,以便能够在上下文切换上保存状态。

至于为什么文件格式是elf32-i386而不是elf32-k1om——

您引用的网站提到在可能对文件进行一些更改后重新编译 MPSS 附带的内核。您会注意到他们还复制了已安装内核版本的配置文件。因此,他们拥有所有文件来完全按照已制作的方式重新制作内核。

我怀疑,在你的情况下,要么a)你的源目录中有某种配置脚本,它选择了你正在运行的架构,并在makefile运行时造成混乱,要么b)你的makefile不知道k1om是什么. 在任何一种情况下,它都会退回到它认为的最低公分母 i386。正如我所说,这只是我的一个怀疑,但仔细阅读你的 makefile 应该可以找到答案。

于 2015-04-10T04:52:38.817 回答
0

首先要做的是弄清楚是什么mykernel.img。尝试运行file它。

 $ file  /opt/mpss/3.4/sysroots/k1om-mpss-linux/boot/vmlinux-2.6.38.8+mpss3.4
 /opt/mpss/3.4/sysroots/k1om-mpss-linux/boot/vmlinux-2.6.38.8+mpss3.4: ELF 64-bit LSB executable, version 1 (SYSV), statically linked, BuildID[sha1]=0xa4c16ee85c11aca4e78dc4ae46d3827fb74289c1, not stripped

$ objdump -f /opt/mpss/3.4/sysroots/k1om-mpss-linux/boot/vmlinux-2.6.38.8+mpss3.4

/opt/mpss/3.4/sysroots/k1om-mpss-linux/boot/vmlinux-2.6.38.8+mpss3.4:     file format elf64-k1om
architecture: k1om, flags 0x00000112:
EXEC_P, HAS_SYMS, D_PAGED
start address 0x0000000001000000
于 2015-04-08T23:02:14.087 回答