- 论坛徽章:
- 0
|
http://www.jsjren.com/linuxxuexi/html/12.html
系统加电启动后,Mips处理器默认的程序入口是0xBFC00000。 Linux内核启动的第一阶段是从/arch/mips/kernel/head.s文件开始的。此处正是内核入口函数kernel_entry(),该函数在/arch/mips/kernel/head.s中:
NESTED(kernel_entry, 16, sp) # kernel entry point
kernel_entry_setup # cpu specific setup
setup_c0_status_pri
/* We might not get launched at the address the kernel is linked to,
so we jump there. */
PTR_LA t0, 0f
jr t0
0:
#ifdef CONFIG_MIPS_MT_SMTC
mtc0 zero, CP0_TCCONTEXT
mfc0 t0, CP0_STATUS
ori t0, t0, 0xff1f
xori t0, t0, 0x001e
mtc0 t0, CP0_STATUS
#endif /* CONFIG_MIPS_MT_SMTC */
PTR_LA t0, __bss_start # clear .bss
LONG_S zero, (t0)
PTR_LA t1, __bss_stop - LONGSIZE
1:
PTR_ADDIU t0, LONGSIZE
LONG_S zero, (t0)
bne t0, t1, 1b
LONG_S a0, fw_arg0 # firmware arguments
LONG_S a1, fw_arg1
LONG_S a2, fw_arg2
LONG_S a3, fw_arg3
MTC0 zero, CP0_CONTEXT # clear context register
PTR_LA $28, init_thread_union
/* Set the SP after an empty pt_regs. */
PTR_LI sp, _THREAD_SIZE - 32 - PT_SIZE
PTR_ADDU sp, $28
back_to_back_c0_hazard
set_saved_sp sp, t0, t1
PTR_SUBU sp, 4 * SZREG # init stack pointer
j start_kernel
END(kernel_entry)
Kernel_entry()函数是体系结构相关的汇编语言,它首先初始化内核的堆栈,为创建系统中的第一个进程准备。接着用一段循环将内核映像的未初始化数据段清0. 最后跳转到/init /main.c 中的start_kernel初始化硬件平台相关的代码。
asmlinkage void __init start_kernel(void) 调用函数进行初始化, 以下为其调用的函数:
smp_setup_processor_id(); //设置 SMP 多核的 CPU 核的 ID 号,单核不进行任何操作,我们不关心。
local_irq_disable(); //关闭当前CPU 核的中断
boot_cpu_init(); //对于CPU 核的系统来说,设置第一个 CPU 核为活跃 CPU 核。
对于单 CPU 核系统来说,设置 CPU 核为活跃 CPU 核。
setup_arch(&command_line); //执行与体系结构有关的设置
sched_init (); //核心进程调度器初始化,调度器的初始化优先于任何中断的建立.
// 定义在 :/arch/mips/kernel/trap.c line 1616
trap_init(); // 设置CPU的异常处理函数,TLB重填,cache出错, 通用异常处理表的 初始化
rcu_init() //初始化rcu机制
init_IRQ() //用来初始化中断处理硬件相关的寄存器和中断描述符数组irq_desc[]。每个中断都有一个对应的中断描述符。定义在 : /arch/mips/kernel/irq.c line 134
init_timer() // 初始化本CPU上的定时器timer相关数据结构,初始化时钟的软中断处理函数
softirq_init()//对软中断子系统进行初始化
console_init() //初始化内核显示终端
mem_init() //内存初始化 定义位置:/arch/mips/mm/init.c line :364
kmem_init() //系统初始化,创建内核地址映射
kmem_cache_init() //用来初始化cache,在初始化阶段使用了全局静态变量cache_cach个变量是用来管理所有cache的kmem_cache的
pgtable_cache_init() //页表cache初始化
fork_init() //定义位置 /kernel/fork.c line 203 |
|