基于x86体系结构分析linux-2.6.26的启动过程(一)——linux映像的make过程分析。

                                                 基于x86体系结构分析linux-2.6.26的启动过程 1.linux映像的make过程分析(一)——inux映像的make过程分析

  (1)先大体看一下linux的内核源码结构,比较重要的有一下几个方面。

       ①,arch  它是与体系结构相关的一个目录,里边包含了很多各种不同体系结构的支持内容,比如有arm  h8300 alpha等,当然也有X86,而在这些目录下,又有一些比较重要的目录,如mm kernel等。

       ②,init 是一些初始化的代码,包含main.c version.c 等文件,当然这其中也有start-kernel函数。

       ③,kernel 主要的核心代码目录,这里边的内容实现了很多linux系统的内核函数,当然,一些和体系结构相关的代码还是在arch目录下。

             其他的如Lib是放置核心的库代码,Net是核心与网络相关的代码, Ipc是包含核心的进程间通讯的代码等目录下的内如就不一一列举了,下面开始分析make的流程。

  (2)make过程分析 

       在经过make oldconfig 产生.config之后,就要进行make了,再输入make后,顶层的makefile将会读取该配置文件,然后根据这个文件通过递归编译内核代码树子目录生成用户需要的vmlinux,那为什么在命令行输入make后会生成vmlinux呢?看下图:

              

                 从注释中可以看出在命令行没有输入目标时,默认目标是_all,下面再看图,

                                                                                      

  

                在上图中可以看出,在make无参数情况下,_all的依赖为all,所以默认情况下会编译all再看下图:

                                  

    

               在这里,all最终被定义为vmlinux,所以在输入make 后会编译生成vmlinux。下面分析vmlinux 的生成过程,即先找到vmlinux的依赖文件。 通过查找,可以看下图:

        

                                                                                    

                                                    

                                                                                            

                 从图中可以看到,vmlinux依赖后面的几个变量,那么后面的变量是怎么被定义的呢,在查找,看下图:

 

                                                                                  

                从图中可以看出各个变量的定义,而vmlinux-lds是在体系结构相关的目录下,而在x86下,确实有这个文件,如图:

       

 

                  从图中还可知,vmlinux-init和vmlinux-main也依赖于几个变量,分别是head-y和init-y,core-y,drivers-y,下面再找它们的定义,如图:

                            

                                                                                      

                   可以看到它们的定义,但在查找发现,这只是第一次定义,如图:

                              

                   可以看到它们的定义,比较复杂,如第一行,大意是说,将符合%/的单词替换成%/build-in.o ,即init-y := init/built-in.o。可是然后又发现,在这些定义的上边,还有东西,如图:

                                                     

                     core-y+= kernel/  mm/  fs/   ipc/   security/   crypto/   block/  结合上上个图看出,它会到kernel  mm  fs  ipc 等目录下生成各目录的build-in.o ,当然,其他的XX-y也会这样做,它们通过这样的方式合成vmlinux-init,vmlinux-main,再最后合成vmlinux。

          然后再看贴图中的vmlinux-dirs ,它的意思大致是说将vmlinux-dirs里面的目录进行了递归处理产生出build-in.o。filter是makefile的过滤函数,在此处意味将符合%/的单词留下,很明显,这样就得到了每个的目录,如init/build-in.o就变为init/了,  这样就装换为目录,可以递归的生成build-.o了。然后通过链接就可以最终完成vmlinux了。下面再简单分析链接的过程。

       如图:      

                                                                              

                        可以看到有很多call命令,这个函数是个可以用来创建新的参数化的函数。和C 中创建的函数差不多,它后边跟的一般就是这些新的函数,在这里通过call rule-vmlinux来执行链接,在rule-vmlinux中还有一些新函数定义,并最终通过这些来连接生成vmlinux。

就这样vmlinux出来了,但还没有压缩,即bzimage过程。

下面简要分析bzImage过程。

                             如图:这是arch/x86/Makefile。

                                                                                 

                          可以看到 all在这里的目标是bzimage,所一当make到了这里的时候,会生成bzimage,而在下面还可以看到bzimage的依赖文件,vmlinux,下软连接的命令。


                                                                                 

            

                          如上图,这是在arch/x86/boot目录下的makefile,从图中可以看出,bzimage被装载的位置是0x100000,还可以看到bzimage的依赖文件是steup.bin,vmlinux.bin等。

         下面就要进入到链接结束环节了,     如图:

                                                                            

    


                            

                              在上两个图中,又可以看到setup.bin和vmlinux.bin所依赖的文件,而在setup.bin中会有header  main等被链接进来。即bootloader在载入映像后会跳转的位置。最终在生成这两个文件后,通过链接成为了bzImage。

         bzImage就分析到这里。下篇开始分析启动流程。

 


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值