Linux 内核 OpenRISC 架构移植指南:从工具链搭建、内核编译到 FPGA 与 QEMU 运行

发布时间:2026/9/12 14:09:37
Linux 内核 OpenRISC 架构移植指南:从工具链搭建、内核编译到 FPGA 与 QEMU 运行 Linux 内核 OpenRISC 架构移植指南从工具链搭建、内核编译到 FPGA 与 QEMU 运行【免费下载链接】linuxLinux kernel source tree项目地址: https://gitcode.com/GitHub_Trending/li/linux导读本指南围绕 Linux 内核仓库中的 OpenRISC 架构移植Port展开系统讲解这一将 Linux 移植到 OpenRISC 类微处理器以 32 位 OpenRISC 1000 家族、即 or1k 为初始目标的架构移植工作的全貌。文章以 Documentation/arch/openrisc/openrisc_port.rst 为骨架结合 arch/openrisc 下的源码、Kconfig 配置与各平台 defconfig完整覆盖工具链准备、内核交叉编译、initramfs 嵌入、FPGA 板级运行FuseSoC OpenOCD以及 QEMU 模拟运行等实战流程。读完本文你将掌握从零构建并运行 OpenRISC Linux 内核的完整操作链路并理解 or1k 移植在配置、指令集与设备树层面的工程细节。一、OpenRISC 移植概览OpenRISC 是一个开源的精简指令集RISC处理器架构而 Linux 内核对其的支持是一个完整的架构移植port。该移植的初始目标是32 位的 OpenRISC 1000 家族or1k其核心实现集中在仓库的 arch/openrisc 目录下涵盖内核启动与异常/陷阱处理head.S、entry.S、traps.c进程与信号管理process.c、signal.c、ptrace.c内存管理MMU、TLB、ioremapmm/子目录中断控制器OR1K PIC与定时器irq.c、sync-timer.c设备树Device Tree启动与平台初始化prom.c、setup.c对称多处理SMP支持smp.c从 arch/openrisc/Kconfig 可以看到该移植是一套相当完整的架构配置定义了OPENRISC架构入口并选中了OFDevice Tree、IRQ_DOMAIN、GENERIC_IRQ_CHIP、HAVE_ARCH_JUMP_LABEL、HAVE_PCI、MMU、SMP可配以及PCI_MSI if PCI等一系列基础设施说明该移植已深度接入主线内核的通用框架。术语表openrisc / or1k / or1200原文档明确指出在代码中以下三个前缀用于限定符号的作用范围避免混淆不同层级的处理器实现代码中的称谓含义openriscOpenRISC 类处理器架构大类or1kOpenRISC 1000 家族处理器or1200OpenRISC 1200 处理器具体实现这一约定在源码中随处可见例如 arch/openrisc/Kconfig 中的子架构选项OR1K_1200对应 OR1200 通用架构以及设备树节点中出现的compatible opencores,or1200-rtlsvn481。理解这三个层次的差异是阅读 OpenRISC 相关代码的前提。二、第一步搭建 OpenRISC 工具链要编译 Linux 内核首先需要一个针对 OpenRISC 目标的交叉编译工具链。原文档给出的途径包括直接获取预编译二进制工具链可从 openrisc.io 软件页面或社区维护者的工具链构建发布页获取现成的or1k-linux-系列工具链二进制。自行构建工具链社区维护者Stafford提供了工具链构建与发布脚本or1k-toolchain-build按其中说明即可从源码构建完整工具链。无论采用哪种方式最终目的是获得前缀为or1k-linux-的交叉编译工具gcc、binutils、glibc 等。内核编译时通过CROSS_COMPILEor1k-linux-指定该前缀。提示原文档中的链接均为社区外部资源此处仅说明获取途径。对内核侧而言只要or1k-linux-gcc等工具位于PATH中即可正常编译。三、编译 OpenRISC Linux 内核3.1 最小构建命令原文档给出的标准构建流程非常简洁只需两条命令make ARCHopenrisc CROSS_COMPILEor1k-linux- defconfig make ARCHopenrisc CROSS_COMPILEor1k-linux-第一条命令生成默认配置。这里的defconfig会读取 arch/openrisc/Makefile 中声明的默认配置目标KBUILD_DEFCONFIG : or1ksim_defconfig即默认采用 arch/openrisc/configs/or1ksim_defconfig面向 OpenRISC 模拟器平台。第二条命令执行完整的内核编译。值得注意的是arch/openrisc/Makefile 还定义了两个与其它架构不同的行为KBUILD_CFLAGS -pipe -ffixed-r10 -D__linux__以及-msfimm -mshftimm对编译选项做了架构定制all: vmlinux.bin—— 默认目标除了生成vmlinuxELF 外还会通过 arch/openrisc/boot/Makefile 用 objcopy 生成纯二进制镜像vmlinux.bin-O binary便于直接烧写进 FPGA 或加载到模拟器。3.2 可选嵌入 initramfs如果希望在编译阶段就把根文件系统直接嵌入内核镜像需要额外传递CONFIG_INITRAMFS_SOURCE例如make ARCHopenrisc CROSS_COMPILEor1k-linux- \ CONFIG_INITRAMFS_SOURCEpath/to/rootfs path/to/devnodes该选项的值是一个或多个路径目录、cpio 归档等内核构建系统会将其打包为 initramfs 嵌入镜像。更多细节可参考仓库中的 Documentation/filesystems/ramfs-rootfs-initramfs.rst。从 defconfig 可以看出无论是 or1ksim_defconfig 还是 de0_nano_defconfig 都开启了CONFIG_BLK_DEV_INITRDy说明 initramfs 是 OpenRISC 平台常见的根文件系统方案。3.3 针对不同平台的配置目标除了模拟器平台仓库还提供了面向其它硬件平台的 defconfig全部位于 arch/openrisc/configs配置文件目标平台or1ksim_defconfigOpenRISC 模拟器默认de0_nano_defconfigTerasic De0 Nano FPGA 开发板单核de0_nano_multicore_defconfigDe0 Nano 多核SMP配置or1klitex_defconfigOR1K LiteX 平台simple_smp_defconfig通用 SMP 平台virt_defconfig虚拟化平台使用方式与标准流程一致例如make ARCHopenrisc CROSS_COMPILEor1k-linux- de0_nano_defconfig make ARCHopenrisc CROSS_COMPILEor1k-linux-以 or1ksim_defconfig 为例可以看到针对模拟器环境的精简配置启用CONFIG_NO_HZ、CONFIG_HZ_100、CONFIG_JUMP_LABEL、CONFIG_MODULES、CONFIG_DEVTMPFS自动挂载、以太网驱动CONFIG_ETHOCOpenCores 以太网控制器、CONFIG_SERIAL_8250及其控制台支持并指定CONFIG_BUILTIN_DTB_NAMEor1ksim将设备树编入内核。而 de0_nano_defconfig 则额外开启了CONFIG_GPIO_SYSFS、CONFIG_NEW_LEDS与一系列 LED 触发器heartbeat、cpu、netdev 等以匹配 De0 Nano 板上的 GPIO/LED 外设。四、内核配置要点从 Kconfig 看 or1k 移植细节arch/openrisc/Kconfig 是理解该移植能力边界的最佳入口原文档虽未展开但其背后的配置选项直接决定内核能否在目标处理器上正确运行。4.1 子架构与缓存OR1K_1200当前唯一的子架构选择即 OR1200 通用架构默认选中。DCACHE_WRITETHROUGH如果你的实现采用写透write-through数据缓存应开启此项关闭时内核会在必要时强制冲刷数据缓存。大多数 OpenRISC 实现支持写透缓存拿不准时选 N。4.2 Class II 指令集开关OpenRISC 1000 定义了可选的 Class II 指令。Kconfig 提供一组开关让内核针对具体处理器实现启用或不启用这些指令。启用后 GCC 可生成对应指令通常会提升性能并减小二进制体积配置项对应指令默认值OPENRISC_HAVE_INST_FF1l.ff1前导一计数yOPENRISC_HAVE_INST_FL1l.fl1yOPENRISC_HAVE_INST_MULl.mul硬件乘法yOPENRISC_HAVE_INST_DIVl.div硬件除法yOPENRISC_HAVE_INST_CMOVl.cmov条件移动nOPENRISC_HAVE_INST_RORl.ror循环右移nOPENRISC_HAVE_INST_RORIl.rori立即数循环右移nOPENRISC_HAVE_INST_SEXTl.ext*符号/零扩展系列n这些开关会直接反映到内核编译选项上arch/openrisc/Makefile 中根据对应配置追加-mhard-mul/-msoft-mul、-mhard-div/-msoft-div、-mcmov、-mror、-mrori、-msext等 GCC 选项实现硬件指令与软件模拟的自动切换。4.3 多核、FPU 与异常行为SMP与NR_CPUS范围 2–32启用对称多处理NR_CPUS默认 2。SMP 场景下必须依赖影子寄存器组见下。FPU默认 y关闭可剔除内核中所有浮点相关处理过程以减小体积。OPENRISC_NO_SPR_SR_DSX默认 y仅 OR1K_1200SPR_SR_DSX是状态寄存器中指示“上一次异常是否发生在延迟槽delay slot”的位。OpenRISC 架构允许硬件不实现该位而 OR1200 恰好没有实现因此内核默认用软件方式模拟该语义只有确认你的处理器实现了该位才可关闭。OPENRISC_HAVE_SHADOW_GPRS处理器是否具备影子寄存器组shadow register file。启用后异常入口可将通用寄存器暂存到影子寄存器中避免额外的保存开销在 SMP 系统上该特性是必需的。CMDLINE对没有 bootloader 传递参数的平台可在编译期内置默认内核命令行。4.4 调试选项JUMP_UPON_UNHANDLED_EXCEPTION默认 y首次 oops 后让内核进入死循环便于定位问题。OPENRISC_ESR_EXCEPTION_BUG_CHECK默认 n开启一些可能暴露内核潜在问题的检查。五、在 FPGA 上运行可选OpenRISC 社区通常借助FuseSoC来管理 SoC 的构建与烧写流程FuseSoC 在构建时从 IP 核仓库下载 FPGA RTL 代码再调用 FPGA 厂商工具完成综合与布局布线最后通过OpenOCD将二进制加载到开发板。原文档以 Terasic De0 Nano 开发板为例给出完整流程# 1) 安装 FuseSoCPython 包以可编辑模式安装 git clone fusesoc-repo cd fusesoc sudo pip install -e . # 2) 初始化并构建/烧写 De0 Nano 的 OpenRISC SoC fusesoc init fusesoc build de0_nano fusesoc pgm de0_nano # 3) 启动 OpenOCD连接板载 Altera USB-Blaster 调试器与 or1k 目标 openocd -f interface/altera-usb-blaster.cfg \ -f board/or1k_generic.cfg # 4) 通过 telnet 进入 OpenOCD 命令界面加载内核镜像并复位运行 telnet localhost 4444 init halt; load_image vmlinux ; reset上述de0_nano目标与内核侧 arch/openrisc/configs/de0_nano_defconfig 一一对应其板级设备树描述位于 arch/openrisc/boot/dts/de0-nano.dts与de0-nano-common.dtsi配合。内核编译产物vmlinuxELF正是 OpenOCDload_image直接加载的镜像若烧写裸二进制则使用默认目标生成的vmlinux.bin。六、在 QEMU 上运行可选对于没有硬件或 FPGA 开发板的开发者QEMU是官方推荐的 OpenRISC 平台模拟器。原文档建议两种方式自行编译 QEMU启用 OpenRISC 目标支持使用发行版提供的二进制包——多数主流 Linux 发行版都带有支持 OpenRISC 的 QEMU 包这是最快的方式。在 QEMU 中运行 Linux 的具体步骤以 QEMU 官方 OpenRISC 平台文档为准。仓库侧与之配套的默认配置正是 or1ksim_defconfig 与设备树 arch/openrisc/boot/dts/or1ksim.dts。从 or1ksim.dts 可以看出模拟器平台的外设布局compatible opencores,or1ksim内存起始于 0x0 且大小为 32 MiBreg 0x00000000 0x02000000CPU 为opencores,or120020 MHz 时钟串口为兼容ns16550a的 OpenCores UARTserial90000000以太网为 OpenCoresethocenet092000000中断控制器为 CPU 内置的opencores,or1k-pic通过特殊功能寄存器访问无地址空间。chosen节点中bootargs earlycon、stdout-path uart0:115200指定了早期控制台输出。编译该平台时CONFIG_BUILTIN_DTB_NAMEor1ksim会把这棵设备树直接内嵌进内核镜像免去外部传递 DTB 的步骤。七、移植现状与 TODODocumentation/arch/openrisc/todo.rst 对该移植的现状做了补充说明OpenRISC Linux 移植已完全可用并且自 Linux 2.6.35 起持续跟随主线演进。剩余的工作项包括补齐 DMA API 的其余部分如dma_map_sg等完成命名清理代码中仍残留or32引用——这是该架构的旧名现已统一为or1k改名工作正在逐步推进目前or32与or1k等价。此外Documentation/arch/openrisc/index.rst 将openrisc_port、todo与features三份文档组织为 OpenRISC 架构文档集其中 features.rst 通过kernel-feat指令自动从内核特性列表生成可作为查询该架构功能支持矩阵的入口。八、历史沿革原文档保留了该移植的完整历史记录反映了 Linux/OpenRISC 移植从早期原型到上游化的演进脉络日期作者里程碑2003-11-18Matjaz Breskvar将 Linux 初始移植到 OpenRISC/or32 架构核心功能可用2003-12-08Matjaz Breskvar完全重写 TLB miss 处理与异常处理默认 initrd 中可运行完整的 sash-3.6 shell2004-04-10Matjaz Breskvar大量缺陷修复加入以太网支持可运行 HTTP 与 telnet 服务器可跑众多标准 Linux 应用2004-06-26Matjaz Breskvar移植到 2.6.x 内核2004-11-30Matjaz Breskvar大量缺陷修复与增强加入 OpenCores framebuffer 驱动2010-10-09Jonas Bonn大规模重写使其与上游 Linux 2.6.36 保持一致这段历史解释了代码中or32/or1k名称并存的由来也与 todo.rst 中“or32 是 or1k 的旧名”的说明相互印证。总结围绕 openrisc_port.rst 这篇官方移植文档本文完整还原了 OpenRISC Linux 的构建与运行链路从获取or1k-linux-交叉工具链到make ARCHopenrisc完成内核与vmlinux.bin的构建再到通过CONFIG_INITRAMFS_SOURCE嵌入根文件系统随后分别给出了 FPGAFuseSoC OpenOCD与 QEMU 两条运行路径并结合 arch/openrisc/Kconfig 与各平台 defconfig 深入剖析了 Class II 指令开关、缓存策略、SMP/FPU 及异常行为等配置要点。对于希望深入该移植的开发者arch/openrisc 目录下的启动代码head.S、entry.S、内存管理mm/与平台初始化prom.c、setup.c是继续阅读的首选入口。【免费下载链接】linuxLinux kernel source tree项目地址: https://gitcode.com/GitHub_Trending/li/linux创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询