• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
梦想照进灵魂
博客园    首页    新随笔    联系   管理    订阅  订阅
linux -- boot code analysis

       毛爷爷教导我们,找内核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



posted on 2011-11-22 00:12  梦想照进灵魂  阅读(245)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3