Gcc 在xeon phi上引导自定义内核

Gcc 在xeon phi上引导自定义内核,gcc,kernel,cross-compiling,xeon-phi,Gcc,Kernel,Cross Compiling,Xeon Phi,我试图在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的两种不同类

我试图在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:

你好:文件格式elf64-k1om
架构:k1om,标志0x00000112:
执行官,有符号,已分页
起始地址0x000000000040400

对于mykernel:

mykernel:文件格式elf32-i386
架构:i386,标志0x00000112:
执行官,有符号,已分页
起始地址0x0010000c


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

首先要做的是弄清楚什么是
mykernel.img
。尝试在其上运行
文件

 $ 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

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

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

您引用的网站提到在可能对文件进行一些更改后重新编译MPS附带的内核。您会注意到,它们还复制了内核安装版本的配置文件。因此,他们有所有的文件来重新制作内核,就像它制作的一样


我怀疑,在您的情况下,a)在源目录中有某种配置脚本,它拾取了您正在运行的体系结构,并在makefile运行时造成混乱,或者b)您的makefile不知道k1om是什么。在这两种情况下,它都回到了它认为的最低公分母i386。正如我所说,这只是我的一个怀疑,但仔细阅读您的makefile应该会得出答案。

您现在使用的是什么版本的MPS,您编译了哪个版本?我使用的是3.4.2。我想做的是用另一个内核替换当前的linux内核。现在,我的内核应该需要一些补丁,但我无法继续,因为它没有给出任何错误,除了在我成功地交叉编译之后,它无法识别映像。对于文件,我得到“x86引导扇区”,对于objdump,“无法识别文件格式”。您得到的是磁盘映像,而不是Linux内核。磁盘映像包括引导扇区、引导加载程序和Linux内核。查找以vmlinux*开头的另一个文件。因此,这些是正确的结果-
mykernel:ELF 32位LSB可执行文件,Intel 80386,版本1(SYSV),静态链接,不剥离,D_PAGED start address 0x0010000c
我仍然得到相同的错误
mykernel可能不是k1om Linux bzImage,但它确实应该具有k1om体系结构。似乎您没有正确使用交叉编译器,而是使用了本机gcc。