GRUB0.93 源码阅读分析(简单学习makefile.am)---(2)

来源:互联网 发布:mysql decimal 时间 编辑:程序博客网 时间:2024/04/29 18:43

分析(1)文中有这样一行

.word (STAGE2_SIZE + 511) >> 9/*pgnotes:2个字节,STAGE2_SIZE的所占的扇区长度*/
不知道STAGE2_SIZE怎么来,决定大概的学习下makefile.am。从来没有做过linux应用程序开发,只能从网上找文章学习最基础的了,推荐http://www.ibm.com/developerworks/cn/linux/l-makefile/. 好,大致的了解了就开始

看/stage2/makefile.am,呵呵无知无畏:)一次完全搞懂很难,先大致理解一点点,也许效率高点。

noinst_PROGRAMS = pre_stage2.exec start.exec ......(省略,太长)

pgnotes: 对于可执行文件和静态库类型,如果只想编译,不想安装到系统中,就可以用noinst_PROGRAMS指定;

 

# For stage2 target.
pre_stage2_exec_SOURCES = asm.S bios.c boot.c builtins.c char_io.c /
 cmdline.c common.c console.c disk_io.c fsys_ext2fs.c /
 fsys_fat.c fsys_ffs.c fsys_jfs.c fsys_minix.c fsys_reiserfs.c /
 fsys_vstafs.c fsys_xfs.c gunzip.c hercules.c md5.c serial.c /
 smp-imps.c stage2.c terminfo.c tparm.c
pre_stage2_exec_CFLAGS = $(STAGE2_COMPILE) $(FSYS_CFLAGS)
pre_stage2_exec_ASFLAGS = $(STAGE2_COMPILE) $(FSYS_CFLAGS)
pre_stage2_exec_LDFLAGS = $(PRE_STAGE2_LINK)

pgnotes: 这一段看字面意思_SOURCES 、_CFLAGS 用来指明,编译生成pre_stage2.exec这个可执行文件需要的源文件、标志

等等;


PRE_STAGE2_LINK = -nostdlib -Wl,-N -Wl,-Ttext -Wl,8200
pgnotes: 这一行指明了0x8200是这个可执行文件运行的RAM位置;

start_exec_SOURCES = start.S
start_exec_ASFLAGS = $(STAGE2_COMPILE)
start_exec_LDFLAGS = $(START_LINK)

pgnotes: 这一段用来指明编译生成start_exec这个可执行文件需要的源文件、标志等等;
START_LINK = -nostdlib -Wl,-N -Wl,-Ttext -Wl,8000
pgnotes: 这一行指明了0x8000是这个可执行文件运行的RAM位置;

stage2_size.h: pre_stage2
 -rm -f stage2_size.h
 set dummy `ls -l pre_stage2`; /
 echo "#define STAGE2_SIZE $$6" > stage2_size.h

pgnotes: 这一段会自动生成stage2_size.h文件,打开这个文件可以看到动态加入的这一行"#define STAGE2_SIZE ?"

好,看到这里,差不多了解到了为什么start.S、asm.S会需要在0x8000、0x8200运行,还有stage2_size是这么来的。

 

在start.S中还有关于stage1_5和stage2的疑问,都可以通过makefile.am得到解释:

# For fat_stage1_5 target.
fat_stage1_5_exec_SOURCES = start.S asm.S common.c char_io.c disk_io.c /
 stage1_5.c fsys_fat.c bios.c

 

# For stage2 target.
pre_stage2_exec_SOURCES = asm.S bios.c boot.c builtins.c char_io.c /
 cmdline.c common.c console.c disk_io.c fsys_ext2fs.c /
 fsys_fat.c fsys_ffs.c fsys_jfs.c fsys_minix.c fsys_reiserfs.c /
 fsys_vstafs.c fsys_xfs.c gunzip.c hercules.c md5.c serial.c /
 smp-imps.c stage2.c terminfo.c tparm.c

pgnotes: 可以看到生成stage1_5需要的文件仅仅是文件系统的支持等简单功能,而stage2是集大成的。grub引导流程是stage1-->(stage1_5可选)--->stage2。


当然,我也是差不多看看字面意思,错漏难免,望daxia指点!有待以后修正!

------------------------------------------------------------------------------------------------------------------

下一篇接着《分析(1)》,继续代码阅读。start.Sjmp到了0x8200处,经过之前的分析可以发现,这里进入到了
asm.S,一般的.S的文件都是通过GNU gas 汇编器来编译的,gas采用的是UNIX的AT&T格式汇编. 随着学习的深入,可以对AT&T汇编格式有更多的了解。


 

原创粉丝点击