读书频道 > 系统 > linux > 深度探索Linux操作系统系统构建和原理解析
3.2.6 bzImage的组合过程
2013-09-28 16:14:20     我来说两句 
收藏    我要投稿   
全书一共8章:第1章介绍了如何准备工作环境。在第2章中构建了编译工具链,这是后面构建操作系统各个组件的基础。在这一章中,不仅详细讲解了工具链的构建过程,而且还通过对编译链接过程的探讨,深入讨论了工具链  立即去当当网订购

一级推进系统和包括有效载荷的二级推进系统都已就绪,这一节,我们就来讨论一级推进系统和二级推进系统的组合。组合的规则定义在平台的“顶层”Makefile中:
linux-3.7.4/arch/x86/Makefile:
boot := arch/x86/boot
...
KBUILD_IMAGE := $(boot)/bzImage
...
bzImage: vmlinux
...
    $(Q)$(MAKE) $(build)=$(boot) $(KBUILD_IMAGE)

在将各个变量进行替换后,构建bzImage的命令展开为:
make -f scripts/Makefile.build obj=arch/x86/boot
    arch/x86/boot/bzImage

Makefile.build将包含在arch/x86/boot目录下的Makefile文件组成为最终的Makefile。构建目标arch/x86/boot/bzImage的规则在arch/x86/boot下的Makefile中:
linux-3.7.4/arch/x86/boot/Makefile:
$(obj)/bzImage: $(obj)/setup.bin $(obj)/vmlinux.bin \
                $(obj)/tools/build FORCE
    $(call if_changed,image)

我们来看看构建bzImage的命令cmd_image,其在arch/x86/boot/Makefile中定义:
linux-3.7.4/arch/x86/boot/Makefile:
cmd_image = $(obj)/tools/build $(obj)/setup.bin \
    $(obj)/vmlinux.bin > $@

根据cmd_image的定义,表面上就是执行程序build,并传递给程序build两个参数,分别是arch/x86/boot目录下的setup.bin和vmlinux.bin,同时将程序build的标准输出stdout重定向到规则的目标($@),即bzImage。那么程序build究竟做了什么呢?我们来看看它的源码
linux-3.7.4/arch/x86/boot/tools/build.c:
1 /* This must be large enough to hold the entire setup */
2 u8 buf[SETUP_SECT_MAX*512];
3 ...
4 int main(int argc, char ** argv)
5 {
6     ...
7     void *kernel;
8     ...
9     file = fopen(argv[1], "r");
10    ...
11    c = fread(buf, 1, sizeof(buf), file);
12    ...
13    fd = open(argv[2], O_RDONLY);
14    ...
15    kernel = mmap(NULL, sz, PROT_READ, MAP_SHARED, fd, 0);
16    ...
17    if (fwrite(buf, 1, i, stdout) != i)
18    ...
19    if (fwrite(kernel, 1, sz, stdout) != sz)
20    ...
21 }

1)argv[1]对应的是setup.bin,所以第9行代码就是将文件setup.bin打开,第11行代码是将其内容读到数组buf中。由第1行的注释可见,数组buf就是用来存放setup.bin的。

2)argv[2]对应的是vmlinux.bin,所以第13行代码是将文件vmlinux.bin打开。因为vmlinux.bin尺寸较大,build并没有使用与setup.bin相同的方式读取vmlinux.bin,而是将vmlinux.bin映射到build的进程空间中,变量kernel指向了vmlinux.bin映射的基址,如代码第15行所示。也就是说,build通过内存映射的方式读取文件vmlinux.bin。

3)第17行代码是将读取到buf中的setup.bin写入到标准输出(stdout)。而根据cmd_image的定义,build程序已经将其标准输出重定向为bzImage,所以这里并不是将setup.bin显示到屏幕上,而是写入到文件bzImage中。

4)同理第19行代码是将vmlinux.bin写入到文件bzImage中。

可见,程序build就是将setup.bin和vmlinux.bin简单地连接为bzImage。

点击复制链接 与好友分享!回本站首页
分享到: 更多
您对本文章有什么意见或着疑问吗?请到论坛讨论您的关注和建议是我们前行的参考和动力  
上一篇:3.2.5 setup.bin的构建过程
下一篇:3.2.7 内核映像构建过程总结
相关文章
图文推荐
3.3.6 GNOME的软件管
3.3.5 GNOME的文件管
3.3.4 GNOME的窗口管
3.3.3 收藏夹和快捷
排行
热门
文章
下载
读书

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训
版权所有: 红黑联盟--致力于做最好的IT技术学习网站