zslhutu的个人空间 https://blog.eetop.cn/?305546 [收藏] [复制] [分享] [RSS]

日志

__main库函数的调用

已有 3769 次阅读| 2010-8-4 12:36

     我们大家都知道在系统启动后,一般会由汇编初始化程序跳到用户的主程序main,既可B  main;也可以B __main;而两者的区别在与main是一般的标号main,而__main是c/c++库函数,B __main,其实是先进系统库函数,然后在里边在进行跳转到main。那究竟__main里做了什么呢?

       arm应用系统开始执行用户应用程序,必须先将应用程序加载到执行域,建立应用程序的执行环境。使用C库时,这些繁琐的工作就大部分由C函数来完成了。汇编程序完成系统初始化后,跳转到C程序的入口__main()(注意:不是main(),当C程序中定义了main()主函数时,编译器就会生成__main代码)。由__main()引导库函数完成C执行环境的初始化,具体过程如下:

  ◇ 将非启动代码的RORW执行域代码从加载域地址复制到执行域地址;
  ◇ ZI域清零;
  ◇ 跳转到__rt_entry

  调用__main()将大大简化汇编启动代码的编写,汇编代码仅需完成系统硬件的初始化,而没有必要将代码从加载域地址复制到执行域地址,以及 ZI域清零等工作。特别是当使用分布式加载时, __main()的作用就更加明显了。但是__main()并没有建立C库运行必须的环境,这项工作由__rt_entry()完成,主要调用过程为:

  ◇ 调用__rt_stackheap_init()建立堆和栈;
  ◇ 调用__rt_lib_init()初始化引用的库函数;如果需要,建立main()函数的参数argcargv等;
  ◇ 调用main()函数,执行应用程序,可以应用库函数;
  ◇ main()函数的返回值作参数调用exit()

  __rt_entry并不是C函数,它是用ARM C库编程的起始点。__rt_entry不能用C语言实现,因为这时候堆栈还没有建立,堆栈由__rt_stackheap_init()来建立。

main()函数是用户代码的入口点。它运行时要求应用程序的运行环境的建立,可以调用相应的输入、输出函数。在main()函数中,可以调用重新实现的C运行时库的函数来实现下面一些功能:

       扩展数据栈和数据堆

       调用需要回调的用户定义的函数

       调用使用LOCALECTYPEC运行时库的函数

       完成浮点的运算

       调用高级及低级的输入输出的函数

       产生运行错误信

 

截自:http://www.embed.com.cn/downcenter/Article/Catalog33/5397.htm


点赞

评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 注册

  • 0

    周排名
  • 0

    月排名
  • 0

    总排名
  • 0

    关注
  • 1

    粉丝
  • 0

    好友
  • 0

    获赞
  • 7

    评论
  • 388

    访问数
关闭

站长推荐 上一条 /1 下一条


手机版| 小黑屋| 关于我们| 联系我们| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 ) |网站地图

GMT+8, 2025-10-17 03:50 , Processed in 0.032450 second(s), 6 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
返回顶部