friendfish 发表于 2006-4-4 15:48:18

关于BootLoader的问题----请大虾指点

各位大虾,小弟这几天正在研读“源码开放的嵌入式系统软件分析与实践”
看到关于bootloader处有几个问题想请教一下,望不吝赐教。

bootloader分为两大部分:stage1和stage2。书中在对于stage1和stage2的详细分析中有以下说法:
   stage1:
    在stage1的第四步设置堆栈时设为stage2_end-4,我是这样理解的不知对不对:给stage2分配1m的ram时,有可能stage2不能完全用完,同时由于stag2要用到堆栈还预留有堆栈区.分配的stage2的ram是从stage2_start---stage2_end的顺序,堆栈则是从stage2_end-4-----stage2_start的顺序.但要是这样的话,要是堆栈区压栈次数过多时岂不是要把stage2的程序刷掉?
    还有,定义堆栈sp时为什么不是stage2_end,而是stage2_end-4呢?那四个单元释放什么用的?

问题二:
   有关stage2
stage2的c程序为什么不能使用glibc库中的任何支持函数?请详述!
关于main函数的入口有事怎么回事呢?请详述!
在有后面的trampoline的程序能否注释一下~
程序如下:
.text
.globl_trampoline
   _trampoline
       bl main
       b_trampoline


本人入门还烦请各位大虾指点!

friendfish 发表于 2006-8-23 17:00:40

自己顶~

bamv2005 发表于 2006-8-24 12:14:05

其实第二个问题可以在网上找到, 在google上搜索"bootloader trampoline"就能找到这篇>文章: 嵌入式BootLoader技术内幕(http://linux.chinaunix.net/doc/embedded/2005-01-13/762.shtml), 下面是该文章对你第二个问题的回答.
"正如前面所说,stage2 的代码通常用 C 语言来实现,以便于实现更复杂的功能和取得更
好的代码可读性和可移植性。但是与普通 C 语言应用程序不同的是,在编译和链接 boot
loader 这样的程序时,我们不能使用 glibc 库中的任何支持函数。其原因是显而易见的
。这就给我们带来一个问题,那就是从那里跳转进 main() 函数呢?直接把 main() 函数
的起始地址作为整个 stage2 执行映像的入口点或许是最直接的想法。但是这样做有两个
缺点:1)无法通过main() 函数传递函数参数;2)无法处理 main() 函数返回的情况。一种
更为巧妙的方法是利用 trampoline(弹簧床)的概念。也即,用汇编语言写一段trampolin
e 小程序,并将这段 trampoline 小程序来作为 stage2 可执行映象的执行入口点。然后
我们可以在 trampoline 汇编小程序中用 CPU 跳转指令跳入 main() 函数中去执行;而当
main() 函数返回时,CPU 执行路径显然再次回到我们的 trampoline 程序。简而言之,
这种方法的思想就是:用这段 trampoline 小程序来作为 main() 函数的外部包裹(exter
nal wrapper)。"

你的第一个问题. 我也不太清楚. 但是堆栈的大小是根据实际情况设置的, 不会影响到代码部分. 还希望高人指点一下.

我也是初学, 大家一起努力!
页: [1]
查看完整版本: 关于BootLoader的问题----请大虾指点