ARM Linux 2.6 及更高版本¶
请检查 <ftp://ftp.arm.linux.org.uk/pub/armlinux> 以获取更新。
内核编译¶
为了编译 ARM Linux,你需要一个能够生成带有 GNU 扩展的 ARM ELF 代码的编译器。GCC 3.3 是一个不错的编译器。幸运的是,你不需要去猜测。如果你的编译器是已知的有问题的编译器,内核将会报错。
要在本地构建 ARM Linux,你通常不需要修改顶层 Makefile 中的 ARCH = 行。但是,如果你没有默认安装 ARM Linux ELF 工具,那么你应该按照下文详细说明修改 CROSS_COMPILE 行。
如果你希望进行交叉编译,请修改顶层 makefile 中的以下行
ARCH = <whatever>为
ARCH = arm和
CROSS_COMPILE=改为
CROSS_COMPILE=<your-path-to-your-compiler-without-gcc>例如
CROSS_COMPILE=arm-linux-运行 ‘make config’,然后运行 ‘make Image’ 来构建内核 (arch/arm/boot/Image)。可以通过运行 ‘make zImage’ 代替 ‘make Image’ 来构建压缩镜像。
错误报告等¶
请将补丁发送到补丁系统。有关更多信息,请参阅 http://www.arm.linux.org.uk/developer/patches/info.php。请务必附上关于该补丁的作用以及为什么需要它的解释。
错误报告应发送至 linux-arm-kernel@lists.arm.linux.org.uk,或通过 http://www.arm.linux.org.uk/developer/ 上的网页表单提交
发送错误报告时,请确保包含所有相关信息,例如在问题出现之前/期间打印的内核消息、你在做什么等。
头文件¶
在 include/asm-arm 下创建了几个新的包含目录,旨在减少顶层目录中的杂乱文件。这些目录及其用途如下
arch-*
机器/平台特定的头文件
hardware
驱动程序内部 ARM 特定的数据结构/定义
mach
通用 ARM 到特定机器接口的描述
proc-*
处理器相关的头文件(目前只有两类)
机器/平台支持¶
ARM 树包含对许多不同机器类型的支持。为了继续支持这些差异,有必要按目录拆分机器特定的部分。为此,机器类别用于选择包含哪些目录和文件(我们将使用 $(MACHINE) 来指代该类别)
为此,我们现在有了 arch/arm/mach-$(MACHINE) 目录,旨在存放特定机器的非驱动程序文件(例如,PCI、内存管理、架构定义等)。对于所有未来的机器,都应该有一个对应的 arch/arm/mach-$(MACHINE)/include/mach 目录。
模块 (Modules)¶
尽管支持模块化(且浮点模拟器需要它),但由于页大小的原因,ARM2/ARM250/ARM3 机器上的每个模块在加载时都会占用内存,直到下一个 32k 边界。因此,在这些机器上进行模块化真的值得吗?
然而,ARM6 及更高版本的机器允许模块占用 4k 的倍数,因此 Acorn RiscPC 和其他使用这些处理器的架构可以很好地利用模块化。
ADFS 镜像文件¶
你可以通过挂载 ADFS 分区然后使用回环设备驱动程序来访问 ADFS 分区上的镜像文件。你必须安装了 losetup。
请注意,PCEmulator DOS 分区在开头有一个分区表,因此你必须向 losetup 提供 ‘-o offset’。
对开发者的请求¶
在编写包含单独汇编文件的设备驱动程序时,请将其包含在 C 文件中,而不是放在 arch/arm/lib 目录中。这使得驱动程序可以编译为可加载模块,而无需将一半的代码编译到内核镜像中。
通常,除非绝对必要,否则尽量避免使用汇编语言。这会使驱动程序极难移植到其他硬件。
ST506 硬盘¶
ST506 硬盘控制器似乎工作正常(虽然有点慢)。目前它们只能通过 A4x0 主板上的控制器工作,但要让它通过 Podule 工作,只需要拥有 podule 的人将 IRQ 掩码和 HDC 基址的地址添加到源代码中即可。
从 1996 年 3 月 31 日起,它支持两个驱动器(你应该将 ADFS *configure 硬盘设置为 2)。我有一个内置的 20MB 硬盘和一个超大的外置 5.25” FH 64MB 硬盘(谁会想要更多呢 :-))。
我刚刚测得它的速度为 240K/s(使用 bs=128k 的 dd 命令);这大约是 RiscOS 速度的一半;但比我上周获得的 50K/s 要好得多 :-)
已知漏洞:驱动器数据错误可能导致系统挂起;包括控制器已使用 ECC 修复错误的情况。(可能仅在这种情况下……嗯)。
1772 软盘¶
这似乎也能正常工作,但最近没有经过太多测试。目前里面没有任何用于磁盘更换检测的代码,这可能会有点问题!欢迎提出正确做法的建议。
CONFIG_MACH_ 与 CONFIG_ARCH_¶
在 2003 年,新机器的宏名称发生了一些变化。历史上,CONFIG_ARCH_ 既用于真正的架构(例如 SA1100),也用于该架构的具体实现(例如 Assabet)。为了清晰起见,决定将具体实现的宏改为 CONFIG_MACH_。此外,我们没有进行追溯性修复,因为这会使打补丁变得复杂。
先前的注册信息可以在线查阅。
内核入口 (head.S)¶
进入内核的初始入口是通过 head.S,它使用与机器无关的代码。机器是通过进入时的 ‘r1’ 值来选择的,该值必须保持唯一。
由于 Linux 的 ARM 移植版本支持大量的机器,我们采用了一种管理方法,以确保不会最终重复大量的代码。
我们将机器(或平台)支持代码按机器类进行分组。一个类通常基于一个或多个片上系统(SoC)设备,并作为实际实现周围的天然容器。这些类被分配了目录 - arch/arm/mach-<class> - 其中包含支持该机器类的源文件和 include/mach/。
例如,SA1100 类基于 SA1100 和 SA1110 SoC 设备,包含支持板载和板外设备使用方式或设备设置的代码,并提供该机器特定的“个性”。
对于支持设备树(DT)的平台,机器选择是在运行时通过向内核传递设备树 blob 来控制的。在编译时,必须选择对该机器类型的支持。这允许将单个多平台内核构建版本用于多种机器类型。
对于不使用设备树的平台,机器选择由机器类型 ID 控制,该 ID 同时充当运行时和编译时的代码选择方法。你可以通过以下网址注册一台新机器
注意:请不要为仅支持 DT 的平台注册机器类型。如果你的平台仅支持 DT,则不需要注册机器类型。
---
Russell King (15/03/2004)