使用LLVM编译Linux内核

3
我们希望在FPGA上为单核RISCV处理器移植Linux。同时,Linux内核将被LLVM pass检测。
我的疑问是: 1. riscv-llvm工具链是否可以用于编译Linux内核? 2. riscv-llvm工具链现在是否支持添加自定义pass?

最近的Linux内核版本可以通过llvm进行构建(曾有名为http://llvm.linuxfoundation.org/的项目实现此功能;一些模块/选项在过去可能无法编译)。您的项目使用了哪个版本的Linux内核和llvm?您可以向任何llvm添加自定义传递,并且riscv的llvm源代码也是可用的。 - osgx
我们想要使用Linux内核2.6.33版本。我对编译Linux内核完全不了解。您能否给我一些关于这个过程的教程或建议? - Rambo
Rambo,RISC-V有2.6.33版的Linux内核吗?我认为只有https://github.com/riscv/riscv-linux这个版本,但它不是2.6而是3.14 / 4.1。你不能只编译那个旧内核;需要进行RISC-V的移植,这对于初学者来说并不是一项简单的任务。 - osgx
为什么选择2.6.33?它甚至不是LTS(直到2016年2月2.6.32才是LTS),已经有6年的历史了。 - osgx
非常感谢您的回复。一开始,我们想要基于FPGA实现基于RISCV处理器的设计。现在,我们决定基于gem5模拟器来实现它。我有硬件背景(VLSI设计)。现在,我想要实现一个计算机架构项目(包括操作系统、模拟器、编译器等)。因此,我必须面对很多挑战。我使用Linux kernel-2.6.33进行我的初始实验,所以我选择了它。关键是如何使用LLVM编译Linux内核,并编写一个传递来生成间接跳转/调用指令的目标地址。 - Rambo
Rambo,你来自哪里?你有操作系统/编译器经验吗,还是这是大学项目?目前没有可用的RISC-V公共gem5。 - osgx
1个回答

4
选择的Linux版本2.6.33存在两个问题。
第一个问题是,RISC-V团队从未将此版本移植到RISC-V。他们在https://github.com/riscv/riscv-linux中有3.14和4.1版本。因此,要在RISC-V处理器上启动它,您需要重复所有依赖架构的部分(内核的arch /目录)的移植。即使对于目标CPU有一些移植版本,这也是非常复杂的任务。您可以从3.14回溯一些内容,但是2.6.33和3.14是不同的,它们之间有几年的进化。(PORTING不仅仅是编译,还需要写30个文件并查找错误或进行长时间调试。)
第二个问题是,LLVM只能完全构建具有来自http://llvm.linuxfoundation.org/项目的补丁的现代Linux内核版本。某些内核部分使用了GCC扩展,这些扩展未得到支持(也永远不会得到clang / llvm的支持)。可以进行部分构建,但旧版Linux的两三个组件无法使用clang构建。
因此,我真的建议您使用来自RISCV团队的Linux内核版本,而较新的(4.1)版本更好。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接