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)