欢迎来到天天文库
浏览记录
ID:50809958
大小:88.50 KB
页数:14页
时间:2020-03-14
《内核启动过程(根据自己心得所整理最全).doc》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、内核启动过程总结之前配置编译过内核源代码,在交叉编译源代码后产生了三个文件(还有其他文件)分别是vmlinuz、vmlinux、vmlinux32,其中vmlinuz是可引导的、压缩了的内核,将该内核拷贝到系统文件/boot目录下,再配置下/boot/boot.cfg文件,将启动时选择内核的信息和加载内核的地方写入就可以实现内核的移植。其实移植过程和正常内核启动过程的原理是一样的。系统加电启动后,MIPS处理器默认的程序入口时0xBFC00000,此地址在无缓存的KSEG1的地址区域内,对应的物理地址是
2、0x1FC00000,即CPU从0x1FC00000开始取第一条指令,内核是系统引导程序把内核加载到内存中的,如果内核是经过压缩的,那么首先执行/arch/mips/boot/compressed的head.S文件去建立堆栈并解压内核映像文件,然后去执行/arch/mips/kernel下的head.S,如果是没有压缩的内核则直接去执行该head.S。linux内核启动的第一阶段就是从kernel文件夹下的head.S开始的,kernel_entry()函数就是内核启动的入口函数,这个函数是与体系结构相
3、关的汇编语言编写的,它首先初始化内核堆栈段,来为创建系统的第一个进程0进程作准备,接着用一段循环将内核映像的未初始化数据段bss段清零,最后跳转到/init/main.c中的start_kernel()初始化硬件平台相关的代码。kernel_entry()-arch/mips/kernel/head.STLB初始化,Cache初始化清除BSS段准备参数argc/argp/envp设置栈jalstart_kernel(init/main.c)怎么为第一个进程0进程作准备?第一个进程涉及到init_thre
4、ad_union,这个结构体在include/linux/sched.h得到定义externunionthread_unioninit_thread_union;unionthread_union{structthread_infothread_info;unsignedlongstack[THREAD_SIZE/sizeof(long)];};THREAD_SIZE是一个宏定义#defineTHREAD_SIZE(2*PAGE_SIZE)#definePAGE_SIZE(_AC(1,UL)<5、_SHIFT)PAGE_SHIFT=13算出PAGE_SIZE=2^12=4096;则THREAD_SIZE=8192内核把进程存放在任务队列的双向循环链表中,链表中的每一项都是类型为task_struct、称为进程描述符的结构,进程描述符中包含一个具体进程的所有信息,linux通过slab分配器分配task_struct结构,每个任务都有一个thread_info结构,它在内核栈的尾部分配,结构中的task域中存放的是指向该任务实际task_struct的指针,thread_info结构在文件6、/thread_info.h>中定义。structthread_info{structtask_struct*task;/*maintaskstructure*/structexec_domain*exec_domain;/*executiondomain*/unsignedlongflags;/*lowlevelflags*/unsignedlongtp_value;/*threadpointer*/__u32cpu;/*currentCPU*/intpreempt_count;/*0=>preemp7、table,<0=>BUG*/mm_segment_taddr_limit;/*threadaddressspace:0-0xBFFFFFFFforuser-thead0-0xFFFFFFFFforkernel-thread*/structrestart_blockrestart_block;structpt_regs*regs;};/**Initialthreadstructure.**Weneedtomakesurethatthisis8192-bytealignedduetothe*wayproc8、essstacksarehandled.Thisisdonebymakingsure*thelinkermapsthisinthe.textsegmentrightafterhead.S,*andmakinghead.Sensuretheproperalignment.**Thethingswedoforperformance..*/unionthread_unioninit_thread_union__init_task_data__at
5、_SHIFT)PAGE_SHIFT=13算出PAGE_SIZE=2^12=4096;则THREAD_SIZE=8192内核把进程存放在任务队列的双向循环链表中,链表中的每一项都是类型为task_struct、称为进程描述符的结构,进程描述符中包含一个具体进程的所有信息,linux通过slab分配器分配task_struct结构,每个任务都有一个thread_info结构,它在内核栈的尾部分配,结构中的task域中存放的是指向该任务实际task_struct的指针,thread_info结构在文件6、/thread_info.h>中定义。structthread_info{structtask_struct*task;/*maintaskstructure*/structexec_domain*exec_domain;/*executiondomain*/unsignedlongflags;/*lowlevelflags*/unsignedlongtp_value;/*threadpointer*/__u32cpu;/*currentCPU*/intpreempt_count;/*0=>preemp7、table,<0=>BUG*/mm_segment_taddr_limit;/*threadaddressspace:0-0xBFFFFFFFforuser-thead0-0xFFFFFFFFforkernel-thread*/structrestart_blockrestart_block;structpt_regs*regs;};/**Initialthreadstructure.**Weneedtomakesurethatthisis8192-bytealignedduetothe*wayproc8、essstacksarehandled.Thisisdonebymakingsure*thelinkermapsthisinthe.textsegmentrightafterhead.S,*andmakinghead.Sensuretheproperalignment.**Thethingswedoforperformance..*/unionthread_unioninit_thread_union__init_task_data__at
6、/thread_info.h>中定义。structthread_info{structtask_struct*task;/*maintaskstructure*/structexec_domain*exec_domain;/*executiondomain*/unsignedlongflags;/*lowlevelflags*/unsignedlongtp_value;/*threadpointer*/__u32cpu;/*currentCPU*/intpreempt_count;/*0=>preemp
7、table,<0=>BUG*/mm_segment_taddr_limit;/*threadaddressspace:0-0xBFFFFFFFforuser-thead0-0xFFFFFFFFforkernel-thread*/structrestart_blockrestart_block;structpt_regs*regs;};/**Initialthreadstructure.**Weneedtomakesurethatthisis8192-bytealignedduetothe*wayproc
8、essstacksarehandled.Thisisdonebymakingsure*thelinkermapsthisinthe.textsegmentrightafterhead.S,*andmakinghead.Sensuretheproperalignment.**Thethingswedoforperformance..*/unionthread_unioninit_thread_union__init_task_data__at
此文档下载收益归作者所有