十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Intel Assabet(SA-1110 评估板)内核构建、RedBoot 引导与 JFFS2 实战指南

Intel Assabet(SA-1110 评估板)内核构建、RedBoot 引导与 JFFS2 实战指南 Intel AssabetSA-1110 评估板内核构建、RedBoot 引导与 JFFS2 实战指南【免费下载链接】linuxLinux kernel source tree项目地址: https://gitcode.com/GitHub_Trending/li/linux本文以 Linux 内核官方文档 Documentation/arch/arm/sa1100/assabet.rst 为主线系统讲解 Intel StrongARM SA-1110 微处理器评估板 Assabet 的完整使用流程从内核编译、引导加载程序Bootloader选择与安装到 RedBoot 下烧写内核镜像、挂载 JFFS2 根文件系统、编写自动化引导脚本最后结合当前仓库源码arch/arm/mach-sa1100/assabet.c、arch/arm/configs/assabet_defconfig、drivers/mtd/parsers/redboot.c 等深入剖析其底层实现。读完本文你将能够独立完成 Assabet 平台的交叉编译、RedBoot 环境初始化和从 Flash 启动 Linux 的全过程。Assabet 平台与文档背景Assabet 是 Intel 官方推出的 StrongARM SA-1110 微处理器开发板评估板在 Linux ARM 生态早期扮演了重要的参考平台角色。SA-1110 集成了一颗 StrongARM 处理器核心片上集成了 LCD 控制器、串口、USB、PCMCIA 等外设配合 NeponsetSA-1111扩展板可进一步扩展 I/O 能力。在内核源码树中Assabet 的平台支持代码集中在 arch/arm/mach-sa1100/assabet.c其机器类型描述如下见 assabet.cMACHINE_START(ASSABET, Intel-Assabet) .atag_offset 0x100, .fixup fixup_assabet, .map_io assabet_map_io, .nr_irqs SA1100_NR_IRQS, .init_irq assabet_init_irq, .init_time sa1100_timer_init, .init_machine assabet_init, .init_late sa11x0_init_late, .restart sa11x0_restart, MACHINE_END从 arch/arm/mach-sa1100/Kconfig 可以看到SA11x0 平台目前已被标记为DEPRECATED已废弃且明确提示“Support for these machines will go away in 2027, unless there are any remaining users that speak up”若无现存用户发声该平台支持将于 2027 年移除。因此本文内容对 ARM 早期平台移植和嵌入式 Linux 引导流程的研究、教学与历史梳理具有重要价值。需要说明的是本文以当前仓库即 Linux 内核源码树的实际代码和文档为准涉及的命令行、配置与工具链描述适用于 Assabet 平台及其对应的内核版本。编译 Assabet 内核镜像三步构建流程根据官方文档使用默认配置构建 Assabet 内核只需三条命令make assabet_defconfig make oldconfig make zImagemake assabet_defconfig加载 Assabet 的默认内核配置。该配置文件位于 arch/arm/configs/assabet_defconfig是本文档所述流程的直接依据。make oldconfig基于现有.config交互式确认新增/变更的配置项确保配置与当前内核版本一致。make zImage编译生成压缩内核镜像。构建完成后内核镜像位于linux/arch/arm/boot/zImage。默认配置的关键选项arch/arm/configs/assabet_defconfig 中的核心配置与本文档的引导流程一一对应值得逐项解读配置项值含义与引导流程关联CONFIG_ARCH_SA1100y启用 SA11x0 平台支持CONFIG_SA1100_ASSABETy启用 Assabet 板级支持CONFIG_ATAGSy使用 ATAGS 向内核传递启动参数CONFIG_CMDLINEmem32M consolettySA0,38400n8 initrd0xc0800000,3M root/dev/ram默认内核命令行32M 内存、串口控制台38400 波特率8 数据位无校验、initrd 起始地址与大小、根文件系统为 ramdiskCONFIG_BLK_DEV_INITRDy支持 initrd/ramdisk 启动对应文档中“加载 ramdisk 镜像”一节CONFIG_MTDy启用 MTDMemory Technology Device层是 JFFS2 的基础CONFIG_MTD_REDBOOT_PARTSy启用 RedBoot FIS 分区表解析对应文档中 Linux 显示 “Using RedBoot partition definition” 的输出CONFIG_MTD_BLOCKy提供/dev/mtdblockN块设备接口对应文档中root/dev/mtdblock2的使用CONFIG_MTD_CFIy启用 CFICommon Flash Interface探测对应 “SA1100 flash: probing 32-bit flash bus”CONFIG_MTD_SA1100ySA1100 平台 Flash 映射驱动CONFIG_JFFS2_FSy启用 JFFS2 日志型闪存文件系统CONFIG_SERIAL_SA1100_CONSOLEySA1100 串口作为内核控制台CONFIG_FB_SA1100ySA1100 LCD 帧缓冲驱动CONFIG_PCMCIA_SA1100、CONFIG_PCMCIA_PCNETyPCMCIA 及 PCnet 网卡支持配合文档中“使用 CF 网卡进行 TFTP 传输”CONFIG_NFS_FSyNFS 根文件系统支持对应文档中“通过 NFS 启动根文件系统”值得关注的是配置中的CONFIG_MTD_REDBOOT_PARTS直接对应 Linux 内核启动时读取 RedBoot 维护的 FISFlash Image System目录并自动生成 MTD 分区表的行为这与文档第五节中 Linux 输出 5 个 MTD 分区的现象完全吻合。引导加载程序Bootloader的选择Assabet 上可用的 Linux 引导加载程序有三类各有特点Bootloader来源/背景特点BLOBLART 项目的引导程序社区贡献补丁加入 Assabet 支持轻量、简单但无网络功能Compaq BootldrCompaq 为 iPAQ Pocket PC 开发的引导程序John Dorsey 提供 Assabet 与 JFFS 支持补丁面向 PDA带 JFFS 文件系统支持RedBootRed Hat 基于 eCos RTOS HAL 开发的引导程序支持众多硬件平台唯一具备网络支持维护最活跃是当时推荐选择官方文档明确指出RedBoot is currently the recommended choice since its the only one to have networking support, and is the most actively maintained.由于 RedBoot 是文档推荐方案且具备网络TFTP能力以下引导与烧写流程均以 RedBoot 为主线展开。RedBoot 固件安装在开始使用之前需要先将预编译好的 RedBoot 二进制写入 Assabet 的 Flash。文档给出的预编译 RedBoot 二进制文件名形如redboot-assabet*.tgz并附有安装说明redboot-assabet*.txt存放于如下 FTP 站点ftp://ftp.netwinder.org/users/n/nico/ftp://ftp.arm.linux.org.uk/pub/linux/arm/people/nico/ftp://ftp.handhelds.org/pub/linux/arm/sa-1100-patches/硬件注意事项若使用 CF 网卡文档作者 Assabet 套件附带 Socket Communications 的 CF LP-E 网卡进行 TFTP 文件传输必须在 RedBoot 运行之前插入因为 RedBoot 无法动态检测 CF 网卡。RedBoot 初始化配置RedBoot 提供两类持久化配置初始化 Flash 目录fis init -f该命令用于初始化 Flash Image SystemFIS目录-f表示强制操作会清除现有的 FIS 目录区域。FIS 是 RedBoot 维护的一张 Flash 镜像目录表内核侧的 drivers/mtd/parsers/redboot.c 正是解析这张表来生成 MTD 分区的。初始化非易失性网络配置fconfig -ifconfig -i进入交互式配置模式用于设置 BOOTP 动态获取 IP 还是静态 IP 等网络参数以及脚本超时等选项。这些非易失性设置保存在 Flash 的 “RedBoot config” 区域中后续fis list输出中可见。RedBoot 分区结构源码视角从内核侧看RedBoot FIS 目录中的镜像描述符结构定义于 drivers/mtd/parsers/redboot.cstruct fis_image_desc { unsigned char name[16]; // Null terminated name u32 flash_base; // Address within FLASH of image u32 mem_base; // Address in memory where it executes u32 size; // Length of image u32 entry_point; // Execution entry point u32 data_length; // Length of actual data unsigned char _pad[256 - (16 7 * sizeof(u32))]; u32 desc_cksum; // Checksum over image descriptor u32 file_cksum; // Checksum over image data };每个字段镜像名、Flash 基址、内存加载地址、长度、入口点、数据长度、校验和与fis list输出的各列一一对应。解析器通过CONFIG_MTD_REDBOOT_DIRECTORY_BLOCK确定的目录块位置读取整块擦除块并逐个检查镜像描述符的校验和来构建分区表见 redboot.c。将内核镜像写入 Flash第一步将 zImage 加载到 RAM内核镜像必须先加载到内存中才能烧写。两种方式方式一TFTP 网络加载前提是 RedBoot 配置好了网络且 CF 网卡已插入load zImage -r -b 0x100000方式二串口 Y-Modem 上传load -m ymodem -r -b 0x100000参数说明-r将镜像加载到 RAMraw load。-b 0x100000指定加载到 RAM 的物理地址0x1000001MB 处。第二步写入 Flashfis create Linux kernel -b 0x100000 -l 0xc0000fis create将 RAM 中0x100000处、长度0xc0000768KB的数据写入 Flash并登记为名为 “Linux kernel” 的 FIS 镜像。启动内核与加载文件系统加载 ramdisk内核本身还需要一个文件系统才能完成启动。使用 TFTP 加载 ramdisk 镜像load ramdisk_image.gz -r -b 0x800000若改用串口 Y-Modem 上传将文件名替换为-y ymodemload -y ymodem -r -b 0x800000从 Flash 取出内核并执行fis load Linux kernel exec -b 0x100000 -l 0xc0000fis load将 Flash 中名为 “Linux kernel” 的镜像读回 RAM默认加载地址即创建时记录的内存地址。exec -b 0x100000 -l 0xc0000从地址0x100000处、长度0xc0000执行即跳转启动内核。文档特别指出ramdisk 也可以烧入 Flash但针对“在 Flash 上存放可写文件系统”这一需求JFFS2 是更优解详见下一节。使用 JFFS2 构建可写的 Flash 根文件系统JFFS2 与 MTD 的关系JFFS2The Second Journalling Flash File System第二代日志型闪存文件系统是当时在 Flash 上存放可写文件系统最便捷的方案。它必须与 MTDMemory Technology Device层配合使用——MTD 负责底层的 Flash 管理探测、擦除、读写、坏块处理等JFFS2 则在其上提供日志型文件系统语义。从配置看arch/arm/configs/assabet_defconfig 同时启用了CONFIG_MTD、CONFIG_MTD_SA1100、CONFIG_MTD_CFI、CONFIG_MTD_BLOCK与CONFIG_JFFS2_FS正是 JFFS2 方案所需的完整依赖链。加载示例 JFFS2 镜像示例 JFFS2 镜像sample_img.jffs2可从与预编译 RedBoot 相同的 FTP 站点获取。加载到 RAMload sample_img.jffs2 -r -b 0x100000预期输出文件实际加载的大小随镜像不同而变化RedBoot load sample_img.jffs2 -r -b 0x100000 Raw file loaded 0x00100000-0x00377424即镜像从0x00100000加载到0x00377424。查询可用 Flash 空间fis free示例输出RedBoot fis free 0x500E0000 .. 0x503C0000注意上述地址可能因文件系统大小和 Flash 类型不同而变化以下计算仅作为示例实际使用务必替换为自己的数值。计算烧写参数size of unallocated flash: 0x503c0000 - 0x500e0000 0x2e0000 size of the filesystem image: 0x00377424 - 0x00100000 0x277424未分配 Flash 区域大小0x2e0000约 2.875MB文件系统镜像实际大小0x277424约 2.48MB设计目标镜像必须能放进去同时将剩余全部Flash 空间都划给该文件系统分区。解锁、擦除、写入并创建 FIS 条目fis unlock -f 0x500E0000 -l 0x2e0000 fis erase -f 0x500E0000 -l 0x2e0000 fis write -b 0x100000 -l 0x277424 -f 0x500E0000 fis create JFFS2 -n -f 0x500E0000 -l 0x2e0000逐步解析fis unlock -f解锁目标 Flash 区域Flash 写入前通常需解锁。fis erase -f擦除整个目标区域擦除是 Flash 写入的强制前置步骤。fis write将 RAM 地址0x100000处、长度0x277424的数据写入 Flash 地址0x500E0000。fis create JFFS2 -n-n表示不复制数据仅为该区域在 FIS 目录中登记名为 “JFFS2” 的镜像条目数据已由上一步写入。验证fis list 与 Linux 侧 MTD 分区烧写完成后fis list显示完整的 Flash 布局RedBoot fis list Name FLASH addr Mem addr Length Entry point RedBoot 0x50000000 0x50000000 0x00020000 0x00000000 RedBoot config 0x503C0000 0x503C0000 0x00020000 0x00000000 FIS directory 0x503E0000 0x503E0000 0x00020000 0x00000000 Linux kernel 0x50020000 0x00100000 0x000C0000 0x00000000 JFFS2 0x500E0000 0x500E0000 0x002E0000 0x00000000而在 Linux 侧得益于CONFIG_MTD_REDBOOT_PARTS启动时内核解析同一份 FIS 目录并打印SA1100 flash: probing 32-bit flash bus SA1100 flash: Found 2 x16 devices at 0x0 in 32-bit mode Using RedBoot partition definition Creating 5 MTD partitions on SA1100 flash: 0x00000000-0x00020000 : RedBoot 0x00020000-0x000e0000 : Linux kernel 0x000e0000-0x003c0000 : JFFS2 0x003c0000-0x003e0000 : RedBoot config 0x003e0000-0x00400000 : FIS directory这条输出的前两行与 Assabet 板级 Flash 驱动直接对应。从源码看arch/arm/mach-sa1100/assabet.c 中定义了两种 Flash 硬件布局Phase 4 AssabetBank 0 中两块 Intel 28F160B3 Flash每块 2MB 级引导区为0x00020000Phase 5 AssabetBank 0 中两块 Intel 28F128J3A Flash每块 16MB 级引导区为0x00040000。同时assabet.c 使用cfi_probe作为映射名并将两块 Flash 内存资源SA1100_CS0_PHYS与SA1100_CS1_PHYS各 32MB注册给 MTD 层——这解释了启动日志中 “probing 32-bit flash bus / Found 2 x16 devices” 的探测行为。从 Flash 直接启动 JFFS2 根文件系统重要的是理解分区的顺序Linux 侧第三个分区才是 “JFFS2”它对应块设备/dev/mtdblock2。因此从 Flash 启动内核 JFFS2 根文件系统的完整命令为fis load Linux kernel exec -b 0x100000 -l 0xc0000 -c root/dev/mtdblock2-c参数将内核命令行设置为root/dev/mtdblock2指示内核将第三个 MTD 块设备作为根文件系统。其他文件系统方案文档也指出除 JFFS 外还可选用其他文件系统cramfs只读压缩文件系统适合存放不可变数据NFS 根文件系统通过root/dev/nfs配合网络启动直接在 Linux 内烧写 Flash在 ramdisk 或 NFS 引导的系统下使用 Linux MTD 工具如flash_erase、mkfs.jffs2、mount直接对刚擦除的分区挂载 JFFS2 并拷贝文件——这种方法有时更为便捷。RedBoot 脚本化自动引导每次重启都手动输入上述命令显然不现实RedBoot 的脚本能力可完全自动化引导过程。以下示例脚本实现从网络 TFTP 服务器加载内核与 ramdisk 后自动启动RedBoot fconfig Run script at boot: false true Boot script: Enter script, terminate with empty line load zImage -r -b 0x100000 load ramdisk_ks.gz -r -b 0x800000 exec -b 0x100000 -l 0xc0000 Boot script timeout (1000ms resolution): 3 Use BOOTP for network configuration: true GDB connection port: 9000 Network debug at boot time: false Update RedBoot non-volatile configuration - are you sure (y/n)? y配置项逐一说明配置项值含义Run script at bootfalse true改为true启用开机自动执行脚本Boot script3 条命令依次加载内核、加载 ramdisk、执行内核空行结束输入Boot script timeout3脚本执行前的倒计时单位 1000ms即 3 秒期间可按任意键中断进入交互模式Use BOOTP for network configurationtrue使用 BOOTP 自动获取网络配置GDB connection port9000RedBoot GDB 调试连接端口Network debug at boot timefalse开机时不进入网络调试模式保存配置后重启 Assabet 只需等待登录提示符出现即可——整个引导过程完全自动化。外设支持状态与硬件细节文档附录记录了截至 2001 年 10 月-rmk内核树中 Assabet 及 Neponset 外设的支持状态可作为评估该平台能力的权威参考Assabet 本体串口Serial ports端口状态RadioTX、RX、CTS、DSR、DCD、RI 可用PM 未测试COMTX、RX、CTS、DSR、DCD、RTS、DTR、PM 可用PM 未测试I2C已实现未完全测试L3完全测试通过passPM未测试视频Video项状态LCD完全测试通过注意连接 Neponset 时 LCD 不喜欢被 blanked 熄灭Video out未完全测试音频AudioUDA1341播放完全测试通过录音已实现未测试PM 未测试。UCB1200音频播放/录音、电信音频播放/录音均已实现但未重度测试POTS 控制不支持触摸屏支持PM 未测试。从源码可以印证 UCB1200 的接入方式assabet.c 注册了 UCB1x00 平台数据含复位回调与唤醒支持并通过 MCPMultimedia Communications Portsa11x0_register_mcp以11981000Hz 的 SCLK 时钟连接 codecassabet.c 中的assabet_codec_reset展示了 UCB1x00 与 UDA1341 共享复位信号的细节——该复位线同时接到三个器件UCB1x00、UDA1341、ADV7171复位任一器件都会影响其余两者且会使 ADV7171 消耗约 100mA 电流超过 MAX846 锂电充电器的预算若未接锂电池会导致 Assabet 崩溃——这正是注释中保留的硬件设计约束。其他Other项状态PCMCIALPE完全测试通过USB不支持IRDASIR / FIR均完全测试通过PM 未测试Neponset 扩展板项状态串口 COM1、COM2TX、RX、CTS、DSR、DCD、RTS、DTR 可用PM 未测试USB已实现未重度测试PCMCIA已实现未重度测试CF已实现未重度测试Neponset 的板级支持代码位于 arch/arm/mach-sa1100/neponset.c且在内核配置中由CONFIG_ASSABET_NEPONSET见 arch/arm/mach-sa1100/Kconfig控制该选项依赖SA1100_ASSABET并自动选择SA1111。启动时探测 NeponsetAssabet 的一大特殊之处在于必须在paging_init()之前探测 Neponset 是否存在以正确确定可用 RAM 数量。因此 assabet.c 在fixup_assabet阶段先手动映射 GPIO 寄存器再通过get_assabet_scr()读取系统配置字节static void __init get_assabet_scr(void) { unsigned long scr, i; GPDR | 0x3fc; /* Configure GPIO 9:2 as outputs */ GPSR 0x3fc; /* Write 0xFF to GPIO 9:2 */ GPDR ~(0x3fc); /* Configure GPIO 9:2 as inputs */ for(i 100; i--; ) /* Read GPIO 9:2 */ scr GPLR; GPDR | 0x3fc; /* restore correct pin direction */ scr 0x3fc; /* save as system configuration byte. */ SCR_value scr; }该方法通过 GPIO 9:2 的上下拉采样得到系统配置字节SCR若检测到 Neponset 则打印 “Neponset expansion board detected”。同一扫描逻辑也用于 zImage 解压阶段设置串口输出状态消息见注释中引用的arch/arm/boot/compressed/head-sa1100.S。此外assabet.c 中的ASSABET_BCR_DB1110/ASSABET_BCR_DB1111分别定义了未接/接入 Neponset 时板控寄存器BCR的默认值并在assabet_init_irq中按探测结果初始化见 assabet.c。总结通过本文你可以完整掌握 AssabetIntel SA-1110 评估板从零构建内核到 Flash 引导的完整链路构建make assabet_defconfig make oldconfig make zImage产出arch/arm/boot/zImage默认配置 arch/arm/configs/assabet_defconfig 中CONFIG_MTD_REDBOOT_PARTS、CONFIG_MTD_BLOCK、CONFIG_JFFS2_FS等选项与引导流程深度耦合。引导程序RedBoot 是具备网络支持、维护最活跃的推荐选择。烧写通过fis init -f、fconfig -i初始化环境用 TFTP/Y-Modem 加载镜像用fis create写入 Flash。文件系统JFFS2 MTD 是 Flash 可写文件系统的最便捷方案fis listRedBoot 侧与 MTD 分区Linux 侧一一对应root/dev/mtdblock2完成从 Flash 直接启动。自动化RedBootfconfig脚本可实现开机自动从 TFTP 引导配合 BOOTP 实现无人值守启动。当前仓库中板级代码 arch/arm/mach-sa1100/assabet.c、平台配置 arch/arm/mach-sa1100/Kconfig 以及 MTD 解析器 drivers/mtd/parsers/redboot.c 为上述全部流程提供了源码级支撑是深入研究 ARM 早期平台移植、RedBoot 引导机制与 MTD/JFFS2 分区的绝佳参考。需要注意的是该平台支持已进入废弃倒计时预计 2027 年移除本文内容更适合作为嵌入式 Linux 引导技术的历史档案与学习素材。【免费下载链接】linuxLinux kernel source tree项目地址: https://gitcode.com/GitHub_Trending/li/linux创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表