免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2972 | 回复: 1
打印 上一主题 下一主题

mips linux启动过程必看 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-03-14 22:16 |只看该作者 |倒序浏览
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

论坛徽章:
0
2 [报告]
发表于 2012-03-14 22:16 |只看该作者
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP