首页 > 其他 > 详细

main和_main的区别

时间:2014-03-14 18:25:49      阅读:267      评论:0      收藏:0      [点我收藏+]
arm启动程序中当所有的系统初始化工作完成之后,就需要把程序流程转入主应用程序,即呼叫主应用程序。最简单的一种情况是:
    IMPORT main
    b main
    直接从启动代码跳转到应用程序的主函数入口,当然主函数名字可以由用户根据自己的喜好随意定义。
 
   我们还经常见到另一种使用方法
    IMPORT __main

    B __main


这就很容易造成混淆  因为这两个基本都可以跳到main的主函数

这里就介绍下集体区别:

    __main()是编译系统提供的一个函数,负责完成库函数的初始化和初始化应用程序执行环境,最后自动跳转到main()。所以说,前者是库函数,后者就是我们自己编写的main()主函数;

    因此我们用的B __main其实是执行库函数,然后该库函数再调用我们的main() 函数,

单步调试时会看到

1.先要跑一段程序(其实是库函数),

2.再单步到我们自己的main函数(这个同时也说明如果有B __main 则就对应必须有main函数,否则编译出错),

如果我们用 B main来进入我们的主函数的话,那在单步调试时就看到直接进入到我们自己的main函数了,中间不会看到其他程序;

    那么用B __main和用B main 这两这进入我们的main函数方式有什么不同呢?

先介绍连个名字  加载域:程序存储的位置  可能在rom RAM   sdram等

                              执行域:执行的地址常见的0x0

   如果采用前者则会由编译器加入一段"段拷贝"程序,即我们说的从加载域到执行域转化程序;而采用后者就没有这个了,因此如果要进行 "段拷贝"只能自己动手编写程序来实现了,完成段拷贝后就可以进入我们的主函数了,当然这个主函数不一定是叫做main(),可以起个其他好听的名字,这个有别于使用B __main方式;不管采用哪种方式进入我们的程序,都要有一段"段拷贝"程序,跑完了段拷贝后才能可以进入我们主程序了
 
    对含有启动程序来说,"执行地址与加载地址相同"不容易实现:
    如果执行地址与加载地址相同哪当然不需要做"段拷贝",但是个人理解编译器还会加入"段拷贝"程序(如果用B __main的话),只是因为条件不满足而不执行而已;但是对含有启动程序来说,"执行地址与加载地址相同"就不容易了.因为启动程序是要烧到非易失存储器里,用来在上电执行的,而这个程序必定会有RW段,如果RW放在非易失存储器,如FLASH,那就不好实现RW功能了,因此要给RW移动到能够实现RW功能的存储器,如SRAM等.因此,对含有启动程序来说,"执行地址与加载地址相同"就不容易实现;程序的入口点在C 库中的__main 处,在该点,库代码执行以下操作:

1. 将非零(只读和读写)运行区域从其载入地址复制到运行地址。
2. 清零ZI 区域。
3. 跳转到_entry地址

这里看下我编译的main的code段编译结果

bubuko.com,布布扣bubuko.com,布布扣

对比看下_main编译结果

bubuko.com,布布扣bubuko.com,布布扣

这里就能明显看到两个编译的区别了   _main 存在了很多的库函数.O文件加到了编译的记过里面去,这些就是那些搬移的。

最后再看下_bubuko.com,布布扣main的运行地址

bubuko.com,布布扣

这里可以看到是在0x50000000  就是我设置的入口点

下面看先_main的

bubuko.com,布布扣

main的地址变成0x500000c4  这里就可以看到他的地址变得靠后了  以为中间加了一段其他程序在他前面执行了


main和_main的区别,布布扣,bubuko.com

main和_main的区别

原文:http://blog.csdn.net/weiwei_xiaoyu/article/details/21157513

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!