Chinaunix首页 | 论坛 | 博客
  • 博客访问: 158362
  • 博文数量: 40
  • 博客积分: 2010
  • 博客等级: 大尉
  • 技术积分: 355
  • 用 户 组: 普通用户
  • 注册时间: 2008-11-27 18:05
文章分类
文章存档

2011年(1)

2010年(9)

2009年(16)

2008年(14)

我的朋友

分类: LINUX

2009-04-03 15:37:42

 
1.在顶层MAKEFILE中,包含include $(srctree)/arch/$(ARCH)/Makefile
(此Makefile中head-y=arch/arm/kernel/head$(MMUEXT).o arch/arm/kernel/init_task.o)
vmlinux-init := $(head-y) $(init-y)
vmlinux-main := $(core-y) $(libs-y) $(drivers-y) $(net-y)
vmlinux-all  := $(vmlinux-init) $(vmlinux-main)
vmlinux-lds  := arch/$(ARCH)/kernel/vmlinux.lds
从以上,可以看出,内核首先执行的是head.S
2.第一阶段
从head.S到init/main.c中的start_kernel 执行过程
/*是否支持CPU、板子类型、建立一级页表*/
bl __lookup_processor_type
           |
bl __lookup_machine_type 
           |
bl __create_page_tables
           |
/*将__switch_data地址放入r13,以备使能MMU后,再调用*/
ldr r13, __switch_data  
           |
/*将__enable_mmu放入lr返回地址,以备使用*/
adr lr, __enable_mmu  @ return (PIC) address
/*r10中保存的是__lookup_processor_type得到的__arm920_proc_info的地址
PROCINFO_INITFUNC 是此地址处的偏移。此时跳转到b __arm920_setup
*/
add pc, r10, #PROCINFO_INITFUNC
            |
      __arm920_setup
            |
/*当在__arm920_setup中执行完最后一句mov pc, lr时,就跳到__enable_mmu中去执行了*/
            |
        __enable_mmu
/*__enable_mmu执行完最后一句mov pc, r13时,跳到__switch_data执行,__switch_data的第一个值是.long __mmap_switched,所以就去执行__mmap_switched  */
            |
        __mmap_switched
            |
/*__mmap_switched中最后一句b start_kernel,开始调用start_kernel,第一阶段完成*/  
         start_kernel
 
3.第二阶段 在start_kernel中的部分函数
printk(linux_banner);
setup_arch(&command_line);
console_init();
rest_init();
 
 
 
 
阅读(1957) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2010-05-11 09:52:59

好!非常好!