我知道Linux是可用的,并且已经移植到许多不同的平台上,比如X86、ARM、PowerPC等等。
然而,在移植方面,究竟需要什么呢?
我的理解是,Linux是用C编写的软件,因此,当将Linux最初从X86移植到ARM或其他方面时,这不只是用编译器为特定目标体系结构重新编译代码的问题吗?
撇开不同外设的设备驱动程序相比,在将Linux移植到新体系结构时还需要做些什么。编译器没有为我们处理所有的事情吗?
发布于 2019-02-28 10:20:02
尽管Linux内核中的大多数代码都是用C编写的,但仍然有许多代码部分非常特定于运行它的平台,需要对此进行说明。
这方面的一个特殊例子是虚拟内存,它在大多数体系结构(页面表的层次结构)上以类似的方式工作,但对每种体系结构都有具体的细节(例如每个体系结构中的级别数,而且随着新的更大芯片的引入,甚至在x86上也在增加)。Linux内核代码引入宏来处理遍历这些层次结构的问题,这些层次结构可以被编译器在页面表级别较少的体系结构上删除(因此代码是用C编写的,但考虑到了体系结构的细节)。
许多其他领域对于每个体系结构都是非常特定的,需要使用特定于arch的代码来处理。不过,其中大多数都涉及汇编语言中的代码。例子如下:
可能还有其他领域需要在内核中使用特定于平台或体系结构的代码(特别是在Linux内核中)。查看内核源代码树,arch/和include/arch/下都有特定于体系结构的子树,在这里您可以找到更多的例子。
有些是令人惊讶的,例如,您将看到每个体系结构上可用的系统调用的数量是不同的,一些系统调用将存在于某些体系结构中,而不存在于另一些体系结构中。(即使在x86上,32位内核和64位内核之间的syscalls列表也不同。)
简而言之,内核需要注意很多特定于平台的情况。Linux内核试图抽象其中的大多数,因此更高级别的算法(例如内存管理和调度工作方式)可以在C中实现,并在所有体系结构上工作相同(或者大部分相同)。
发布于 2019-02-28 22:48:43
除了移植Linux内核之外,您还需要为“用户空间”程序定义应用程序二进制接口 (ABI),并移植用户空间软件堆栈的最低层。Linux通常与GNU项目的低级用户空间组件一起使用,其中最关键的是:
其他许多软件都有可选的平台相关组件;例如,如果您为新的CPU体系结构编写用于NSS和OpenSSL的手工优化密码原语,以及为IonMonkey和V8编写即时编译后端,则网页浏览将大大加快速度。但这些并不是提出一个新平台所必需的。
发布于 2019-03-01 10:55:41
你必须告诉内核你要移植的硬件。内核的工作是直接与硬件接口,因此为了使其正常工作,内核需要了解CPU、振荡器(时钟)和任何外围设备,如各种串行端口(SPI、CAN、I2C等)。
在过去,您可以通过编写特定于平台的代码来实现这一点,然后驱动程序将使用这些代码来运行。现在,这是通过编写一个设备树定义来完成的。
https://unix.stackexchange.com/questions/503502
复制相似问题