长篇连载--arm linux演艺---第五回 -------------------------------------------------------------------------------- 好,从本节开始,我们走过了bootloader的漫长征途,开始进入linux的内核:说实话,linux宝典的确高深莫测,洋人花了十几年修炼,各种内功心法层处不穷。有些地方反复推敲也领悟不了其中奥妙,炼不到第九重啊。。 linux的入口是一段汇编代码,用于基本的硬件设置和建立临时页表,对于ARM LINUX是 linux/arch/arm/kernle/head-armv.S, 走! #if defined(CONFIG_MX1) mov r1, #MACH_TYPE_MX1 #endif 这第一句话好像就让人看不懂,好像葵花宝典开头的八个字:欲练神功。。。。 那来的MACH_TYPE_MX1?其实,在head-armv.S中的一项重要工作就是设置内核的临时页表,不然mmu开起来也玩不转,但是内核怎么知道如何映射内存呢?linux的内核将映射到虚地址0xCxxx xxxx处,但他怎么知道把哪一片ram映射过去呢? 因为不通的系统有不通的内存影像,所以,LINUX约定,内核代码开始的时候,R1放的是系统目标平台的代号,对于一些常见的,标准的平台,内核已经提供了支持,只要在编译的时候选中就行了,例如对X86平台,内核是从物理地址1M开始映射的。如果老兄是自己攒的平台,只好麻烦你自己写了。 小弟拿人钱财,与人消灾,用的是摩托的MX1,只好自己写了,定义了#MACH_TYPE_MX1,当然,还要写一个描述平台的数据结构: MACHINE_START(MX1ADS, "Motorola MX1ADS") MAINTAINER("SPS Motorola") BOOT_MEM(0x08000000, 0x00200000, 0xf0200000) FIXUP(mx1ads_fixup) MAPIO(mx1ads_map_io) INITIRQ(mx1ads_init_irq) MACHINE_END 看起来怪怪的,但现在大家只要知道他定义了基本的内存映象:RAM从0x08000000开始,i/o空间从0x00200000开始,i/o空间映射到虚拟地址空间0xf0200000开始处。摩托的芯片i/o和内存是统一编址的。 其他的项,在下面的初始化过程中会逐个介绍到。 好了好了,再看下面的指令: mov r0, #F_BIT | I_BIT | MODE_SVC @ make sure svc mode //设置为SVC模式,允许中断和快速中断 //此处设定系统的工作状态,arm有7种状态 //每种状态有自己的堆栈 msr cpsr_c, r0 @ and all irqs diabled bl __lookup_processor_type //定义处理器相关信息,如value, mask, mmuflags, //放在proc.info段中 //__lookup_processor_type 取得这些信息,在下面 //__lookup_architecture_type 中用 这一段是查询处理器的种类,大家知道arm有arm7, arm9等类型,如何区分呢? 在arm协处理器中有一个只读寄存器,存放处理器相关信息。__lookup_processor_type将返回如下的结构: __arm920_proc_info: .long 0x41009200 //CPU id .long 0xff00fff0 //cpu mask .long 0x00000c1e @ mmuflags b __arm920_setup .long cpu_arch_name .long cpu_elf_name .long HWCAP_SWP | HWCAP_HALF | HWCAP_26BIT .long cpu_arm920_info .long arm920_processor_functions 第一项是CPU id,将与协处理器中读出的id作比较,其余的都是与处理器相关的信息,到下面初始化的过程中自然会用到。。 arm linux 第五回终。。。
|