若Blog访问速度太慢,可以尝试使用此地址进行访问:
移动:http://www.felix021.com/blog || 电信:http://ctc.felix021.com/blog || 网通、校园网:http://felix021.com/blog
1。交换链接 点击侧栏里的申请链接,或直接回复此文。p.s. 我不喜欢搞商业的阿,SEO的阿,摘抄的站点。
2。可以注册一个帐号 这样评论留言就不用输入验证码。有些日志只有登录后才能看到。
3。需要单独联系的 发邮件至 i [a][t] felix021.com
移动:http://www.felix021.com/blog || 电信:http://ctc.felix021.com/blog || 网通、校园网:http://felix021.com/blog
1。交换链接 点击侧栏里的申请链接,或直接回复此文。p.s. 我不喜欢搞商业的阿,SEO的阿,摘抄的站点。
2。可以注册一个帐号 这样评论留言就不用输入验证码。有些日志只有登录后才能看到。
3。需要单独联系的 发邮件至 i [a][t] felix021.com
本文档分析了xen启动时创建dom0的基本过程,并进行了一些简单的测试,记录了测试结果。
@ xen3.3.0/xen/arch/x86/setup.c
---- line 408 __start_xen(unsigned long mbi_p)
@ line 414, multiboot_info_t *mbi = __va(mbi_p);
mbi = multiboot_info, 类型multiboot_info_t, 位于include/xen/multiboot.h
@ line 415, modile_t *mod = (module_t *)__va(mbi->mods_addr);
module_t是一个位于multiboot.h中的struct,包含mod_start, mod_end, string, reserved等4个成员,其中mod_start, mod_end是地址, string是module [file] [para]这里的para字段(参数, 如果没有的话,就是NULL),比如kernel的参数就是这么搞出来的cmdline(大概在997行的位置)。
这个mod是一个指针,取值于mbi_p的成员mods_addr,其实就对应了一个数组,这数组的每一项应该就是顺序地对应着grub启动xen的时候,每一个module行对应的文件载入内存后的信息,包括起始和结束地址,还有附加的参数。
@ xen3.3.0/xen/arch/x86/setup.c
---- line 408 __start_xen(unsigned long mbi_p)
@ line 414, multiboot_info_t *mbi = __va(mbi_p);
mbi = multiboot_info, 类型multiboot_info_t, 位于include/xen/multiboot.h
@ line 415, modile_t *mod = (module_t *)__va(mbi->mods_addr);
module_t是一个位于multiboot.h中的struct,包含mod_start, mod_end, string, reserved等4个成员,其中mod_start, mod_end是地址, string是module [file] [para]这里的para字段(参数, 如果没有的话,就是NULL),比如kernel的参数就是这么搞出来的cmdline(大概在997行的位置)。
这个mod是一个指针,取值于mbi_p的成员mods_addr,其实就对应了一个数组,这数组的每一项应该就是顺序地对应着grub启动xen的时候,每一个module行对应的文件载入内存后的信息,包括起始和结束地址,还有附加的参数。
一直觉得C++做到了一件看似不可能的任务:
实现了完整的OO(甚至还有多继承),同时提供了对泛型几近完美的支持,还保证了足够的效率。
相比之下,
Java对OO的支持的确很好,但是它对泛型的支持,我觉得只能用丑陋来形容;同时它还提供了让我难以接受的效率。
Sandy在用Java开发他的手机游戏时就遇到了种种问题,
我也无法接受它"把一切都封装好只为让开发更简单"这样的Bullshit。
事实上一切都变复杂了。
C没有提供对OO的支持,也没有提供对泛型的直接支持;效率的确可观,但是用于开发,似乎很费劲。
对于开发人员,为一个安全数组写一大段基于malloc/realloc和需要强制类型的转换的代码似乎很累,而且可读性也差。
而C++的vector使用起来就相当省事,代码也更加清晰易读。
所以曾经有一段时间感到有点纳闷,为什么那么多大项目是用C开发的,而不是C++?
"历史遗留问题"似乎解释不通,比如Linux源代码是经过了几次完全的重写,其间C++已经发展得比较完善了。
回过头来想想另一件事情:
如果你经常逛一些偏开发类的论坛(比如CSDN?),并看到过那些有"纯正血统"的Java程序员的言论
你就会知道那些人如同不学无术的八旗子弟一般不堪;
尤其是他们对指针的理解,那根本就是P话,而且一点都不好笑。
这里不是想嘲笑他们有多么粗俗浅陋,毕竟没有学C不一定是他们的错。
这只是个类比,C和C++的对比,在一些方面与C/C++和Java的对比还是很相似的。
Linux之父Linus对C++嗤之以鼻,甚至因此和某人大吵一架,并毫不保留地表达了他对C++以及C++程序员的蔑视。
从普通开发者的角度看来,一个提供完整OOP支持的语言不仅提高了开发效率、增加代码可读性,还为代码重用带来了极大的便利。这的确是现代大型系统开发需要的,但是它真的做到了吗?
你在学习C++的过程中可以很容易的学到如何继承一个类,可是你知道如果这个类的析构函数不是虚函数可能带来怎样的后果?你可以很容易地学到如何使用set/map,如何为它写一个简单的functor,可是你知道严格弱序化这个原则吗(Strict Weak Ordering)?
如果你不知道,没关系,这不是你的错,因为C++已经复杂到让人吃惊的地步了:STL中出现的traits和可以重载的逗号运算符都不算什么了,可是居然还能有boost这么变态的东西!甚至有人说,C++是唯一一门连语言之父都要别人教他怎么使用的语言了。
从某些角度来说,Java似乎做得更好:提供了丰富的类库以及完善的GC,你忘记了的东西通通交给它吧----可是你真的放心么?如果你知道Sandy仅仅因为String的问题就纠结了那么久,你就不会给出肯定答案了。我的看法是,Java只是把一切都变得复杂了(的确,我对Java有偏见,Sandy也是)。
最后回到C。不可否认,C标准库里的东西太少了,和现实不够接轨,不是类型安全的,只有指针没有引用也让代码看起来更ooxx... 但是仔细想想,其实C提供了一个足够简洁而完善的对底层的合理抽象,将控制一切的操作能力都交给你,让你能够不纠结于语言层面的复杂性,而将精力投入到功能的实现中去。
不要认为C不支持面向对象,不要认为这一点就限制了设计模式的使用----事实上,完全用C写就的Linux源代码是高度面向对象的,使用了令人惊叹的设计模式,达到了不可思议的效率和可扩展性。
做了这样的对比,不是想说C++和Java有多么不堪,至少从进化论的角度来说,他们都是成功的、优秀的。仔细思索,之所以Linus如此鄙视C++,并不是因为C++真的很差,而是因为C++的复杂性使得系统的设计变得更加复杂(特别是在要求高效率的地方,你用C++可能根本找不到效率损失于何处!),更为可怕的是,有那么多自以为是的程序员,以为学会了class a: public b就是学会了面向对象,以为学会了Observer模式的含义就真正掌握了设计模式,甚至以为学会了MFC就是学会了C++。如果这些人加入Linux内核的开发,那的的确确是一场灾难,而且极其可怕。
"的确有不少C++程序员贡献代码,但是反而需要核心的C程序员花费更多时间去修改和删除。"
最后,援引Linus的一句话作为结束:
实现了完整的OO(甚至还有多继承),同时提供了对泛型几近完美的支持,还保证了足够的效率。
相比之下,
Java对OO的支持的确很好,但是它对泛型的支持,我觉得只能用丑陋来形容;同时它还提供了让我难以接受的效率。
Sandy在用Java开发他的手机游戏时就遇到了种种问题,
我也无法接受它"把一切都封装好只为让开发更简单"这样的Bullshit。
事实上一切都变复杂了。
C没有提供对OO的支持,也没有提供对泛型的直接支持;效率的确可观,但是用于开发,似乎很费劲。
对于开发人员,为一个安全数组写一大段基于malloc/realloc和需要强制类型的转换的代码似乎很累,而且可读性也差。
而C++的vector使用起来就相当省事,代码也更加清晰易读。
所以曾经有一段时间感到有点纳闷,为什么那么多大项目是用C开发的,而不是C++?
"历史遗留问题"似乎解释不通,比如Linux源代码是经过了几次完全的重写,其间C++已经发展得比较完善了。
回过头来想想另一件事情:
如果你经常逛一些偏开发类的论坛(比如CSDN?),并看到过那些有"纯正血统"的Java程序员的言论
你就会知道那些人如同不学无术的八旗子弟一般不堪;
尤其是他们对指针的理解,那根本就是P话,而且一点都不好笑。
这里不是想嘲笑他们有多么粗俗浅陋,毕竟没有学C不一定是他们的错。
这只是个类比,C和C++的对比,在一些方面与C/C++和Java的对比还是很相似的。
Linux之父Linus对C++嗤之以鼻,甚至因此和某人大吵一架,并毫不保留地表达了他对C++以及C++程序员的蔑视。
引用
...(Git)项目限制只用C,意味着参与的人不会捣乱,也意味着会得到许多真正懂得底层问题,而不会折腾那些白痴‘对象模型’垃圾的程序员。...所以,我很抱歉,但是对于Git这样效率是主要目标的软件,C++的所谓优点只是巨大的错误。而我们将看不到这一点的人排除在外却成了一个巨大的附加优势。...
你在学习C++的过程中可以很容易的学到如何继承一个类,可是你知道如果这个类的析构函数不是虚函数可能带来怎样的后果?你可以很容易地学到如何使用set/map,如何为它写一个简单的functor,可是你知道严格弱序化这个原则吗(Strict Weak Ordering)?
如果你不知道,没关系,这不是你的错,因为C++已经复杂到让人吃惊的地步了:STL中出现的traits和可以重载的逗号运算符都不算什么了,可是居然还能有boost这么变态的东西!甚至有人说,C++是唯一一门连语言之父都要别人教他怎么使用的语言了。
从某些角度来说,Java似乎做得更好:提供了丰富的类库以及完善的GC,你忘记了的东西通通交给它吧----可是你真的放心么?如果你知道Sandy仅仅因为String的问题就纠结了那么久,你就不会给出肯定答案了。我的看法是,Java只是把一切都变得复杂了(的确,我对Java有偏见,Sandy也是)。
最后回到C。不可否认,C标准库里的东西太少了,和现实不够接轨,不是类型安全的,只有指针没有引用也让代码看起来更ooxx... 但是仔细想想,其实C提供了一个足够简洁而完善的对底层的合理抽象,将控制一切的操作能力都交给你,让你能够不纠结于语言层面的复杂性,而将精力投入到功能的实现中去。
不要认为C不支持面向对象,不要认为这一点就限制了设计模式的使用----事实上,完全用C写就的Linux源代码是高度面向对象的,使用了令人惊叹的设计模式,达到了不可思议的效率和可扩展性。
做了这样的对比,不是想说C++和Java有多么不堪,至少从进化论的角度来说,他们都是成功的、优秀的。仔细思索,之所以Linus如此鄙视C++,并不是因为C++真的很差,而是因为C++的复杂性使得系统的设计变得更加复杂(特别是在要求高效率的地方,你用C++可能根本找不到效率损失于何处!),更为可怕的是,有那么多自以为是的程序员,以为学会了class a: public b就是学会了面向对象,以为学会了Observer模式的含义就真正掌握了设计模式,甚至以为学会了MFC就是学会了C++。如果这些人加入Linux内核的开发,那的的确确是一场灾难,而且极其可怕。
"的确有不少C++程序员贡献代码,但是反而需要核心的C程序员花费更多时间去修改和删除。"
最后,援引Linus的一句话作为结束:
引用
C最大的优点之一,就是它不会使你认为程序是什么高层的东西。
使用Google Reader的"Next"功能,然后转到了这个链接:
http://www.google.com/reader/next?go=noitems
内容是:
点击这个链接,来到了
http://www.shibumi.org/eoti.htm
页面内容是:
You must now turn off your computer and go do something productive.
Go read a book, for pete's sake.
http://www.google.com/reader/next?go=noitems
内容是:
引用
恭喜,您已到达 互联网的尽头。
点击这个链接,来到了
http://www.shibumi.org/eoti.htm
页面内容是:
The End of the Internet
Congratulations! This is the last page.
Thank you for visiting the End of the Internet. There are no more links.You must now turn off your computer and go do something productive.
Go read a book, for pete's sake.





类别: 

