免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 24833 | 回复: 122
打印 上一主题 下一主题

[函数] 欢迎0521回来讨论main函数之前的动作问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-08-14 09:29 |只看该作者 |倒序浏览
CRT0是WINDOWS上的东西吧。

main() 之前的启动代码有
open stdin;
open stdout;
open stderr;
等动作。你是如何知道的?还是凭想象得出的结论?
如果有可能,请给出证明。




QUOTE http://cache.tianya.cn/publicforum/content/itinfo/1/59280.shtml
聪明的人民群众会想,一定是在 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. 目前操作系统结构有两个主要的分支:微内核和宏内核。微内核的优点是,结构清晰,简单,内核组件较少,便于维护;缺点是,进程间通信较多,程序频繁进出内核,效率较低。宏内核正好相反。我说这个是什么目的是:没办法保证每个组件都在用户空间(标准库函数)中初始化,有些组件确实可能不要初始化,操作系统在创建进程的时候在内核空间做的。这依赖于操作系统的具体实现,比如堆,宏内核结构可能在内核初始化,微内核结构在用户空间;即使同样是微内核,这个东东也可能会被拿到内核空间初始化。
    
    随着 CPU 技术的发展,存储量的迅速扩展,代码复杂程度的增加,微内核被越来越多的采用。你会为了 10% 的效率使代码复杂度增加么?要知道每隔 18 个月 CPU 的速度就会翻一番。所以我对程序员的要求是,我首先不要你的代码效率高,我首先要你的代码能让 80% 的人迅速看懂并可以维护。



您对本贴的看法:鲜花[0] 臭蛋[0]

[ 本帖最后由 思一克 于 2007-8-15 08:38 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2007-08-14 09:41 |只看该作者
crt0 不是仅仅是 windows 上的东西,我写这个东西的时候手上只有微软的编译器,哈哈,不好意思,让人误会我是微软的 fans.
我写的那个流程是参照一个类 MAC 的操作系统的库。我用过的一个版本的 GNU C 编译器,有 crt0 这个库。还真不是我凭空想象出来的。

所以也请理解我用了很多的似乎,也许,因为确实很多操作系统的实现差异很大。我也不敢说每个操作系统都是这样的。我在文章里一直在强调,操作系统一切皆有可能。

PS: 我曾经参与过两个操作系统内核的开发,我们提供给用户的库,是全部有类似 crt0 的库的,只不过名字可能不太一样。


     open stdin;
     open stdout;
     open stderr;

这三个东西不同的操作系统实现可能不一样,在创建进程的时候由操作系统在内核空间初始化也是可以的,看具体的实现,没一定之规。

可能我文章中的解释不够详细。

因为文章中太多的这些讲解,文章就会变得支离破碎,我文笔本来就不好

论坛徽章:
0
3 [报告]
发表于 2007-08-14 09:42 |只看该作者
2. 汇编里面的 _main 就是 C 语言里面的 main,是因为汇编器和C编译器对符号的命名有差异(通常是差一个下划线'_')。

看到这句了么,我用过一款编译器,差两个下划线,所以说我真得要用很多,通常,大概之类的词。

论坛徽章:
0
4 [报告]
发表于 2007-08-14 09:42 |只看该作者
不要模糊。

我是问到底main之前的代码有没有open stdin动作。windows上的也可以。

不能凭想象说事。

原帖由 escapedog 于 2007-8-14 09:41 发表
crt0 不是仅仅是 windows 上的东西,我写这个东西的时候手上只有微软的编译器,哈哈,不好意思,让人误会我是微软的 fans.
我写的那个流程是参照一个类 MAC 的操作系统的库。我用过的一个版本的 GNU C 编译器, ...

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
5 [报告]
发表于 2007-08-14 09:43 |只看该作者
main() 是 ANSI C 明文规定的 C 语言程序入口。
不关它之前还有什么,main() 都是入口,这是标准。
再往前说,有 bootstrap,而 bootstrap 也是由 loader 加载并运行的,
loader 之前还要设置进程环境,
而进程环境由是 OS 初始化的,
因此如果无视标准一直向前追究下去,
永远也找不到“入口”。

只懂实现的细节,而忽略了标准,这是非常错误的。

论坛徽章:
0
6 [报告]
发表于 2007-08-14 09:44 |只看该作者
肯定有!

void main()
{
    printf("aaaaaaaa\n");
}

这个程序很定可以执行对不?
printf 要定向 stdout 上对不?
那么什么时候打开(初始化)的呢?

论坛徽章:
0
7 [报告]
发表于 2007-08-14 09:47 |只看该作者
我以为WINDOWS上有特别呢。

根据你这回答,我知道了你完全是凭自己想象的open stdin. 而没有真正读代码。
这样会舞蹈别人。尤其是觉得你水平比自己高很多的人。


原帖由 escapedog 于 2007-8-14 09:44 发表
肯定有!

void main()
{
    printf("aaaaaaaa\n");
}

这个程序很定可以执行对不?
printf 要定向 stdout 上对不?
那么什么时候打开(初始化)的呢?

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
8 [报告]
发表于 2007-08-14 09:47 |只看该作者
原帖由 escapedog 于 2007-8-14 09:44 发表
肯定有!

void main()
{
    printf("aaaaaaaa\n");
}

这个程序很定可以执行对不?
printf 要定向 stdout 上对不?
那么什么时候打开(初始化)的呢?

你这是推断,而不是论证。
所谓大胆假设、小心求证,
你这个逻辑不正确。

论坛徽章:
0
9 [报告]
发表于 2007-08-14 09:53 |只看该作者
原帖由 思一克 于 2007-8-14 09:47 发表
我以为WINDOWS上有特别呢。

根据你这回答,我知道了你完全是凭自己想象的open stdin. 而没有真正读代码。
这样会舞蹈别人。尤其是觉得你水平比自己高很多的人。




我总不能把公司的代码贴上来吧?


windows 如果把它放到内核做,我有什么办法啊?但是你觉得 stdin 不打开就能用么?即使我是推断,有道理么?

论坛徽章:
0
10 [报告]
发表于 2007-08-14 09:54 |只看该作者
我记得之前有讨论过关于程序入口的问题,确实在执行main 函数之前要做些初始化动作。所以要真正讨论程序入口的问题,有定个前提,不然最后都要追究到主板上rom的启动过程了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP