囫囵C语言(三):谁调用了我的 main?

囫囵C语言(三):谁调用了我的 main?
    我们都听说过一句话:“main是C语言的入口”。我至今不明白为什么这么说。就好像如果有人说:“挣钱是泡妞”,肯定无数砖头拍过来。这句话应该是“挣 钱是泡妞的一个条件,只不过这个条件特别重要”。那么上面那句话应该是 “main是C语言中一个符号,只不过这个符号比较特别。”           我们看下面的例子:           /* file name test00.c */           int main(int argc, char* argv)      {      return 0;     }           编译链接它:      cc test00.c -o test.exe      会生成 test.exe           但是我们加上这个选项: -nostdlib (不链接标准库)      cc test00.c -nostdlib -o test.exe     链接器会报错:     undefined symbol: __start          也就是说:      1. 编译器缺省是找 __start 符号,而不是 main (不同的编译器却省符号可能也不一样)      2. __start 这个符号是程序的起始点      3. main 是被标准库调用的一个符号           再来思考一个问题:     我们写程序,比如一个模块,通常要有 initialize 和 de-initialize,但是我们写C程序的时候为什么有些模块没有这两个过程么呢?比如我们程序从main开始就可以 malloc,free,但是我们在 main 里面却没有初始化堆。再比如在 main里面可以直接printf,可是我们并没有打开标准输出文件啊。     那么一定是在 main 之前干了些什么。使这些函数可以直接调用而不用初始化。通常,我们会在编译器的环境中找到一个名字类似于 crt0.o 的文件,这个文件中包含了我们刚才所说的 __start 符号。(crt 大概是 C Runtime 的缩写,请大家帮助确认一下。)     那么真正的 crt0.s 是什么样子呢?下面我们给出部分伪代码:          ///      section .text:      __start:           :       init stack;       init heap;       open stdin;       open stdout;       open stderr;      :       push argv;       push argc;       call _main; (调用 main)       :      destory heap;       close stdin;       close stdout;       close stderr;      :   call __exit;           实际上可能还有很多初始化工作,因为都是和操作系统相关的,就不一一列出了。           注意:     1. 不同的编译器,不一定缺省得符号都是 __start。     2. 汇编里面的 _main 就是 C 语言里面的 main,是因为汇编器和C编译器对符号的命名有差异(通常是差一个下划线'_')。     3. 目前操作系统结构有两个主要的分支:微内核和宏内核。 微内核的优点是,结构清晰,简单,内核组件较少,便于维护; 缺点是,进程间通信较多,程序频繁进出内 核,效率较低。 宏内核正好相反。 我说这个是什么目的是:没办法保证每个组件都在用户空间(标准库函数)中初始化,有些组件确实可能不要初始化,操作系统在 创建进程的时候在内核空间做的。这依赖于操作系统的具体实现,比如堆,宏内核结构可能在内核初始化,微内核结构在用户空间;即使同样是微内核,这个东东也 可能会被拿到内核空间初始化。      4. 不同的操作系统 crt0 的实现会有巨大差异,比如unix类的操作系统,似乎stdin, stdout ,stderr是从父进程继承来的。我举得例子只是我知道的操作系统。
 
    金庸的武侠小说里面有句话我很认同:一个人的武功分了门派,就已经落入了下乘。
    随着 CPU 技术的发展,存储量的迅速扩展,代码复杂程度的增加,微内核被越来越多的采用。你会为了 10% 的效率使代码复杂度增加么?每隔18个月CPU的速度就会翻一番。个人认为,代码能让 80% 的人迅速看懂并可以维护是最重要的,至于代码效率是第二位的,当然你的代码效率也不能低上一个数量级 :-)。
 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值