首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将Linux移植到另一个平台需求

将Linux移植到另一个平台需求
EN

Unix & Linux用户
提问于 2019-02-28 08:07:31
回答 3查看 3.7K关注 0票数 29

我知道Linux是可用的,并且已经移植到许多不同的平台上,比如X86、ARM、PowerPC等等。

然而,在移植方面,究竟需要什么呢?

我的理解是,Linux是用C编写的软件,因此,当将Linux最初从X86移植到ARM或其他方面时,这不只是用编译器为特定目标体系结构重新编译代码的问题吗?

撇开不同外设的设备驱动程序相比,在将Linux移植到新体系结构时还需要做些什么。编译器没有为我们处理所有的事情吗?

EN

回答 3

Unix & Linux用户

回答已采纳

发布于 2019-02-28 10:20:02

尽管Linux内核中的大多数代码都是用C编写的,但仍然有许多代码部分非常特定于运行它的平台,需要对此进行说明。

这方面的一个特殊例子是虚拟内存,它在大多数体系结构(页面表的层次结构)上以类似的方式工作,但对每种体系结构都有具体的细节(例如每个体系结构中的级别数,而且随着新的更大芯片的引入,甚至在x86上也在增加)。Linux内核代码引入宏来处理遍历这些层次结构的问题,这些层次结构可以被编译器在页面表级别较少的体系结构上删除(因此代码是用C编写的,但考虑到了体系结构的细节)。

许多其他领域对于每个体系结构都是非常特定的,需要使用特定于arch的代码来处理。不过,其中大多数都涉及汇编语言中的代码。例子如下:

  • 上下文切换:上下文切换涉及为进程切换保存所有寄存器的值,并从计划到CPU的进程的保存集中恢复寄存器。甚至寄存器的数量和集合对于每个体系结构都是非常特定的。此代码通常在程序集中实现,以允许对寄存器的完全访问,并确保它尽可能快地运行,因为上下文切换的性能对系统至关重要。
  • 系统调用:用户空间代码触发系统调用的机制通常是特定于体系结构的(有时甚至特定于特定的CPU模型,例如Intel和AMD为此引入了不同的指令,旧CPU可能缺少这些指令,因此这些指令的细节仍然是唯一的)。
  • 中断处理程序:关于如何处理中断(硬件中断)的详细信息通常是特定于平台的,通常需要一些组装级的胶水来处理用于平台的特定调用约定。此外,启用/禁用中断的原语通常是特定于平台的,并且还需要汇编代码。
  • 初始化:如何进行初始化的详细信息通常还包括特定于平台的细节,并且通常需要一些汇编代码来处理内核的入口点。在具有多个CPU (SMP)的平台上,有关如何将其他CPU联机的详细信息通常也是特定于平台的。
  • 锁定基元:锁定原语(如自旋锁)的实现通常也涉及特定于平台的细节,因为某些体系结构提供(或更喜欢)不同的CPU指令来有效地实现这些指令。一些将实现原子操作,一些将提供一个cmpxchg,它可以进行原子测试/更新(但如果另一个编写器首先进入),则会失败,另一些将包括CPU指令的“锁”修饰符。这些通常也涉及编写程序集代码。

可能还有其他领域需要在内核中使用特定于平台或体系结构的代码(特别是在Linux内核中)。查看内核源代码树,arch/include/arch/下都有特定于体系结构的子树,在这里您可以找到更多的例子。

有些是令人惊讶的,例如,您将看到每个体系结构上可用的系统调用的数量是不同的,一些系统调用将存在于某些体系结构中,而不存在于另一些体系结构中。(即使在x86上,32位内核和64位内核之间的syscalls列表也不同。)

简而言之,内核需要注意很多特定于平台的情况。Linux内核试图抽象其中的大多数,因此更高级别的算法(例如内存管理和调度工作方式)可以在C中实现,并在所有体系结构上工作相同(或者大部分相同)。

票数 59
EN

Unix & Linux用户

发布于 2019-02-28 22:48:43

除了移植Linux内核之外,您还需要为“用户空间”程序定义应用程序二进制接口 (ABI),并移植用户空间软件堆栈的最低层。Linux通常与GNU项目的低级用户空间组件一起使用,其中最关键的是:

  • C编译器、汇编程序和链接器:GCCGNU Binutils。对于一个全新的CPU架构,您甚至需要在开始移植内核之前移植这个软件,因为内核本身就是一个C程序,必须进行编译。如果已经有对平台CPU的“后端”支持,而不是以Linux作为操作系统内核,那么您所要做的工作就少得多,并且您可以将大部分工作推迟到内核启动和运行之后才能完成。
  • C运行库:"GNU libc“。该库包括进行系统调用并与内核直接交互的代码。
  • “外部函数接口”库利布菲是许多高级语言解释器的重要组成部分,它执行少数几个需要少量手写汇编语言的任务之一。

其他许多软件都有可选的平台相关组件;例如,如果您为新的CPU体系结构编写用于NSSOpenSSL的手工优化密码原语,以及为IonMonkeyV8编写即时编译后端,则网页浏览将大大加快速度。但这些并不是提出一个新平台所必需的。

票数 11
EN

Unix & Linux用户

发布于 2019-03-01 10:55:41

你必须告诉内核你要移植的硬件。内核的工作是直接与硬件接口,因此为了使其正常工作,内核需要了解CPU、振荡器(时钟)和任何外围设备,如各种串行端口(SPI、CAN、I2C等)。

在过去,您可以通过编写特定于平台的代码来实现这一点,然后驱动程序将使用这些代码来运行。现在,这是通过编写一个设备树定义来完成的。

票数 1
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/503502

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档