续:段权限保护
by snnn119 on Jan.07, 2009, under 未分类
今天继续往下看,大概是这样,freebsd/windows/linux/solaris都没有使用intel的分段保护功能,因为分段是必须的(while paging is optional),于是采用的是intel手册中所说的”all the code, data, and stack modules can be mapped to one”的方式,且完全不使用LDT或者所有的进程(甚至包括kernel)使用同一个LDT。在intel的手册中给出了一种建议的模式是让每一个段对应一个page table,不知道为什么没有人采纳。我想,如果是这样的话,那么在传统的32位模式下(4k per page),每个page table最多容纳512个page也就是2M内存,每个地址空间将会由很多很多个段组成。
但是不知道paging为什么没有采用rwx这样的权限保护模式,而仅仅是rw,直到最近几年的产品才加了“EXECUTE-DISABLE BIT”
好多不明白的地方。求路过的高人指点
段权限保护与buffer overflow
by snnn119 on Jan.05, 2009, under windows
“buffer overflow… possibly execute arbitrary code”,安全公告中这样的话语简直就像“Ladies and Gentlemen”一样成了必备的开场白。但是我最近读intel手册的时候发现
1、intel强制程序必须分段
2、在GDT/LDT中,每个段都有rwx的访问权限控制。
我在看freebsd的loader的btx kernel代码时发现,所有的数据段都是不可执行的,而所有的代码段都是不可写的。于是,即便发生了溢出(不管是stack还是heap),那都不会导致执行攻击者的任意代码。
但貌似微软根本就没有在windows中使用这个功能,而是通过页面来进行权限管理。但是至少据我测试,从堆上执行代码是完全可以的。why?
freebsd 7.1发布了
by snnn119 on Jan.01, 2009, under Freebsd
对,就是今天,大概是这个新年最好的礼物了。
不过我倒没有什么兴奋的,我把freebsd格了,装在vmware中当玩具,于是就放心大胆的用svn中的最新的current代码了。
freebsdchina.org论坛上的关于为什么不用C++写kernel的帖子被锁了。去它的,别闹了。我就是要用C++写,不管写成啥样,总之我就是要告诉别人,I can do that!
静态库/动态库 与 单线程/多线程。
by snnn119 on Dec.29, 2008, under C/C++, Operating System
假如你正在写一个C/C++的程序,那么通常一定需要链接到libc或glibc或mscvrt.采用哪种方式链接?静态?动态?
微软这无耻小儿,原本他提供了8种crt,静态的,动态链接的,单线程的,多线程的,调试的,非调试的,并且干脆禁止混联。可微软在vc 2005及后续版本中完全删除了单线程的crt,强迫大家在多线程的环境下工作。vc并且警告大家不要在dll中静态链接crt,理由是crt的静态变量在每个实例中都有一份,比如你在1.dll中调用了srand(0),那么在2.dll中还得srand一次。谁在写exe的时候不顺手扔两个dll进去呢?于是大多数情况下,对于crt,仅剩的选择就是“debug版的多线程dll”和”release版的多线程dll”?还有,如果我在用C++标准库(vc的全称是vc++,它是一个C++编译器而不是C编译器),那么它强迫我打开RTTI。可是如果一个C的程序员批判C++慢,他一定会先从RTTI开口。
solaris也很激进,从SunOS 5.10开始它放弃了libc.a(这个比我年龄还大的东西),并把libpthread合并到libc中。
放弃静态库的理由是:
1、为了使用线程库,必须在main函数开始之前进行一些必要的初始化工作,这个被放在了动态链接的init阶段。静态库没有这个阶段。
2、静态链接的程序不知道自身是否处于多线程的运行环境中,于是编译器不知道以何种方式去实现TSS(thread-specific storage),为此,编译的时候还得加上-D_MT -DXXXXXX
3、如果一个静态链接的程序用dlopen打开一个动态链接库,前者已经装载了libc中pthread的一部分,而后者需要用到pthread于是又要载入libc.so,那么对于符号的解析将产生很大的困难。
4、如果一个单线程的静态库突然dlopen一个需要使用多线程环境的so,那么那些为了多线程而准备的初始化函数怎么办?何时执行它们?
单线程自然有单线程的好处,假如我要写一个tcp echo server这样的简单服务,那么我只需要单线程就够了,并且,大多数shell命令也只需要单线程,干嘛引进多余的复杂度?静态链接自然也有静态链接的好处,让chroot变得容易,当系统崩溃时也不至于连个sh都得不到(如果sh在/bin下而libc.so被放在了/usr/lib下但是/usr挂载失败)。
那么,聪明的freebsd是怎么做的?
在thr_init.c中定义了一个有趣的变量:
extern int _thread_autoinit_dummy_decl;
int _thread_autoinit_dummy_decl = 0;
一般而言,程序最终必然会需要调用libc的exit。而在libc的exit中放了一个这样的外部声明
extern int _thread_autoinit_dummy_decl;
由于_thread_autoinit_dummy_decl的存在,会强制的把thr_init.c中的一些东西链接进去。
于是,如果编译的时候没有加-pthread,那么_thread_autoinit_dummy_decl是一个weak object,否则,它会被放入到BSS中。(因为初始值是0,初始值不是0的才会被放入.data中)
同时,thr_init.c还放了些弱引用的声明。(_thread_autoinit_dummy_decl的存在是为了使得linker必然处理这些弱引用声明??)
pthread中的函数可以大致分为这么两类:
1、_pthread_attr_init 这样的函数。如果是多线程的程序,编译的时候一般都会定义-DPIC并链接libpthread,那么 _pthread_attr_init 这样的函数自然可以被顺利解析到。否则,thr_init.c中采用弱引用的方式
__asm (”.globl ” _pthread_attr_init)
这样定义一个符号。等待libpthread被link进来的时候替换掉。
2、至于_pthread_create这样的函数,在单线程的程序中肯定用不到。所以,如果静态链接一个单线程的程序,符号表中是没有_pthread_create的。至于初始化,则是在调用pthread相关函数的时候判断_thr_initial是否为0 来决定是否初始化线程库。
啊,还有很多很多细节我还不明白。但是快4点了,明天还得上班,先睡了
waiting for my dvd
by snnn119 on Dec.25, 2008, under 北漂
大概一两个月前吧,朝阳9剧场开始搞戏剧群英会。主策划天使猪,花业余时间搞的这个。我和他在qq群里认识,然后在蓬蒿相遇。群英会所有的参展剧目都是非职的剧社提供的,票价10-20不等。我看的第一部是《艺术》(比较差),然后看了《在变老前远去》,然后其它的都还没来得及看。周日晚去看《剧社的故事之送走生命的天使》,最重要的是,我马上就能拿到两张dvd,《死了都要爱》(其实本子是动画片僵尸新娘改的)和《我一直在等你》,这次群英会非常受关注的两部戏。并且,最最重要的是,《我一直在等你》的DVD明天将会由该戏的编剧二文同学亲自送到我公司来。售价还不够他买来回的地铁票。
顺便问一句,wow,读条读完了,但是进不去,是为什么?
rename files
by snnn119 on Dec.20, 2008, under 计算机与 Internet
我在win下用automake/libtool等写cgi的时候,遇到一个问题。cygwind的libtool在link和install模式下总是自作聪明的给可执行文件末尾加上.exe(如果以前不是以exe结尾)。而iis的性格也比较孤僻,它继承了win的传统,要求cgi-bin目录的文件必须是以.exe、.cgi等结尾的才被认为是可执行文件,才会被执行。问题是我这套代码是希望在linux下跑的,我不该在html代码中写上/cgi-bin/xxx.exe这样的东西,看起来多别扭啊,我希望我的cgi都是以.cgi为后缀名的(这样也好配置apache规则)。
问题是,在Makefile.am中加上EXEEXT=.cgi后,所有的cgi在win下都以.cgi.exe结尾了。怎么办呢?查了下man,发现有个叫作rename的小工具着实好用。
D:\cygwin\bin\find cgi-bin -name \*.cgi.exe -exec rename .cgi.exe .cgi {} ;
刷的一下,就解决问题了。
三十年河东,四十年河西
by snnn119 on Dec.17, 2008, under 北漂
小时候家住汉江边,去大桥上玩的时候,很好奇,为什么这半边河床有水,那半边河床没水。然后我爸就给我讲了“三十年河东,四十年河西”的来历。
08年很不平静,工作上也发生了很多事情,但工作上的事情我是没有勇气写到博客上来的。其实再过几年我也三十岁了,也该有孩子了。当被儿子问及这一切时,不知我会如何给他解释。后四十年的事情是怎样的?想远了,不重要。今天,我只要遵守自己的道德原则就好,河东也好,河西也好,无论浪把我推向哪边,站在河滩,再或没在水中,只要没死没伤,就该拿出宠辱不惊闲看长江东流水的态势。今天看希在宽度上写了很多,禁不住小小的感叹下,小女子尚有如此胆识,何况我须眉大汉。
第一次蒸桑拿 && 第一次撞破头
by snnn119 on Dec.12, 2008, under 北漂
游泳还是没学会,不要说换气了。连浮在水面上都不行。一吐气就下沉。蹬了一会儿,累了,去热水池泡着,和同事聊一些技术上的东西。然后来了个欧巴桑坐在我们对面瞪着我们。我们没明白怎么回事,继续聊。后来才知道她嫌我们人太多(12个人一起),和管理员叨叨叨叨了好久。话说,诺大一池子,一共才不到20个人,多吗?
今天从池子里出来的早,于是就去桑拿室坐了会儿。以前一直好奇桑拿是什么东西,以为就是北京夏天那样儿。今天第一次蒸桑拿。空荡荡的屋子就我一个人,甚是无聊。话说是要怎么蒸?穿着泳裤还是脱掉泳裤?裹着浴巾还是光着身子?是不是就是为了蒸出汗来?有什么好处?
洗完澡出来穿衣服的时候,头撞在柜子角。这是我这么大第一次把头撞出血。唉,手不该去乱摸头。还好这里服务比较周到,服务生赶紧拿来了红药水、棉签、胶贴等。而且技术很好很专业,头发一遮,什么也看不见了。
总之,破相了。头上顶着滑稽的胶布条,周末不敢出门了。好好呆着吧。
这一撞倒撞的很是好,问问自己,在经历这么一场大悲大病之后,为何竟然还没有清醒一点。
明年是本命年,愿一切安好
《麻男辣女诱惑你》
by snnn119 on Dec.11, 2008, under 话剧
上周的时候,在宽度网上我很荣幸被选中观看《麻男辣女诱惑你》的彩排,于是今天一下班就赶紧拎起电脑包往地铁站赶。路上稍稍不顺,到剧场的时候7点20,本来规定是7点半集合,但是无奈饥肠咕咕,就只好先跟组织人沙凡打声招呼然后四处觅食去。呃,可狼狈了。端着肉饼一边啃一边往剧场跑,虽说没有把饭盒带进去,但是满口姜味肉味,亲爱的落花美女、猩红美女,实在是对不住。(顺便托落花的福,今天见着了何掌柜)
回正题说。今天的演出整容非常的庞大,完全不是小剧场的风格,大概有7-9个演员吧。尽管是彩排,但是据说每个人演的都很认真。我由于老是分不清背幕的广告和前景的演员(反正不是“背靠背”就是XXX牌),所以一直处于很茫然的状态,神情恍惚。我就记得女主角脚踝很细,黑丝袜很诱人,台上总是在互赞“我爱你的腿”。我右手那边的观众很敬业,每次总是他们先笑,而且很响亮。我一般都是遇得黄段子比如谁谁谁举根黄瓜自得其乐的时候才愣一下发现,啊,该笑了,不对,不能笑。要装无知,不然显的我低俗。哼
我很喜欢那个装傻的小胖,但是顺便提些小意见:其它人的情感、动作转换是不是有些太生硬了?剧场是不大但是座位太平了,很多戏都是趴地上演的,我坐第3排,看着都困难。
景秀餐厅
by snnn119 on Dec.11, 2008, under 北漂
中戏对面的景秀餐厅,传说很有名。谁知道来历?讲讲,我最喜欢听八卦。
我吃过它家的水煮鱼,没太大感受,但是确实很好吃,另外,豆芽也确实很多。
它家的糖醋里脊我喜欢。