毛爷爷教导我们,找内核entry应该从连接脚本lds着手。好吧,let‘s go。。。
在我们继续之前,我们不妨先去看看这个东东:

现在你明白了,zImage这丫的也就是一二进制文件,我靠!
阅读顶层Makefile,细心的同学已经发现了有这么一行
vmlinux: $(vmlinux-lds) $(vmlinux-init) $(vmlinux-main) vmlinux.o $(kallsyms.o) FORCE
tips:也许你的源码里面没有vmlinux.lds,试试修改.config或make menuconfig
没错,这里就是找到连接脚本的线索,让我们到对应的体系相关目录arck/arm/kernel/会会vmlinux.lds。这里有一行【参考1、2】:
ENTRY(stext)
这是内核入口?晕,懵了,在Linker Script in Linux和Makefile大神帮助下,arch/arm/kernel/head.S通过arm-linux-ld光荣地冲到了代码的最前面。.
head-y := head$(MMUEXT).o obj-$(CONFIG_DEBUG_LL) += debug.o extra-y := $(head-y) init_task.o vmlinux.lds
好啦,心急的同学也许会说了,搞啥子呢,咋还没开始呢?
共产主义不是一日能实现的,linux也不是一天读完的,我这就开始分析head.S。。
直接贴代码和注释:
/* 定义内核启动的虚拟地址和物理地址 */
#define KERNEL_RAM_VADDR (PAGE_OFFSET + TEXT_OFFSET)
#define KERNEL_RAM_PADDR (PHYS_OFFSET + TEXT_OFFSET)
/* 定义页目录表的虚拟地址 */
.globl swapper_pg_dir
.equ swapper_pg_dir, KERNEL_RAM_VADDR - 0x4000
/* 宏定义:把初始页面目录表的物理地址装入 rd */
.macro pgtbl, rd
ldr \rd, =(KERNEL_RAM_PADDR - 0x4000)
.endm
/* 塞入到.text.head段 */
.section ".text.head", "ax"
ENTRY(stext)
/* 设置CPU工作模式为管理模式,关中断 */
setmode PSR_F_BIT | PSR_I_BIT | SVC_MODE, r9 @ ensure svc mode
mrc p15, 0, r9, c0, c0 @ get processor id
/* CPUID => r9; 调用__lookup_processor_type 查找处理器信息结构, proc_info 指针 => r10 */
mrc p15, 0, r9, c0, c0 @ get processor id
bl __lookup_processor_type @ r5=procinfo r9=cpuid r10=proc_info
明天继续。。。
参考资料:
1、http://www.linuxforum.net/forum/printthread.php?Cat=&Board=linuxK&main=717956&type=thread
2、http://bbs.chinaunix.net/thread-2029114-1-1.html
浙公网安备 33010602011771号