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 行。
如果您希望进行交叉编译,请更改顶层 make 文件中的以下行
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,或通过以下网址的 Web 表单提交:http://www.arm.linux.org.uk/developer/
发送错误报告时,请确保它们包含所有相关信息,例如,问题之前/期间打印的内核消息,您正在做什么等。
包含文件¶
在 include/asm-arm 下创建了几个新的 include 目录,它们的存在是为了减少顶层目录中的混乱。下面列出了这些目录及其用途
arch-*
特定于机器/平台的头文件
hardware
驱动程序内部的 ARM 特定数据结构/定义
mach
通用 ARM 到特定机器接口的描述
proc-*
处理器相关的头文件(目前只有两个类别)
机器/平台支持¶
ARM 树包含对许多不同机器类型的支持。为了继续支持这些差异,有必要按目录拆分特定于机器的部分。为此,机器类别用于选择包含哪些目录和文件(我们将使用 $(MACHINE) 来引用该类别)
为此,我们现在有了 arch/arm/mach-$(MACHINE) 目录,这些目录旨在容纳特定机器的非驱动程序文件(例如,PCI、内存管理、架构定义等)。对于所有未来的机器,应该有一个相应的 arch/arm/mach-$(MACHINE)/include/mach 目录。
模块¶
虽然支持模块化(并且 FP 仿真器需要模块化),但当在 ARM2/ARM250/ARM3 机器上加载每个模块时,由于页面大小,它将占用内存到下一个 32k 边界。因此,在这些机器上模块化真的值得吗?
但是,ARM6 及更高版本的机器允许模块占用 4k 的倍数,因此使用这些处理器的 Acorn RiscPC 和其他架构可以很好地利用模块化。
ADFS 镜像文件¶
您可以通过挂载 ADFS 分区,然后使用 loopback 设备驱动程序来访问 ADFS 分区上的镜像文件。您必须安装 losetup。
请注意,PCEmulator DOS 分区在开头有一个分区表,因此,您必须给 losetup 提供“-o offset”。
给开发者的请求¶
编写包含单独汇编器文件的设备驱动程序时,请将其与 C 文件一起包含,而不是 arch/arm/lib 目录。这允许将驱动程序编译为可加载模块,而无需将一半代码编译到内核镜像中。
一般来说,尽量避免使用汇编器,除非它确实是必要的。这使得驱动程序很难移植到其他硬件。
ST506 硬盘¶
ST506 硬盘控制器似乎工作正常(如果有点慢)。目前,它们仅在 A4x0 主板上的控制器上工作,但要在 Podule 上工作,只需要有 Podule 的人将 IRQ 掩码和 HDC 基址的地址添加到源代码中即可。
截至 3/31/96,它可以与两个驱动器一起工作(您应该将 ADFS *configure harddrive 设置为 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”值选择的,该值必须保持唯一。
由于 ARM Linux 端口为大量机器提供支持,因此我们有一种管理方法,以确保我们不会最终复制大量代码。
我们将机器(或平台)支持代码分组到机器类中。一个类通常基于一个或多个片上系统设备,并充当实际实现的自然容器。这些类被赋予目录 - arch/arm/mach-<class> - 其中包含支持机器类的源文件和 include/mach/。
例如,SA1100 类基于 SA1100 和 SA1110 SoC 设备,并包含支持如何使用板载和板外设备,或如何设置设备的 code,并提供该机器特定的“个性”。
对于支持设备树 (DT) 的平台,机器选择在运行时通过将设备树 blob 传递给内核来控制。在编译时,必须选择对机器类型的支持。这允许将单个多平台内核构建用于多种机器类型。
对于不使用设备树的平台,此机器选择由机器类型 ID 控制,该 ID 既充当运行时代码选择方法,又充当编译时代码选择方法。您可以通过以下网址在网站上注册新机器:
注意:请不要为仅限 DT 的平台注册机器类型。如果您的平台仅限 DT,则不需要注册机器类型。
---
Russell King (15/03/2004)