linux代码入口,arm linux 从入口到start_kernel 代码详细分析

内核的人口是stext,这个是在arch/arm/kernel/vmlinux.lds.s定义

而符号stext是在arch/arm/kernel/head.S中定义的

其主线大致为:

1、确定processor type

通过cp15协处理器的c0寄存器来获取processor id的指令,跳转到__lookup_processor_type

__lookup_processor_type和数主要是根据从cpu获取的processor id和系统中的proc_info进行匹配,将匹配到得proc_info_list的基地址到r5,在processor type存储在r5中,最后判断r5十分为0,如果是0,说明是无效的type,跳转到error_p出错2、确定machine type

__proc_info_begin和__proc_info_end是在arch/arm/kernel/vmlinux.lds.S中:

__proc_info_begin = .;

*(.proc.info.init)

__proc_info_end = .;

这个地址存放着所有文件中的".proc.info.init"段得内容

kernel 使用struct proc_info_list来描述processor type.

在 include/asm-arm/procinfo.h 中:

struct proc_info_list {

unsigned int cpu_val;

unsigned int cpu_mask;

unsigned long __cpu_mm_mmu_flags;

unsigned long __cpu_io_mmu_flags;

unsigned long __cpu_flush;

const char *arch_name;

const char *elf_name;

unsigned int elf_hwcap;

const char *cpu_name;

struct processor *proc;

struct cpu_tlb_fns *tlb;

struct cpu_user_fns *user;

struct cpu_cache_fns *cache;

};

3、创建页表 __create_page_tables

4、调用平台特有的__cpu_flush函数

DEFINE(PROCINFO_INITFUNC,       offsetof(struct

proc_info_list, __cpu_flush));

此时,一些特定寄存器的值如下所示:

r4 = pgtbl

(page table的物理基地址)

r8 = machine info

(struct machine_desc的基地址)

r9 = cpu id

(通过cp15协处理器获得的cpu id)

r10 = procinfo

(struct proc_info_list的基地址)

在我们需要在开启mmu之前,做一些必须的工作:清除ICache, 清除 DCache, 清除 Writebuffer, 清除TLB等.这些一般是通过cp15协处理器来实现的,并且是平台相关的. 这就是 __cpu_flush 需要做的工作.

5、开启mmu

__enable_mmu

在进入 __enable_mmu 的时候, r0中已经存放了控制寄存器c1的一些配置(在上一步中进行的设置), 但是并没有真正的打开mmu,在 __enable_mmu 中,我们将打开mmu.此时,一些特定寄存器的值如下所示:

r0 = c1 parameters

(用来配置控制寄存器的参数)

r4 = pgtbl

(page table的物理基地址)

r8 = machine info

(struct machine_desc的基地址)

r9 = cpu id

(通过cp15协处理器获得的cpu id)

r10 = procinfo

(struct proc_info_list的基地)

6、切换数据 __mmap_switched

最终通过调用__mmap_switched跳转到start_kernel

__mmap_switched:

adr   r3, __switch_data + 4

ldm.w     (r6, r7, r8), [r3]+

ldw sp, [r3]

mov fp, #0                           @ Clear BSS (and zero fp)

203:

csub.a     r6, r7

bea 204f

stw.w      fp, [r6]+,#4

b     203b

204:

andn       r1, r0, #CR_A               @ Clear 'A' bit

stm (r0, r1), [r8]+               @ Save control register values

b     start_kernel

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值