移植嵌入式Linux到ARM处理器:操作系统(11)
(11)Documentation:文档
在Linux内核的实现中,有一些数据结构使用非常频繁,对研读内核的人来说至为关键,它们是:
1.task_struct
Linux内核利用task_struct数据结构代表一个进程,用task_struct指针形成一个task数组。当建立新进程的时候,Linux 为新的进程分配一个task_struct结构,然后将指针保存在task数组中。调度程序维护current指针,它指向当前正在运行的进程。
2.mm_struct
每个进程的虚拟内存由mm_struct结构代表。该结构中包含了一组指向vm-area_struct结构的指针,vm-area_struct结构描述了虚拟内存的一个区域。
3.inode
Linux虚拟文件系统中的文件、目录等均由对应的索引节点(inode)代表。
2.Linux移植项目
mizi-linux已经根据Linux 2.4内核针对S3C2410A这一芯片进行了有针对性的移植工作,包括:
(1)修改根目录下的Makefile文件
a.指定目标平台为ARM:
| #ARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ -e s/arm.*/arm/ -e s/sa110/arm/) ARCH := arm |
b.指定交叉编译器:
CROSS_COMPILE = arm-linux-
(2)修改arch目录中的文件
根据本章第一节可知,Linux的arch目录存放硬件相关的内核代码,因此,在Linux内核中增加对S3C2410的支持,最主要就是要修改arch目录中的文件。
a.在arch/arm/Makefile文件中加入:
| ifeq ($(CONFIG_ARCH_S3C2410),y) TEXTADDR = 0xC0008000 MACHINE = s3c2410 Endif |
b.在arch\arm\config.in文件中加入:
| if [ "$CONFIG_ARCH_S3C2410" = "y" ]; then comment 'S3C2410 Implementation' dep_bool ' SMDK (MERI TECH BOARD)' CONFIG_S3C2410_SMDK $CONFIG_ARCH_S3C2410 dep_bool ' change AIJI' CONFIG_SMDK_AIJI dep_tristate 'S3C2410 USB function support' CONFIG_S3C2410_USB $CONFIG_ARCH_S3C2100 dep_tristate ' Support for S3C2410 USB character device emulation' CONFIG_S3C2410_USB_CHAR $CONFIG_S3C2410_USB fi # /* CONFIG_ARCH_S3C2410 */ |
arch\arm\config.in文件还有几处针对S3C2410的修改。
c.在arch/arm/boot/Makefile文件中加入:
| ifeq ($(CONFIG_ARCH_S3C2410),y) ZTEXTADDR = 0x30008000 ZRELADDR = 0x30008000 endif |
d.在linux/arch/arm/boot/compressed/Makefile文件中加入:
| ifeq ($(CONFIG_ARCH_S3C2410),y) OBJS += head-s3c2410.o endif |
加入的结果是head-s3c2410.S文件被编译为head-s3c2410.o。
e.加入arch\arm\boot\compressed\ head-s3c2410.S文件
| #include <linux/config.h> #include <linux/linkage.h> #include <asm/mach-types.h> .section ".start", #alloc, #execinstr __S3C2410_start: @ Preserve r8/r7 i.e. kernel entry values @ What is it? @ Nandy @ Data cache, Intstruction cache, MMU might be active. @ Be sure to flush kernel binary out of the cache, @ whatever state it is, before it is turned off. @ This is done by fetching through currently executed @ memory to be sure we hit the same cache bic r2, pc, #0x1f add r3, r2, #0x4000 @ 16 kb is quite enough... 1: ldr r0, [r2], #32 teq r2, r3 bne 1b mcr p15, 0, r0, c7, c10, 4 @ drain WB mcr p15, 0, r0, c7, c7, 0 @ flush I & D caches #if 0 @ disabling MMU and caches mrc p15, 0, r0, c1, c0, 0 @ read control register bic r0, r0, #0x05 @ disable D cache and MMU bic r0, r0, #1000 @ disable I cache mcr p15, 0, r0, c1, c0, 0 #endif /* * Pause for a short time so that we give enough time * for the host to start a terminal up. */ mov r0, #0x00200000 1: subs r0, r0, #1 bne 1b |
该文件中的汇编代码完成S3C2410特定硬件相关的初始化。
作者:宋宝华 更新日期:2006-11-21
来源:dev.yesky.com
浏览次数:
相关文章
相关评论 发表评论
- No Comments