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