博文

目前显示的是 2009的博文

买了一个ndsi

今天买了一个NDSi LL。同事领我去中关村他朋友的店里买的,算下来比电玩巴士的要便宜200。比较不爽的是这个卡不支持即时存档,大大的丧失了掌机的便携性。发现一个不错的下载站:http://www.romulation.net/downloads/ 。NDS上每款已发行的正版游戏都有一个编号,我一般是先在duowan或者电玩巴士找到游戏的编号,然后来这里下载。比较可惜的是,他只有原始版本,没有汉化版。电玩巴士的ftp很慢而且老断,xunlei我又不喜欢,无奈。买回来之后一直在玩恶魔城苍月,可是越玩越累。然后就换换口味玩会儿太鼓达人。太鼓达人那个气氛啊,真是很high。

央视要进军网游界了

图片
最近整天报道网络游戏是怎么毒害青少年,网瘾成灾,广电总局出面点名批评那些低俗网游,最终忍无可忍,决定自己出手,自己招网游开发人员,自己研发自己运营。有图为证:http://www.cntv.cn/cntv/01/09/index.shtml

2009-12-27

图片
都说现如今的记者很无良。我有个学长,大我一届,叫徐新事。去年入案被捕,这个月刚宣判。http://tech.sina.com.cn/i/2009-12-21/13493695995.shtml,因敲诈罪获刑一年半。涉案之前,他虽然年纪轻轻刚来北京,却已经是这个圈内名声响当当的人物,真是让人唏嘘不已啊。其实不仅记者的嘴容易被收买,杀毒软件也是。如果你愿意把灰鸽子的代码拿来重新编译一遍然后加上你的数字签名并且给各家公司塞够钱,那你就可以堂而皇之的把它安装到各个电脑中。比如之前诺顿对winxp中文版的“误杀”,真的是误杀吗?再说我今天遇到的一个很奇怪的事情。因为很多QQ上的网友在组团聊语音,于是我就去下载YY。他们都用YY,尽管很多人根本从来不玩游戏。我第一次是用shareaza下载,刚下载完norton就报告说有病毒。第二次是用IE下载,非常正常。我把上面的操作重复了N遍,依然如此。用shareaza就说有病毒,用IE就没事。那好吧,就换一个谁都了解谁都放心的下载工具:wget。结果依然是报告有病毒。然后我继续做实验,创建了一个文件夹,并把它放在norton的监控例外中。然后等下载完成后,计算md5并和用IE下载下来的做比较。结果发现md5一致。然后,我把它从这个文件夹复制到别的文件夹,也正常。你可以重复这个实验:wget'http://yydl.duowan.com/2.0/setup/yy-2.1.2.exe'在下载进行到900K以后,按Ctrl+c终止,然后诺顿就会弹框。我的诺顿是NIS2010(正版)。你准备如何解释这个现象?

脚本语言有什么好?

除了不用编译就能执行之外,脚本语言有什么好?我今天在看groovy,就和N年之前看python一样,最终除了会写个hello world,还是什么都不会。用C++/java写底层引擎,用脚本语言实现逻辑。貌似这是非常被推荐的模式,可是我就是看不出,脚本语言在开发速度上有什么优势?尤其是面对eclipse这么强大的IDE,就算少写了几十个字符的代码,但是这要求写的时候非常细心的明白这个对象是什么类型、这个加法会不会溢出等等。

极端搞笑的调试方式

调试kernel是一件很费劲的事情。
我找到了三种方法:
1、用hlt指令。
loop: hlt
jmp loop
一但执行到这样的代码,vmware就会告诉说CPU已经被挂起。(真实环境中现象就 是死机)
通过这样的方式一点点的找到出错的代码
2、用0xB8000这块内存
0xB8000是BIOS保留的,指向屏幕。反正往这里写什么字符进去,屏幕上就能显示 什么。
于是我在我的代码中就插了很多这样的莫名其妙的代码 (VIDEO=0xB8000)
movb TMPL__XXXX_BODY_XXXX#39;c',VIDEO
movb $7,VIDEO+1
3、用gdb
只需要在vmx文件中加这么两行:
debugStub.listen.guest64 = "TRUE"
debugStub.listen.guest64.remote = "TRUE"
在vmware里运行的东西都可以拿gdb去调试。不过呢,要区分是32位还是64位的。 比如我在这里说我的guest os是64位的,但是当它真正进入64位模式之前,我用 gdb是连不上的。操作系统启动的时候,是从16位-〉32位—〉64位这样一步步走来 的。我希望在它开始执行64位代码的地方加个断点。于是我就放了个int 3在那 里。可是不管用。可能是因为之前我已经禁用中断了,idt还没设置,所以还不能 启用中断。一遇到int3,机器立马重启了。
于是我想,在main函数的开始执行个sleep(100000)也好啊。可是我压根不知道怎 么初始化rtc,更不要说实现这么复杂的函数了。
然后,我想了个很搞笑的下断点的方式。voidkmain(uint64_t magic,struct grub_multiboot_info* info){ for(int i=0;i<10000000 ;++i){ for(int j=0;j<100000000;++j){ if(j<0) goto begin; __asm ("nop"); } } begin: //.... } 果然,它停下来了。
那个if(j<0) goto begin也是个很搞笑的东西。
我本来是这么写的volat…

page size = 1G

今天看Freebsd的pmap的代码时候,发现原来某些AMD CPU支持1G的page size。你说,这该多爽啊!对于应用程序,几乎不会有用user space的TLB不命中。有没有人试过?

2009-12-11

我总是奇怪为什么我装完grub2后总是进入rescue模式。但是顺序的执行那些引导指令,都挺正常的,能启动。今天终于找到原因了。当时装的时候脚本出了点问题,我就把/usr/local/lib/grub/grub-mkconfig_lib里的make_system_path_relative_to_its_root函数改了,无论path是什么,它所在的filesystem的root directory都设置成”/”。而这个函数是用来计算prefix的,prefix变量的值是要被写入到core.img中的。我也是很偶尔的发现rescue模式下某些命令不能被正确执行是因为prefix变量不对,才想起这个的。唉,罪过啊罪过。我当时怎么这么干的啊!顺便,今天,我的U盘终于修好了。我把它装上grub2,终于在实际真实的环境中跑了一下我的os,哈哈!顺便,我发现格U盘的时候它默认采用的也是gpt格式。但是freebsd的gpart工具的add命令仿佛不能指定任意type,导致我没有办法添加类型为grub boot的分区,所以还是用mbr模式了。但是默认的分区方式在mbr后面只留了63个扇区的位置来装core.img。而我随便加点啥模块,就超过31K了。只好把它格了,重新挪了挪。

2009-12-10

真是不看不知道,一看吓一跳.没有想到多核CPU在实现加锁操作的时候会这么复杂.我最近遇到的一个BUG可能与membar有关。今天下了些paper正在看。

对于常量的优化

假如我在头文件中定义#define PAGE_SIZE 4096然后在cpp里写 int p=addr & (PAGE_SIZE-1) 。我想编译器肯定能把4096-1这个优化掉,它不会真的在运行的时候计算4096-1=4095这个值。可是假如我采用另一种方式去定义:在头文件中写extern const int PAGE_SIZE;。然后在某个.o中将它赋值给4096。我猜编译器是没有办法把那个减法给优化掉的。因为这个只有到最后一步链接的时候才能得知这个常量的值,更有甚者,这个常量有可能是通过dll动态载入进来的。而如果换成static const int PAGE_SIZE=4096。那么这个在编译的时候就能被优化掉。我特地用gcc -O2看了下确实是如此。假如在一个公用的头文件中用static const int xxxx=xxxx;的方式定义常量,链接后的大小真的会比#define的方式增大很多吗?

2009-12-06

奇怪了,内存哪里设置的有错?我在cr4里面设置了PSE选项,那么应该是2M的页面大小/\*\* 启用PAE \*/ movl %cr4,%eax \# Get CR4 orl $(CR4\_PAE | CR4\_PSE), %eax movl %eax,%cr4cr3里面的东西是这么设置的:#define PG_V 0x001 #define PG_RW 0x002 #define PG_U 0x004 #define PG_PS 0x080 //最后一级页表项这里必须设置 .align4096 // the others may not be needed, but this one MUST BE THERE .globl pml4_base // PML4 pml4_base: //都指向PT3的第一项 .rept (512) .quad (PT3 + PG_V + PG_RW + PG_U) .endr.globl PT3 PT3: //都指向PT2的第一项 .rept (512) .quad (PT2 + PG_V + PG_RW + PG_U) .endrPT2: //一个页面2M,512个就是1G i=0.rept (512) .quad (i<<21) + PG_V + PG_RW + PG_PS + PG_U i=i+1.endr理论上来讲,我将1G的内存映射满了整个64位地址空间(因高16位产生的空洞除外)。之后我在ia32-e long mode下从0x100000开始写操作,写到0x102fff的时候,我的机器就重启了。纳闷了很久我才想起来,kernel就是从物理地址的0x100000开始映射的,然后我用objdump/nm看了下,PML4就是从0x102000开始的。我猜是因为TLB有缓存,所以它在写完第一个4K页,开始写PT3的时候,才被CPU报错重启。freebsd下,elf64_exec这个函数通过bootinfo64.…

2009-12-05

今天把昨天抄来的代码改了改,精简了下,确保每行代码我都明白什么意思.下午3点出去打台球了.路上走了一个小时.然后玩了一个小时.然后中学同学喊我去吃饭,然后吃啊,八卦啊,最后去蒙着脸进豆瓣书店买了几本书回来.在进入ia32-e模式之前必须先设置PML4,我抄来的代码是用4K的页表。我想明天把它改成2M的,于是就只有3级页表结构了,好处理一些。我是这么想的,假如我有4G的内存,如果采用4K的页面大小,那么就是1M个页面,每个PTE是4字节,那么整个页表结构加起来大约需要4M内存。如果换用2M的页面,就是2K个页面,只需要8K内存。而现在服务器配备30G以上内存很常见,为什么不修改页面大小呢?

2009-12-04

最近在看grub2的代码,于是就想自己写一个很微型的kernel玩玩。于是就去读multiboot规范。可是它的最近的文档是5年前写的,而multiboot2仅仅是草稿。grub2的multiboot loader在启动的时候,也是优先查找第一版的magic number。multiboot 只是把kernel载入进内存,即便kernel是elf64,此时的机器状态也是在32位的保护模式下,并且没有开PG。之后需要漫长的过程,打开PAE、设置MSR、把cr3指向PML4、开启PG等等。我从网上抄了些代码总算是能运行了,摆脱汇编进入C语言的main函数。并且写了个hello world。这应该是我写过的最难写的hello world了。哭。在将要睡的时候,终于找到了freebsd的这段实现:/usr/src/sys/amd64/amd64/mpboot.S 依然是一如既往的精巧。明天再读吧!

关于freebsd刚刚被发现的rtld的BUG

貌似最早是在这里被公布的:http://seclists.org/fulldisclosure/2009/Nov/371问题是这样:如果一个具有setuid属性的可执行程序具有动态连接库,那么应该把LD_PRELOAD这样的环境变量先unset掉,否则会导致以新的userid执行额外的代码。写rtld的人对这一点很明确(/libexec/rtld-elf/rtld.c):trust = !issetugid(); /* * If the process is tainted, then we un-set the dangerous environment variables. The process will be marked as tainted until setuid(2) is called. If any child process calls setuid(2) we do not want any future processes to honor the potentially un-safe variables. */if (!trust) { unsetenv(LD_ "PRELOAD"); unsetenv(LD_ "LIBMAP"); unsetenv(LD_ "LIBRARY_PATH"); unsetenv(LD_ "LIBMAP_DISABLE"); unsetenv(LD_ "DEBUG"); unsetenv(LD_ "ELF_HINTS_PATH"); } 早期,4.4 bsd下的unsetenv函数是没有返回值的,必定成功的。可是后来为了与posix 1003.1-2001兼容,这个函数有了int类型的返回值用于标志成功与否。现在的unsetenv是这么实现的intunsetenv(constchar *name){ int envNdx; size_t nameLen; /* Check for malformed name. */if (name == NULL || (nameLen = __strleneq(name)) …

终于在freebsd上装上grub2了

今天把之前的 freebsd 9 current铲了。换了刚发布的8.0 release。先折腾了一会儿ipv6,然后就去折腾 grub2。其间重装N次。因为明天还要重装一次,所以先把命令留下来:fetch ftp://alpha.gnu.org/gnu/grub/grub-1.97.1.tar.gzsetenv PACKAGEROOT ftp://ftp.cn.freebsd.orgpkg_add -r bison gmake freetype2接下来就是./configure,make,make install之类的。之前我编译都困难。这次顺利多了。问题主要集中在/usr/local/lib/grub/grub-mkconfig_lib的make_system_path_relative_to_its_root 上。freebsd的readlink 没有-f参数,stat不接受-c参数。我的做法是把那些都注释掉。然后直接让dir="/"。/usr/local/sbin/grub-install --modules="ufs2 bsd biosdisk ufs2 part_msdos fs_uuid msdospart configfile reboot"只有ufs2和bsd是必须的。其实这里也可以什么都不加,反正都可以动态加载嘛。然后我把windows下的宋体传过去,拿grub-mkfont转了,最终如下:### BEGIN /usr/local/etc/grub.d/00_header ###set default=0set timeout=5### END /usr/local/etc/grub.d/00_header ###insmod videoinsmod vbeinsmod fontloadfont /boot/grub/simsun.pf2insmod gfxtermset gfxmode="1024x768x32;800x600x32;640x480x32;1024x768;800x600;640x480"terminal_output gfxterm### BEGIN /usr/local/etc/grub.d/10_freebsd ###menuentry "FreeB…

一个大胆的设想

Juniper捐献了MIPS的代码给Freebsd,如果被用在麒麟项目上,会很快使得它能够运行在龙芯CPU上。麒麟+龙芯,从软到硬,史无前例的绝配。这标志着我国计算机科技史上的又一大卓越进步。我代表我党我军提前发此贺电!

转:某朋友的签名

“神啊,救救我吧.夜夜加班,一月无休”我好几个朋友都是处于这样的状态。所谓的,“后经济危机”吗?OMG~ 一切都是借口,剥削才是根本

norton的一个缺陷

我买了正版的norton 2010,大言不惭的说,主要原因是它从2008开始,就一直没有盗版。今天它在我的thunderbird的Inbox中找到一个病毒。垃圾邮件如此泛滥,我觉得这真不是什么值得大惊小怪的事情。norton问我该怎么办,并且提示我,这个文件太大,无法备份。如果我点了清理,那么我的所有邮件就都没了。连恢复的可能性都没有。其实我把邮件保存的特别好,从00年到现在的。幸亏我在点清理之前,手动备份了这个文件。尽管如此,病毒还在,norton还会在我cpu空闲的时候偷偷扫描,然后某天趁我不注意,做同样的事情。

win7下终于有daemon tools了

昨天,daemon tools发布了v4.35.5版,其中sptd驱动更新到了1.62。我在我的win7 x64下装了,用起来很好,没有遇到什么问题

goodbye for win32

昨天下午在京东上订的内存和U盘,中午吃饭的时间送到了。反正都是刷信用卡,就当花的不是自己的钱吧。咔咔装完内存之后,进BIOS看是4G。进系统看,物理内存4G,可用2.4G。有1.5是处于硬件保留状态,不可用。一个冲动,又去重装系统了,换成了64位的win7。首先,我笔记本的所有硬件,驱动都没有问题。(指纹我没装,不晓得)。然后试了下我最需要的,建行的网银,以及ftsafe的epass 3003,都很好使。相反,我昨天在32位的win7下测试epass 3003时候,输入pin码后根本没反应。只是提示出错,也不说为什么。对于64位系统,我的概念是,除非要跑大型的数据库应用,否则根本不必要。只有当一个进程所需要超过的用户态内存超过3G的时候,才有必要换成64位系统。而去baidu搜搜,大部分人都信誓旦旦的说32位操作系统永远最多只能使用4G物理内存。回头想想,很多莫名其妙的概念都是从微软这里来的,比如ANSI代表GBK、unicode代表utf-16LE。另外发现比较恶心的一点就是诺顿 NIS 2010会把我本机的文件不管三七二十一,上传到网络里其它机器,可能是他的服务器,可能是其它用户的PC。美其名曰“云计算”,还专门统计各种应用程序的使用人数。做不出新东西,就忽悠概念。

2009-10-29

《梦幻诛仙》我做的第一款游戏,公测一周,在线人数已经轻松列入网络游戏全国前五了.所以我非常开心.最近娱乐活动也非常丰富,借了个PS3来,同事给我带了很多蓝光盘.新买了一个22寸ViewSonic液晶显示器,美中不足是中心的位置有一个亮点,在很多颜色下都发红。"托熟人的福"装完win7后发现它可以把EFS的key单独存放在智能卡上。于是就想到了找些usb key来玩

win 7装完了

win7装完了,也比较惨痛。我有一个盘专门是用来存放数据文件的,照片、文档等等,没有程序安装在这里,大概有30多G吧,在用pq合并分区的时候,弄坏了。目前发现丢失的是日记,从04年到现在的。不过也的确很久不写日记了,算了。考虑在taobao上买个诺顿2010。目前还是不知道怎么改%userprofile%这个环境变量让它指到别的地方去。

为安装win7做准备

备份数据。调整分区大小明天装win7,oh yeah!

笔记:关于以太网

以太网(ethernet)到底是什么?这个词貌似被用的很烂,难以解释。一点一点写笔记吧。首先,从带宽而言,以太网目前有10M、100M、1000M、10G。传输介质主要是coax、twisterd pair、fiber optics。大部分书上都是把802.3和ethernet混为一谈。但事实是Xerox先发明了ethernet(rfc894),IEEE后有了802.3(rfc1042)。ethernet的包,在地址字段之后,就是2个字节的type。而802.3的包,这2个字节是length。这是非常巨大的区别。802.3的包的最小长度,是根据传输速率来决定的。rfc1042规定10BASE5的最小长度是64,10M ethernet在rfc894描述,规定了它最小长度46和最大长度1500。ethernet的type字段一般都是大于1500的(但是也有例外,但是极少被触及到).关于ethernet的type的列表,可参见ieee的http://standards.ieee.org/regauth/ethertype/eth.txt。ieee不承认低于1500的会被认做type。ietf的rfc5342。简略的提了些iana的http://www.iana.org/assignments/ethernet-numbers。这个是比较全的这是我整理的一个按照传输介质分类的表:(非常不全)nameCableFull Duplex10Base5thick coaxSupported10Base2thin coax10BaseTtwisted pair,2 pair UTP Cat 3,RJ45 interface10BaseFfiber optics100BaseT2twisted pair, 2 pairs UTP Cat 3.标准迟迟未通过,很少被使用Supported100BaseT4twisted pair,4 pairs UTP Cat 3。100M ethernet中出现最早的NotSupported100BaseTX2 pair UTP Cat 5 or type 1 stp。目前用的最广的Supported100BaseFXfiber optics100VG??1000BaseLX1300 nm Wavelength,single-mode or m…

终于在solaris上把icu编译过去了

由于google的部分网站被封,所以icu的主页根本打不开,要想把icu下载下来,也花了好大功夫。像往常那样./configure,make,但是在链接的时候报错错误是:ld: 致命的: 重定位仍旧与可分配但不可写的节相反
以下是出错的时候的log
make[0]: Making `all' in `stubdata'
make[1]: Entering directory `/usr/software/icu/source/stubdata'
make[1]: Nothing to be done for `all'.
make[1]: Leaving directory `/usr/software/icu/source/stubdata'
make[0]: Making `all' in `common'
make[1]: Entering directory `/usr/software/icu/source/common'
g++-4.3.2 -m64 -ggdb -W -Wall -ansi -pedantic -Wpointer-arith -Wwrite-strings -Wno-long-long -D__STDC__=0 -fvisibility=hidden -shared -h libicuuc.so.42 -o ../lib/libicuuc.so.42.1 errorcode.o putil.o umath.o utypes.o uinvchar.o umutex.o ucln_cmn.o uinit.o uobject.o cmemory.o udata.o ucmndata.o udatamem.o umapfile.o udataswp.o ucol_swp.o utrace.o uhash.o uhash_us.o uenum.o ustrenum.o uvector.o ustack.o uvectr32.o ucnv.o ucnv_bld.o ucnv_cnv.o ucnv_io.o ucnv_cb.o ucnv_err.o ucnvlat1.o ucnv_u7.o ucnv_u8.o ucnv_u16.o ucnv_u32.o ucnvscsu.o ucnvbocu.o…

wow的这场闹剧越来越有意思

http://tech.sina.com.cn/i/2009-09-23/23253462670.shtml鉴于这种新闻很容易被咔嚓掉,复制全文如下:来源:新京报网 时间:2009年9月23日2009年9月16日夜间,本网发布的《魔兽世界或两天内开服》报道,由于本报记者依据别有用心者对中央编办有关网络游戏审批管理文件的错误解读,在没有充分理解中央编办有关解释文件,也未向网络游戏前置审批部门——新闻出版总署核实的情况下,发布“中央编办下发有关国家机关的‘三定方案’,确定网络游戏的审批、监管、执法等权力由文化部负责”等错误信息,严重干扰了国家新闻出版总署依法履行对网络游戏《魔兽世界》的审批工作。又由于忽视了某些利益公司背后的用意,在报道中援引了所谓“如果网易不发行游戏光盘、杂志等媒体产品只是运营的话,只需要拿到文化部的审批即可”等错误解读。在此,我们对上述报道给网络游戏审批管理工作造成的感受和在业界造成的误导表示诚恳歉意。对社会公众,特别是对广大网民深表歉意。背景:上周末,网易突然停掉所有魔兽服务器紧急维护,然后开服毫无前兆的开始收费运营。我说他何苦呢,难道以后不再做新游戏了?

关于完美通行证登录协议的分析

以前和同事争论过,如果为了防止密码被数据库管理员偷窃,密码的hash运算应该放在服务器而不是客户端。但是现在越来越多的网页把这个过程用JS来实现。http://passport.wanmei.com/ 。这是登录地址。通过分析该页面的源代码,可知协议流程如下:1、C->S,发起http请求,建立连接2、S->C,challenge,一个随机数r。(就是验证码)3、C->S,username,hmac_md5(r,hash(username+password))这其实就是Challenge-Handshake Authentication Protocol (CHAP) 的一个拙劣的变种。如果我不知道原始密码,只要我知道hash(username+password),一样能登录。换句话说,真正的是密码是hash(username+password),服务器必须把这个以plaintext的方式在数据库存储,或者,它必须把password以plaintext的方式存储。优点:因为认证过程未采用HTTPS,在不安全的信道上传输。这种设计方式有效的防范了playback攻击。缺点:Both the client and server must know the plaintext of the secret一个可选的改进是采用MS-CHAPv2:
首先,服务器和客户端必须知道密码的hash值,并以之作为对称密钥Kab
1、C->S,建立连接
2、S->C,16位的随机数r1
3、C->S,生成一个16位的随机数r2。{r2,{hash(r2,r1,username)}Kab}
4、S->C,解密上一步的报文,如果成功,发送{r2}Kab

开发环境搭建完毕

我把emacs卸了,这个我爱了5年的baby。因为我觉得我目前用的这个桌面环境还是很稳定的,所以很少会用到控制台.事实是我根本不知道怎么切到控制台:-(
而在图形界面下,gedit已经很好用。虽然它不支持正则表达式搜索虽说它不能定义宏。唉…eclipse+cdt真的是很不错的选择。只是opensolaris自带的gcc太老了,还是3.4.x。虽说这是gcc所有版本中用的最广泛的,但是…毕竟太老了。IPS中有4.3,其实我在freebsd下已经在用4.5了。但是遗憾的是gcc 4.3和gdb 6.3貌似很不兼容。所以必须自己编译gdb 6.6。不过编译的过程是很顺利的,第一次采用默认的prefix,顺利的就过了。第二次装在了/usr/下,但是它错误的把libexpat.so找在了/usr/lib,其实我加了-m64,应该去/usr/lib/64下找。我没仔细去看为什么这个会和prefix有关。总的来说,就是eclipse 3.4.2+cdt/gcc 4.3/gdb 6.6/gmake/sun ld。另外,发现一个很有用的宏:_GLIBCXX_DEBUG,其实它历史已久,反正3.4.x中就有了,但是我今天才发现。关于它的详细描述可参见http://gcc.gnu.org/onlinedocs/libstdc++/manual/debug_mode.html一个例子是如此:#include <iostream>#include <string>intmain(void){ std::cout << "hello" << std::endl; std::strings("abc"); char c=s[20]; return EXIT_SUCCESS; } 如果不加_GLIBCXX_DEBUG,它会顺利运行到main结尾并return 0。如果加了,在s[20]那里会抛异常(行为很像std::string.at)hello
/usr/lib/gcc/i386-pc-solaris2.11/4.3.2/../../../../include/c++/4.3.2/bits/basic_string.h:721: typename _Alloc::rebind&l…

write cache的问题

freebsd 7.x下一种流行的做法是,用ufs做root filesystem,用zfs做数据盘存放应用相关的数据。比如delphij就讲了诸多理由为什么zfs不适合用来做根。可是如果你采用了ufs做/,那么他也会建议你关掉write cache/soft update以提高稳定性。但是zfs又建议你打开它。可是假如只有一个硬盘(比如90%以上的笔记本用户),那么write cache是开还是不开呢?总的来说,把zfs和ufs放在同一块硬盘上并不是一个好主意。但是如果光为了做根而浪费掉一块硬盘(其实只需要1G就够了),又太奢侈。不知道solaris是否支持从raidz组成的zpool上启动。对于freebsd我觉得这是一个很大的挑战。因为mbr中可用的空间只有446字节,对zfs对支持只能放在boot1/boot2去做。我的想法是将这2个东西用dd在每个硬盘上同样放一个,让boot2能识别raid0和raidz,我觉得是可以做到的。

opensolaris是一个混合64位环境

opensolaris的安装光盘不像freebsd和ubuntu那样分成64位版和32位版,而统一提供一张光盘。也不区分install cd和live cd。按他的说法,是可以自动识别64/32位环境。但只是kernel是这样的。实际上它所提供的大部分的应用软件、以及默认的桌面环境gnome,都是在32位下编译并运行的。甚至gcc,如果默认不加-m64参数,那么也是按照32位的目标进行编译。除了opensolaris 10外,64位的solaris我只用过solaris 10。情况也是如此。
这样好还是不好呢?我记得曾有一场争论,ls这样的命令是否需要提供64位版?其实如果不是技术的狂热者,站在用户的角度来看,他最希望的是kernel具有64位的执行能力,并且应用软件像32位平台那样稳定和丰富。如果64位的winxp也仿照这样的思想去实现,那么32位的winxp现在肯定已经彻底被淘汰了。
不过这也造就了一个传奇,32位xp版本的windows操作系统,在PC机上统治市场了8年,并将继续下去。还会有哪个版本有如此辉煌吗?

opensolaris的iwh驱动貌似很有问题

opensolaris很强大,一下子就认出了我的无线网卡,AGN 5100。但是这个驱动貌似很有问题。我在solaris下ping www.sina.com.cn 和 bbs4.newsmth.net 丢包率都是32%-35%左右,ping值在30ms左右。从国外某网站下源代码,也是时短时续,速度仅为几K或几百字节。切回来换成windows,然后继续ping,发现一个包都没有丢。ping值在7-10ms左右,偶尔会突然出现特别高的170ms左右。

opensolaris体验中

今天早上刻盘,安装了opensolaris 2009.6。安装的过程异常简单,zpool的创建、swap的大小这些全都没有给我手动选择的机会。驱动很全,该有的都有了。起码bluetooth和wifi是有了。指纹识别和摄像头这两个千古不用的设备,据说也有驱动。
首先把eclipse装了,还有gcc-4.3以及gdb 6.3。然后故意写了一个简单的C++的程序让它崩溃。int* p=NULL;*p=0;然后用gdb调试。发现,用gdb载人core dump的时候,gdb自己down了。每次都是如此。执行在gdb里运行这个程序,结果也是如此。于是我根本看不到崩溃的时候的堆栈。
我的AGN 5100尽管是有驱动了,但是还是没连接上路由。我不晓得哪里设置错了。我把路由已经改成wpa/wpa2都支持,TKIP/CCMP都支持。在solaris下用dladm scan-wifi能找到。但是connect的时候总是timeout。
root@opensolaris:~# dladm connect-wifi -s wpa -k wkey -T 80 -e scmdlink iwh0
todladm: cannot connect: operation timed out
明天把wpa的密码改短点再试下。
装了ntfs-3g,挂载的时候系统卡死,然后自动reboot了。
困了。安~

everything has lost

在经过长达9个小时的zfs scrub之后,我的freebsd的zroot pool并未能从病态中恢复。zfs scrub只是帮我找出了数千个无法被读取的文件,把这些文件删除或者zfs clear都无济于事。/var/log/message依然是被zfs无数的IO error掩盖。
我发现我的freebsd分区的CHS参数不对,于是就切到windows下读出正确的CHS参数然后用U盘启动然后bsdlabel -A -e修改。我不仅修改了CHS相关的东西,我还把zfs分区的大小也改了,改长了一点,以让它恰好是按柱面分割。
结果是,loader依然能读出zpool里面的文件,但是mount root失败并且我从U盘启动的系统中也无法正确的zpool import。说这个pool已经彻底坏掉了。这个pool的device name也不是我所设想的/dev/ad4s4a,而是/dev/ad4s4ca。我一直不明白为什么gpart show有时候会多出来一个ad4s4c。总之gpart show的输出很不稳定。要让它稳定,方法一直就是开机后等待2个小时后再运行这个命令。
最终我用gpart delete/destroy彻底清理掉了这个主分区,然后重建。然后发现bsdlabel的CHS参数是正确的。然后,gpart又时不时的捣鬼,经常说找不到ad4s4这个geom。我实在烦了。回windows删掉了这个分区。
然后去vmware下用iso在腾出来的那个空闲分区上装了一个opensolaris 2009.6。但是发现它只能在vmware下运行。
grub修改参数,去掉启动画面。给kernel加-v.
发现是mount root的时候失败了,zpool没有找到。
刻盘ing。。。

zfs scrub中

图片
本来想拿上个月做的那个U盘启动freebsd然后进行scrub,但是无奈的是那个U盘被我弄丢了!再也找不到了。上周2还用了的。 于是我就用vmware启动一个曾经的freebsd8,然后把那个分区挂上。漫长的等待 Apple在它的最新的操作系统Snow Lepard中放弃了zfs. Why?

为什么palm pre在国内卖的如此便宜?

想托一个武大的朋友在US帮我买一个palm pre手机。在bestbuy查了一下,带plan的是199$,不带plan的是750$.既然是带回来用,那么应该买不带plan的吧?但是国内的才卖2000-2500RMB啊。这个……是怎么一回事情?

求助:zfs 损坏

我硬盘的最后一个主分区上是一个freebsd类型的分区。然后它被分成2个slice,一个是16G的zfs,还有一个是4G的swap。
最近频出两个错。一是dmesg不停的报告说从硬件检测到的CHS和slice中配置的不一样:
Aug 30 14:09:33 scm kernel: GEOM: ad4s4: geometry does not match label (255h,63s
!= 16h,63s).
在win下用everest看,H应该是16。但是在bsd下用bsdlabel -A看,H是255。而且,我不晓得,为什么必须要加-A才行。我当时是用gpart分的slice啊。
另一个比较严重,部分文件读取失败。/var/log/messages此时有很多这样的错误信息:
Aug 30 14:09:27 scm root: ZFS: vdev I/O failure, zpool=zroot path=/dev/ad4s4a of
fset=18063360000 size=65536 error=5
Aug 30 14:09:27 scm root: ZFS: vdev I/O failure, zpool=zroot path=/dev/ad4s4a of
fset=18063391744 size=3072 error=5
Aug 30 14:09:27 scm root: ZFS: vdev I/O failure, zpool=zroot path=/dev/ad4s4a of
fset=18063391744 size=3072 error=5
Solaris: WARNING: metaslab_free_dva(): bad DVA 0:17993136640
Solaris: WARNING: metaslab_free_dva(): bad DVA 0:17993146368
Solaris: WARNING: metaslab_free_dva(): bad DVA 0:18000989696
Solaris: WARNING: metaslab_free_dva(): bad DVA 0:18000993280
Aug 30 14:16:55 scm root: ZFS: vdev I/O failure, zpool=zroot path=/dev/ad4s4a …

palm pre偷偷上传用户数据?

前几天被palm pre弄的心痒痒,十分想去买一台,连电信帮忙写号的人都联系好了,153的号也选了,末尾几个数字是某人的生日。然后……看到一则传闻,说palm pre偷偷上传用户信息到palm的服务器。http://kitenet.net/~joey/blog/entry/Palm_Pre_privacy/ 最敏感的,它连当前GPS位置这样的也上传,这就意味着总有一双眼睛偷偷的看着你今天去过哪些地方,用手机干了什么——它会记录下你今天用过那些手机软件,每个使用了多少时间。 这个……实在是太过分了

2009-08-26

今天在freebsd 9下把gnome的基本部分编译完了。scim、gnome-session、gnome-terminal、metacity、nautilus这些最基本最常用的东西都有了。但是遗憾的是发现显卡驱动貌似有问题。我只是如此猜测。现象是,启动Xorg之后,Xorg自身会占很高的CPU(80%以上),而且大部分都在kernel态。这个现象比较随机,有时候是Xorg,有时候是某个X程序比如gnome-session比如scim。今天更新kernel又编译了一次,还是如此。闷~另外,dtrace还是没有搞定。kldload dtrace成功,但是kldload dtraceall失败。说是需要加载dtnfsclient,但是我的kernel config中本来就没有把nfs client编译进去,不晓得为什么dtrace这里又需要了。加载nfsclient成功,但是加载dtnfsclient失败,说是找不到某某符号。奇怪啊奇怪啊!我哪里的编译步骤出错了?怎么会出这种情况。因为没有无线网卡驱动上网不方便,改天再把详细的log贴过来。

zfs only

之前在vmware下尝试过安装一个gpt格式的zfs only的freebsd,因为总觉得慢,想把它迁移出来。在/boot下很早以前就发现有一个叫zfsboot的工具,但是我一直不晓得怎么用。今天在wiki上发现一篇介绍这个的文章 《Root on ZFS configuration (zfsboot)》,决定试下。上次我拿我那个128M的U盘在UFS的基础上做了一个精简版的freebsd,今天又用wget从ftp下载了安装光盘的base目录,然后用它启动我的thinkpad t400,安装bsd。我并没有严格按照wiki上说的去做,于是遇到了两次失败。第一次是boot0选完主分区之后就提示Boot Error。查zfsboot的源代码,在btx loader部分发现是因为它没有在分区表中找到类型为freebsd的主分区。呃……我是拿PQ分的区,然后用gpart分的slice,PQ分区的时候无法把主分区的类型设置成freebsd,之后一直也忘了这么做。结论:如果没有在mbr中给分区设置正确的分区类型,完全可以正常的使用这个分区,只是无法引导而已,boot2会报错。接着,用gpart modify 分区类型后,顺利走到了mount root filesystem的地方。然后卡住了。据我推测,可能是因为zpool的状态不对。事情是这样的,这个U盘在虚拟机里面用过。我曾在虚拟机里建过2个zpool。一个名为syspool(在虚拟机的虚拟硬盘上),一个名为zroot(在物理硬盘的第四个分区上),两个都不是位于这个U盘上。之后拿这个U盘启动我的笔记本,最初一切都正常,只有zroot一个zpool。后来某次,我删除了zroot下所有的zfs,然后重建zroot.重启之后我发现zfs list为空,然后zpool list中出现了2个zpool(syspool和zroot),并且状态都是不可恢复的错误态。我把这两个destroy掉之后,再执行zpool import,然后就可以把zroot正确的import进来。执行zpool export zroot && zpool import zroot,然后重启,问题依旧。胡乱折腾了几次之后,突然就没再出现过这种异常了。

员工的隐私算什么?

我现在所任职的公司,最近做了2件很令人发指的事情。先是强迫每个员工填写4页的个人信息表格,其中包括家庭成分、婚姻状态、父母的姓名、父母的工作单位、父母的手机号等应被视作个人隐私的东西,甚至还要求填写在上家工作单位的职位和具体的工作内容,我认为这是极为违反商业道德的。重点在于,你是强迫别人告诉你这些。如果换成自愿,倒是无可厚非。第二件事情就更令人匪夷所思了。公司正在每台办公电脑上部署一种类似于绿霸的软件。据某员工反映,这个软件能按管理员的需求进行实时截屏,以及其它一些更高级的监控。这些家伙,花点时间提高内部网络的安全性好不好?给公司的机器做做安全审计帮系统打打补丁吧,或者对ssh权限提供更安全的、集中式管理。人都说吃一堑长一智,不晓得这些人在惦记什么!

2009-07-30

今天把 emacs 从23.0.x升级到了23.1.x,另外把/tmp换成了tmpfs。我在想,除非你的机器上只有 zfs 一种文件系统,否则fstab还是很必要的。tmpfs、proc这些既然早已被linux用户习惯,必然有它们的优势。tmpfs的出现,是否就意味着/etc/rc.d/tmp可以被干掉了呢?我还没有看过tmpfs的实现,不知道它与直接mount_md到/tmp,有什么区别。以下是今天读ffs写下的一些笔记:man fs说:从 BBLOCK 开始,大小为 BBSIZE (单位是字节)的是disklabel以及引导程序。(我找不到BBLOCK这个宏的定义。)按《Freebsd设计与实现》的8.9节中所说,ufs1中,BBSIZE的大小是8K。ufs2中,BBSIZE的大小可能是0,或者8K,或者64K,或者256K。
我只读的懂i386 的实现。它是这么做的:
在boot0的末尾,它调用bios的int 13h中断,使用42h或者20h从主分区的开始读一个扇区到内存,然后跳转到该位置开始执行。但是boot2的大小是7.5K,它是如何做完剩下的事情的呢?按《FreeBSD Architecture Handbook》的1.5所说,boot1是用于从floppy引导。我观察的结果是这样的:boot2是用btxld链接得到的。传递给btxld的-l参数的就是一个512字节的空文件(boot2.ldr),目的是预留512字节的空间用于存放disklabel,所以/boot/boot2的前512个字节是zero。用cat命令把boot1和boot2组合到一起得到/boot/boot,然后用bsdlabel -B 写入该主分区的开始。boot0最后读到的那512字节就是boot1。接着,boot1从这个主分区的开始读16个扇区(也就是8K)到内存中。这8K包含boot1,然后512字节的disklabel,然后是boot2真正的代码。
至于这512字节的disklabel数据如何解析,在/usr/src/sys/geom/geom_bsd_enc.c的bsd_disklabel_le_dec有详解。它的末尾包含一个分区表,指明了每个label对应的文件系统的开始扇区以及大小。
真正的文件系统是从SBLOCK开始。最前面是大小为SBLOCKSIZE的main superb…

终于把oblivion完整版下载下来了

图片
The.Elder.Scrolls.IV.Oblivion-RELOADED.iso,一个4G的iso,用驴子拖了3天终于下载下来了。不是免CD版,运行的时候还需要把这个iso放入到虚拟光驱中。然后去网上下patch,从1.0往1.2升级,但是失败了。尽管我的oblivion.exe是原始的,但是oblivionlancher.exe是被修改过的,所以补丁只打了1/3就终止了。但是进游戏后看,版本后已经是1.2了。意思就是,尽管打补丁的中途失败了,它并未把操作回滚。呃,也不知道这样继续玩下午有什么危害,反正先玩着吧。开始的时候把分辨率调成和桌面一样,1440x900,但是太卡了,于是就1280x1024,把hdr打开关闭掉反锯齿。继续以前的剧情往下做。把那4本书的每个章节的首字母拼起来是一句话:“GREEN EMPEROR WAY WHERE TOWER TOUCHES MIDDAY SUN”.尽管我找到了那个塔,但是第一次去是午夜(我对midday的错误理解)。于是图案是暗下去的回旅馆,睡到中午再来。等啊等,从11点33等到11点50,终于出现了对这它按空格,任务往下继续可惜,查攻略来回切换,然后游戏卡死了,据说这是个无解的问题。可我记得以前那个版本没有这个问题,但是以前那个版本是没有语音的,而且字幕速度超级快,我这种英语小白根本看不完对白,对话框就关闭了。呃……为啥切换老死呢。

又是空指针惹的祸

(以下纯属一派胡言)虽然在C99的文档中写,”The macros are NULL which expands to an implementation-defined null pointer constant; and…”.文档中说,实现者只要保证任何一个有效的对象的指针、函数指针都不等于NULL,至于它实际等于哪个整数,那是由实现者来决定的。可是如果NULL不等于0,if(fp) fread(buf,1,nbytes,fp) 将是一段看起来很奇怪的代码。它会正确吗?几乎所有人都默认,如果p==NULL,那么*p一定会导致程序崩溃,后面的代码不会被执行。可这依赖于OS和CPU将地址空间最底端的那个页设置成不可读。下面这样的代码有效吗?struct dirent p=NULL; char* name=p->d_name; 如果你认为它无效,那么freebsd下offsetof的实现将是极度令你吃惊的:#define __offsetof(type, field) ((size_t)(&((type *)0)->field))我把C99的文档仔细的翻阅了一遍,它没有说这样不可以。然后我再查了下vc9的stddef.h,它也是用同样的方式实现的。可我们过度聪明的gcc 犯糊涂了:
http://patchwork.kernel.org/patch/34190/struct tun_file *tfile = file->private_data; struct tun_struct *tun = __tun_get(tfile); struct sock *sk = tun->sk; unsignedint mask = 0; if (!tun) return POLLERR; linux的某个版本的gcc在优化的时候,把if那句给优化掉了!理由是tun这个指针在前面已经被用过。我写了段测试代码:#include <locale.h>#if defined(FreeBSD)#include <sys/dirent.h>#else#include <dirent.h>#endif#include <stdio.h>#include <st…

奥运带来的转变

7.13。某人的生日,以及北京申奥成功纪念日。
眼看一年过去了,且不论鸟巢四周是否已长遍荒草,奥运给北京带来改变有:
1、一进地铁,就有人对你喊大包小包一律安检。那X光机多久清洗一次?
2、邮局依然不能寄电脑
3、07年,清华、北京先后打开校门,欢迎个人以及旅行团自由进出参观(重要建筑除外)。到了08年,为了迎接奥运,纷纷封校,挨个查证件。至今,北大依旧如此

单向街要搬走了

图片
06年,从武大一位同学(FanTing)那里得知单向街,那时,在我的想象中它该是一条斜斜的小巷子,距巷口三分之一处,有个老房子,里面卖书,还住着一个活着的作家,叫许知远。那时我并不知道许知远是谁,微软输入法不包含这个词,所以你不可嘲笑我的无知。啊,如果你去过那儿,那你刚才一定笑了。后来我背着大包小包,来到皇城,在圆明园墙外扎根住下。单向街圆明园店,自然成了我最常去的地方之一。在那我听过春树,格非的访谈,听过数次严峻的现场演奏,许多许多诗人的朗诵。我喜欢那里的石子路,翠绿的庭院,镜面小桌,关键是,那椅子坐起来非常非常的舒服。后来才得知,那店里的几个老板,和我是同行,同时,我们两家公司,也是业界里出了名的死敌。那里书不值得一买,但是我在那里看了两部音乐剧,是我看过的最美的两部:法国版的《罗密欧和朱丽叶》,以及《小王子》。目前我书架上只有2本是在那买的,一本是《偏见:CBS知情人揭露媒体如何歪曲新闻》,还有一本亨利米勒的小说。可在我心中,北京没有什么书店,可与万圣相比。p.s.今天忘了网址,去google求解,可,险些不敢进来

手动安装freebsd

上周在newsmth上和intron商量说准备做一个freebsd安装程序,既然打算着手做这个,那么弄明白freebsd的安装流程,是必要的。今天是拿了一个空闲的U盘做实验1、初始化硬盘分区表
fdisk –BI da3或者 gpart create -s MBR da3 ,然后gpart add –b xxx –s xxx –t frebsd-ufs da3
需要做两件事情,初始化硬盘分区表,把boot0填进去,把freebsd所在的主分区设置为bootable2、初始化disklabel
bsdlabel -B -w da3s1 auto
写一个标准的label到da1s1,并且把boot2放进去3、初始化ufs2文件系统
newfs /dev/da3s1a4、挂载,放置引导程序和kernelmkdir –p /mnt/usb mount /dev/da3s1a /mnt/usb mkdir /mnt/usb/boot 因为boot2之后是loader,所以需要把loader、loader.4th、support.4h、loader.rc、defaults/loader.conf 复制过来。
重启了一遍,发现成功了,继续放kernel
建一个kernel文件夹,把/boot/kernel/kernel复制过来,其它的暂且不要
再次重启,发现走到挂root fs的时候停了。需要手动输入ufs:/dev/da0s1a继续。呃……难道是因为没有/etc/fstab ? 不管。往下继续走,开始到用户态了,找不到init5、放用户态程序
经我试验,实际只需要2个。/sbin/init和/bin/sh. 因为/bin/sh是动态链接的,所以我从/rescue复制了一个过来。但是/dev目录必须得有,不然没有devfs,走不到sh这一步。大功告成!实际上,loader不是必须的。真想砍掉它,forth那套东西真是烦人。如果是试图从win下最小安装一个freebsd,那么只需要boot2、kernel、init、sh一共4个东西就够了。我的想法是,在winxp下做个小工具完成一个最小化安装。然后用户切换到freebsd下,用pkg_add和sysinstall完成其它事情。最小化安装freebsd需要多久呢?我以前的纪录是大约50秒(包括重启),我想再突破。

2009-07-05

加班到没有末班地铁实在是一件很痛苦的事情,没有报销打车费这一说。这年景,能有份工作,不错了。
今天看到log4j支持jms,就好奇的下了apache的ActiveMQ来用。其实本来SUN的J2EE本身就带一个MQ server,但是下载太慢了,我放弃了。然后,被ActiveMQ虐了一下午。
首先是datasource的问题,我配置它执向mysql,但是我的mysql的innodb存储过程的隔离级别是read-uncommited,最低的那个,被ActiveMQ鄙视了,好吧,改。之后又因为binlog的格式是statment,又被鄙视,改成row.终于启动成功。然后在另外一台机器上用log4j去连,可是…… 总也不成功。先是缺jar包,因为我的程序是j2se的应用,所以我就去下jms.jar,然后又报缺这缺那,log4j的jms的文档更是简略的让人抓狂。
在网上找了这样一段配置贴进去
log4j.appender.jms=org.apache.log4j.net.JMSAppender
log4j.appender.jms.InitialContextFactoryName=org.apache.activemq.jndi.ActiveMQInitialContextFactory log4j.appender.jms.ProviderURL=tcp://jmsserver:61616
log4j.appender.jms.TopicBindingName=dynamicTopics/locallogging
log4j.appender.jms.TopicConnectionFactoryBindingName=ConnectionFactory
不说缺jar包了,但是结果和楼主一样,遇到这样的异常:
java.io.IOException: Wire format negotiation timeout: peer did not send his wire format
鉴于ActiveMQ的默认格式是openwire,并且我在server的配置文件中确实也是这么配的,于是我就在ProviderURL中强行加上wireFormat=openwire,但是client又继续报告说找不到xxxx class的错。啊!!!!
我在想我毕业后的第一个项目,在我看来,它的核心就是一个MQ。只…

libxcb-xlib.la not found

我机器上现在安装的版本是xcb-1.3。libxcb-xlib.la是xcb 1.1里带的一个东西,后来被删除掉了。但是/usr/local/lib下很多.la里面还写有这个文件,于是我在编译gtk的时候链接不过。我去/usr/local/lib下手动把这些删掉了,然后用ldd看了下刚改过的这几个la的对应的so,没见谁缺东西。先这样吧总之,ports系统有时候很不好用!如果它强迫我重新编译、安装那些库,问题就没了

AllowEmptyInput

不晓得从什么时候起,xorg中多了AllowEmptyInput这个选项,而且默认是打开的。一旦这个选项启用,它就会忽略xorg.conf中驱动为kbd和mouse的设定(但是vmware的vmmouse不会被忽略),并尝试使用hal来自动检测鼠标键盘的配置。事实是我不知道我已经装了hal和dbus,更不知道如果没有启动它们将会导致xorg找不到鼠标键盘(尽管我已经在xorg.conf中手动指定了)从邮件列表(freebsd-x11)中摘一段话:“As I understand, currently user is required to do one of following:Make sure hald is running (if xorg is compiled with it)Add AllowEmptyInput "0" to xorg config otherwiseThus, extra action is ALWAYS required from user.”

如何在C语言中输出int64_t?

假如,现在有一个64位的整数,需要被输出到stdout或者某个文件里。该怎么写?先毙掉一个:
int64_t i=9;
printf("%lld\n",i);GCC会报警。warning: format '%lld' expects type 'long long int', but argument 2 has type 'int64_t'。传说这个警告已经在gcc中存在了15年以上,但是我在linux以及cygwin下编译并不会报告这个,在freebsd下会(我在amd64的8-current上测的)相比而下,C++的ostringstream简直万能的完美无瑕。但是……我还是希望能找到一个简洁点的方案。

被支付宝流氓了一把

因为最近机器里多了很多软件,上周打开SysinternalsSuite的autoruns查看下有没有什么多余的东西。发现支付宝的一个驱动是开机自动加载运行的,我想,支付宝我一个月也用不到一次,况且,这种驱动肯定是会监听键盘,干嘛呢!犹豫是删掉还是改成手动启动,最后选择了后者。昨天诺顿防火墙竟然意外死了,于是我强关了机器,然后重起。结果发现,在启动xp前键盘还是好的,但是xp启动后,键盘彻底不能用,touchpad也不能用,小红帽也不能用。幸好我有外接的鼠标,这个可以用。但是外接的键盘还是不能用,无论如何我都没有办法输入用户名密码进入系统。之后试了很多方法,包括命令行的安全模式,也不行。万分绝望,准备找xp安装盘进故障恢复台。这个时候突然想到,可以试下启动F8的时候选最后一次成功配置。因为后来尽管数次都启动成功,但是没有登录也没有进行任何注册表修改操作,所以它保存的应该是我修改驱动之前的配置。果然,成功了。接下来,在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet下面搜alipay,然后在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{4D36E96B-E325-11CE-BFC1-08002BE10318}的UpperFilters那里找到了它,干掉,只留下原始的kbdclass和我的vmware的vmkbd。哈哈,世界清静了。之后HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services也把alipay删掉,重启,一切ok.支付宝照样可以登录。只是我没明白为何它做的这么狠。因为它在键盘的upperfilters中,所以它没有启动就导致系统根本收不到任何键盘输入?

icu貌似被国家防火墙拦住了

icu-project.org报告302,指向了site.icu-project.org
我在北京网通用nslookup查的结果是
Non-authoritative answer:
Name: site.icu-project.org
Address: 74.125.47.121而在国外一个dns查的结果是
Non-authoritative answer:
site.icu-project.org canonical name = ghs.google.com.
ghs.google.com canonical name = ghs.l.google.com.
Name: ghs.l.google.com
Address: 209.85.171.121按推测,icu把它的项目主页托管在了google的GAE上。所以……还好的是,下载页面还是可以打开的http://icu-project.org/download/4.2.html

如果释放一个mutex之前并未获取它?

ACE_Thread_Mutex m; m.release(); //如果此时没有任何线程拥有这个锁?ACE_Thread_Mutex在linux/unix下一般用的pthread_mutex_t来实现,按man手册来说,如果发生这种情况,pthread_mutex_unlock将会返回一个非0的值EPERM:"The current thread does not hold a lock on mutex”.但是在windows下情况就很不一样。它调用的是LeaveCriticalSection,按msdn所述,此时不会有任何错误,但是当另一个线程试图调用EnterCriticalSection的时候,将会陷入无限的等待中。按我所测试,不仅是另外的线程会如此,错误的调用LeaveCriticalSection的线程再次调用EnterCriticalSection 也会如此。啊!昨晚我为了这个一宿没睡好。昨晚为了调试一个timer,写了段简单的测试代码。intACE_TMAIN(int argc,ACE_TCHAR* argv[]){ int counter=0; time_t startTime=time(NULL); ACE_Thread_Mutex m(ACE_TEXT("mutex1"),NULL); ACE_Condition_Thread_Mutex mutex(m); while(1){ ACE_Time_Value tv=ACE_OS::gettimeofday()+ACE_Time_Value(1) ; //m.acquire(); mutex.wait(&amp;tv); time_t sec=time(NULL)-startTime; double v; if(sec !=0) v=counter++/(double)sec; //m.release(); } return0; } 我在调用条件变量的wait之前没有acquire相对应的mutex,而ACE_OS::cond_wait在调用WaitForS…

postgresql自身没有连接池?

今天在看postgresql的startup部分的代码,发现它采用的是process per connection 模式,每新来一个tcp连接就会fork一次(即便此时还没有进行身份验证)
首先,如果把postgresql的端口暴露在外是多么的可怕。在win下,每个postgresql新fork的进程占10M左右内存,那么200个就是2G,400个就是4G,攻击者只需要不断的完成3次握手,服务器很快就会因为这个而内存耗尽。在配置文件中改小AuthenticationTimeout的值(默认是60秒),貌似是唯一的解决办法。另外,如果采用长连接,我觉得那么采用ldap查找连接参数的意义并不大。
在上家公司用mysql集群的时候,DBA的建议是不要用长连接,因为他会试图给每个连接分配非常大的buffer并限制最大连接数,前者会显著提高检索效率。这些buffer所占的内存,在连接建立的时候被分配,在断开的时候释放。所以如果没有专门的连接层做连接池,不要使用长连接。而且这样程序也非常好写。而且mysql是在它自己内部做的process。
可如果是像wordpress这样的简单的php应用?怎么再搞一个连接池?
我正在看apache的dbd,还没看懂

阅读postgresql

反正我就是喜欢freebsd/berkeleyDB/postgresql,大概是因为它们共同的血脉以及BSD方式的授权。前几天下了postgresql的代码,本来准备用vc编译,然后发现要装perl,而且必须是windows版的active perl而不能是cygwin perl,而且PATH中不能有cygwin的东西,并且还有很多很多需求,于是我放弃了。我在vc下用别人预编译好的库写应用,唯一的担心就是crt版本的问题,我用的是多线程调试DLL,而它不知道当时是和什么链接的,而且那个是vc71的库,而我用的是vc9。尽管postgresql不建议使用cygwin编译运行,但是我不想装mingw之类的,就还是这么弄了。configure/make/make install一切顺利。但是运行的时候有特殊要求,必须事先启动cygserver,然后将环境变量CYGWIN设置成server,否则启动会报bad system call(在请求SystemV shared memory的时候)。可是我不想再用emacs写代码了,我喜欢eclipse。eclipse中编译调试都很方便。但是我不知道为什么我在启动的时候,就会在ntdll.dll中连续停下来几次,而显然我没有对应的源文件用来加断点,我怀疑是遇到signal了,但是我在eclipse/cdt中没有找到与signal相关的设置。更郁闷的是,尽管eclipse在调试程序的启动参数中支持设置环境变量,但是这个环境变量是windows的环境变量而不是cygwin的shell的环境变量。我在这里尝试设置了CYGWIN这个环境变量,但是在程序中用getenv(“CYGWIN”)得到的却是NULL。不晓得该怎么办,于是总是启动失败。之所以选择postgresql的代码来读,是因为我觉得它的注释写的很详尽。代码风格很普通工整,而在每个函数开头都详细的描述了用途,在每个特殊实现的地方都详细说明了为什么这么做。但是,随便扫了几眼,就发现一些我觉得不够好的地方,例如:1892: if (cvc)
1893: free(cvc);前面那个if判断完全是不必要的。还有这样的:postmaster.c
817:for (i = 0; i \< MAXLISTEN; i++)
818: ListenSocket[…

mysql 6.0对unicode的支持有很大改善

mysql 5.1 rc了一年多才发布,就这,大牛们还因不满SUN的草率而拂袖而去。6.0什么时候能发布呢?加上oracle对它不明不白的暧昧态度,估计更是遥遥无期吧。
mysql 5.x
mysql 6.0


unicode 3.0
unicode 5.0


不支持增补字符集
支持增补字符集

ucs2/utf8,utf8最长3个字节。
以前的utf8被更名为utf8mb3,新的utf8支持4个字节,并增加了对utf16、utf32的支持

如果不使用增补字符集,那么根本没有必要给java程序员费尽心思的讲String.length()计算的是内存的大小而不是实际字符的个数。可这么折腾来折腾去,不就主要是为了照顾中文以及那些深受汉字影响的东南亚语系吗?可中国人貌似一点也不关注这个。

我决定用icu换掉iconv

基于如下几点理由,我决定用icu换掉iconv1、跨平台gnu iconv 1.13在它的README中写到:“Building requires the mingw or cygwin development environment (includes gcc).MS Visual C/C++ with "nmake" is no longer supported.”既然它这么傲慢的抛弃了vc,那我也只有放弃它。icu支持所有我常用的平台:win/linux/freebsd/solaris2、版权gnu iconv也顺应潮流的采用了GPLv3,这个令BSD和GNU之间陷入无限争吵的东西。而icu采用的是一个类似于bsd的版权协议,更加开放自由。另外,icu还有如下几点好处:3、易于上手大部分vc程序员都是采用宽字符(utf16)编译、链接,而java用户更是没有选择的采用了utf16be。相对用过vc和java的人,icu的字符处理方式非常容易上手,况且,设计jdk/unicode的人和icu是同一拨人。4、文档详尽IBM作为一家大型的软件服务公司,写文档的能力真不是盖的。5、有IBM做强力支持所以,任何一个版本的发布都有严格的商业化测试。并且,比较贴近市场需求。比如,ibm需要在中国出售它的产品,而icu就是它唯一的法宝。中国政府要求在中国出售的软件必须支持gb18030,于是icu每个版本的变化都紧跟着gb18030的发展。6、有简洁的C++/java的接口我向以前的同事推荐iconv的时候,他们都在说使用起来太复杂。其实接口已经不能再简化了,一共也就open/close/iconv三个函数。可是对于C++程序员而言,巴望不得就像glib::ustring那样,完全仿照std::string那样让他用就好了,转码也就像java的String.getBytes(“gbk”)那么简单最好。7、容易和现有的项目整合发布数据都在dll里面,把用到的dll打包发出去即可。8、有高层的io/regex支持基于unicode的正则表达式支持,以及仿照stdio的基于unicode的io。我对前面这个很感兴趣,后面这个……貌似还是个比较粗燥的咚咚,另外,io实在是个太广义的东西,还是不要它来帮我抽象了吧

北医三院急救室

刚刚到家,不是因为加班,刚从北医三院急救科回来,一同事病了。
回来的时候路过北四环,所谓的七星酒店,水立方,鸟巢,一片灯火辉煌,安静祥和。而在不远处的医院,急救科躺满了人。简陋的大屋子,被帘布密密麻麻隔成几十个床位,咳嗽声,急促的呼吸声,屋里屋外以及走廊上,到处都躺满了人。屋口斜着的坡,因为有铁栏杆,于是拿铁链一拴,就能固定住2张床。屋外的长椅从来没空过,左手举着吊瓶右手输着液体,垂头,萎靡。昨天,我同事刚做完手术,就是在这样的长椅上坐了一宿。因为不要说住院了,连急救这边,都很难找到一张床。你无论是抬头看看屋子简陋的顶棚,还是看看周围这一片吵杂拥挤,你都会觉得这太不真实了,这是在拍抗战电影。如果你想找个医生护士问问这是怎么回事,好难。即便在这躺一整天,医生护士呆在你床边的时间加起来也不到5分钟,因为他们有太多太多的病人需要照看。除非你真的快要挂了
这已是我第三次来这边。其实已经习惯了。可是回家的时候路过鸟巢,就很不爽了一下。我在想如果国家肯把这片地以及建筑资金用来修建一座医院,那它将比10个协和还宏伟。你看看协和吧,当年洛克菲勒就这么在王府井选了一片地捐了一笔钱,它以及从它走出的医生,救了多少中国人!它的光辉真不是我在这里可以用只字片语描述的,他太伟大了,且意义深远。(而另一方面,从这里康复走出的病人却未必知道谁是洛克菲勒。)
你不去医院看看,不知道什么是人间地狱。你更不会想到如此繁华的首都的如此顶级医院,医疗环境竟然是这么的简陋。你现在可以不关注这些,但是,总有一天你也会生病的。你也会像谁谁谁一样被999送到急救科然后却找不到一个床位可以接纳你,就像等亲爹一样等医生来看你一眼,结果,上帝先来了

mailslot有什么优点?

今天看msdn的时候,第一次看到这个。搜了下,我的机器上只有thinkpad的access connection用到它了。它有什么优点吗?

freebsd的nls?

我之前一直在抱怨,freebsd怎么不在它的代码中加入gettext这样的东西让它的出错信息本地化。后来听delphij他们说,大概是因为不到万不得已不想引入GPL的代码到base system。后来又听说netbsd自己做了一个gettext。今天更新代码后看更新日志的时候发现它在3月13日提到“POSIX.1 Native Language Support (NLS) has been enabled in libc and a bunch of new language catalog files have also been added.”然后才发现我机器上/usr/share下有个名为nls的目录存在好久了,结构和/usr/share/locale完全一样,只是中文目录下都是空的。然后刚刚在msgcat.c中找到了catopen的实现,令我惊讶的是,msgcat.c这个文件早在1995年就存在了,就是从netbsd挪过来的。可为什么一直没有被大规模的用起来?

2008-03-01

不知不觉,这么就三月了。最近玩wow玩的很郁闷。先说昨天。在塔拉的某个营地。正在杀呢,我显卡驱动报错,蓝屏了。然后我赶紧发短信给队友,说我机器死了。过了很久,拿手机一看,还没发出去。那打个电话吧,结果,手机也死机了。还是手机重启快。马上就收到他发来的短信,问我是不是有事下了。算了,不回了,上去再说。然后发现他已经下了。然后我还没反应过来,就被一群怪围死了。然后今天早上吧,准备做做之前的职业任务。尽管别人都给我说术士30级以后的职业任务没必要做,但是我还是想试下。嗯,都67了,做60的任务,应该没问题吧?而且还有不小的经验。但是这个任务很花钱啊,光买道具就花了近200G。那NPC就是赤裸裸的抢钱嘛。算了,太麻烦了,还是看看攻略吧。看攻略才知道这是个连环任务,最终的奖励是150的那个骑术和一匹马。网上说,一般有两个选择,做这个特别兀长的任务,或者直接480G去东谷伐木场学。二者算下来金钱消耗差不了多少。而,最笨的是我,花了480+80G学马,然后又花了200G来做这个任务,两头栽。然后说晚上。刚去燃烧平原交了马的那个任务(某一步),有个30级的同事喊我去荆棘谷帮忙杀个怪,我就去了。在北边的库尔森营地,还没问清楚杀什么,我就冲进一阵狂砍。哈哈,好爽。都觉得好爽。我得意洋洋一番后,继续清。看见一个笼子里面有怪,我就冲进去了。杀完后,发现出不来了。开门需要钥匙。笼里死的是一个驯兽师和两个动物。尸体搜索一遍,根本没有钥匙。然后我2个同事愣了,在笼子外面观赏我好一阵。等又一轮怪出来,我们把笼子里笼子外的怪清了,还是没有钥匙。开门,提示需要“竹笼钥匙”。网上一查,在另一个大陆的菲拉斯有个任务中间有一步会得到竹笼钥匙,但是我不确定那个钥匙是不是就是这个钥匙。可是后来我们一起都挺纳闷的,既然这门都打不开,那我咋进去的?话说我都67级了,两个大陆没有怪能打赢我,却在这小不知名的库尔森营地被一群30级的蛮兵困在竹笼里。即便有多厉害的法术,也是打不破这笼子的。我在想,如果是开放式RPG,它不会这样。

用ACE_Msg_WFMO_Reactor处理windows消息

ACE_Msg_WFMO_Reactor这个类是ACE Reactor基于windows message的实现,但是我觉得写的挺烂挺简陋的,不够灵活。用这段:ACE_Reactor_Impl *impl = new ACE_Msg_WFMO_Reactor; std::auto_ptr<ACE_Reactor> reactor (new ACE_Reactor (impl, 1)); ACE_Reactor::instance (reactor.get ()); // 开始消息循环 ACE_Reactor::run_event_loop (); 代替这段while (GetMessage(&msg, NULL, 0, 0)) { if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) { TranslateMessage(&msg); DispatchMessage(&msg); } } 可我连个传hwnd给reactor的机会都没有。

用 live writer 往wordpress发

这个,实在是让我惊奇。微软live套件中的live writer居然可以支持wordpress!! 显然,这东西比tinymce之类的好用多了顺便抱怨下live game。我从开始菜单打开“Games for Windows - LIVE”的时候,说什么我的xp必须打一个补丁才能用,然后给了一个网址:“http://support.microsoft.com/kb/960554/en-us”。可是,这个KB938759有英文版的但是没有中文版的,这玩意儿在我的xp下装不上!

2009-02-20

今天升到了58,这个等级终于可以大大方方的去外域了。但是相关任务我还没做,明天和他们一起做。
打开仓库发现有9个掠食者的肉,应该是lua以前给我寄来的,然后我还有2条大鱼,一起做了,把烹饪升到310。然后用赞加钓的孢子鱼升到了320,然后用大量的刺鳃鲑鱼做“炖鲑鱼”升到了350。等wlk开了,就可以去北极学宗师级了,嘿嘿。
我有电鳗,但是没有风暴牛排的食谱。否则估计可以发笔小财
=================分割线======================================
项目的程序代码已经开发了一年多,然后写产品需求文档的人来把mysql中所有表清空并要求由他来设计数据库的表结构。OMG~ 100多张表,上万条细心录入的数据,就这么没了。代码呢?你认为多少会被废掉?
"Rule 5. Data dominates. If you've chosen the right data structures and organized things well, the algorithms will almost always be self-evident. Data structures, not algorithms, are central to programming"
且不说进度会不会再度延期了,看着那么nc的表结构我实在不知何从下手。反抗无效就只能接受,就像被强奸一样,既然动弹不得的,就乖乖告诉对方,钱包里有安全套,请他戴上。

2008-02-19

今年升到57了,并把天赋从痛苦洗到恶魔,带恶魔卫士去杀怪。
嗯,再升一级就可以去外域了。
不过最近不是很想玩。

2008-2-17

今天上线本来是想看看TY多少级了,带带他,结果发现他刚下。于是我就跑到暴风去做生意去了。
嗯,收信,又买了40G左右。然后去买了一个“法师之3”,把法师套牌做好了,扔到拍卖行去卖100G一个,使用这个物品能接到一个任务然后从两个暗夜的需求30级的法杖中选一个。会有人买吗?不知道。也许得等暗夜的任务再开才好办。
终于可以做DK的雕文了。我想,开DK之后,肯定DK爆多,那么DK的东西应该很好卖才对。但是听工会的大猎人lua说不是这样,他说他刚在这个月初看了一份分析报告(肯定不是大摩的),说做DK的东西肯定会赔,建议我持币观望。你说呢?其实我不是持币,是持原料。
啊!!!!!趁现在还在地球,多去瘟疫之地、冬泉谷之类的采点草药。必须要在地球就把铭文升到300。估计至少还需要25*5/20*2=12捆草药。
我好笨啊。炼金也需要草药,而用法与我不同。导致对我来说同等级的草药,在拍卖行的价格相差很大,有时甚至在1.8倍以上。所以我不能见药就磨,要学会用拍卖行倒手。而且,一捆草药至少30G,那点托管费和tax不算啥。

2009-02-15

不爽,很不爽,中盗号木马了。
本来是这样,觉得机器上大脚插件的任务数据太老,想去下点新的,然后就想,干脆重新下个大脚。www.wowfootbig.cn, 我被这个网站给骗了,还真因为它是什么大脚官网,然后就下载了,然后就运行了,然后发现没有反应,再下载一次,运行,还是没有反应。然后看见诺顿占用资源狂高,才晓得出事儿了。
然后第一时间就是拔网线。在我下载bigfoot之后还好没有登陆过wow,估计没有问题。
现在心里好怕怕,想去玩,但是不知道病毒杀干净了没。我用工具手动察看了一番自动启动文件,貌似是没有异常了。呃,担心。
顺便帮诺顿正个名,很多人不喜欢他,但是我从04年到现在,没有遇到过他杀不掉的病毒,也没有遇到过能瞒过它老人家法眼的病毒。往往中毒后再装诺顿去杀是无济于事的,其它情况它都很好,而且从来不用满地找key,甚至安装的时候连cdkey都没输入过。有时候它的确占用资源狂高,但这就意味着,出事儿了!
TNND,我宁可以后再也不玩wow,也绝对不敢中木马。木马太可怕了。

2009-02-14

今天获得了一个新成就:1000条鱼。就是说,我一共钓上来鱼(以及其它物品)1000个了。 按每10分钟40条计算,就是4个多小时。只要你不嫌枯燥,随便买个鱼竿在出生的主城花5个小时就能把钓鱼升到300(其中做225的那个钓鱼任务得花至少40分钟)。这和打怪升级所用的时间相比,少的可怜。所以我还不能算是专业钓鱼的,嗯。 我现在在赞加钓鱼可以做到基本不跑竿,但是在沙塔斯城外边还是很磋,成功率非常低。嗯,比较开心的是卖了一个长剑套牌一个雕文一共40多G,一下子富起来啦,哈哈。前天学雕文(从290-330)学的身上空的只剩几银,然后找我们部门助理借了40G才继续学完。 传说术士那个奴役恶魔的小型雕文销路不错,但是我从来没用过奴役恶魔这个法术啊。有用吗? 今天在外域学了第一个烹饪配方。

2009-02-13

今天把钓鱼和烹饪的上限都提到了300以上。在赞加钓了很多刺鳃鲑鱼,但是没有买到食谱呢。呃,就算买到了我也用不了,那个是55级的,我还有2万的经验才能升55。
用新鲜的大鱼做的鱼片挺不错的,每秒回复120的HP,并且立即给一个耐力+10的buff。

2009-02-12

晚上下了一趟祖尔法拉克,然后找13要了14个草药,自己又凑了些,终于把铭文突破200了。加上仓库里存了很多草药,一下子就升到233了。呃……今天把钓鱼的任务做完了,这算是拿到了2个专业成就。
突发奇想,想去外域钓鱼(我现在54),于是就去了赞加沼泽。钓鱼本身是230,然后加了100的鱼饵和5点的鱼竿,疯狂的跑杆(水域本身的要求是305)。罢了,要想钓鱼升级快,还是主城好。要不,藏宝海湾也不错。

freebsd这个月还发不发snapshot了?

这都已经22号了啊!!!!
等出了这个版本,就可以用gptzfsboot了

因为locale为中文导致编译失败

今天尝试在linux下编译xen 3.3.1。到stubdom下面的时候编译newlib失败,找不到stddef.h。何解?自然,我的/usr/include下是有这个文件的,但是由于newlib在编译的时候加了参数-nostdinc,于是在后面采用-isystem include的方式去寻找/usr/include目录。但是出错在于GCC_INSTALL这个变量是空,它是在 stubdom/Makefile 中设置的:GCC_INSTALL = $(shell LANG=C gcc -print-search-dirs | sed -n -e 's/install: \(.*\)/\1/p') 而实际上,默认情况下我的 gcc -print-search-dirs 输出如下:安装:/usr/lib/gcc/x86_64-redhat-linux/4.1.2/ 程序:=/usr/libexec/gcc/x86_64-redhat-linux/4.1.2/:/usr/libexec/gcc/x86_64-redhat-linux/4.1.2/:/usr/libexec/gcc/x86_64-redhat-linux/:/usr/lib/gcc/x86_64-redhat-linux/4.1.2/:/usr/lib/gcc/x86_64-redhat-linux/:/usr/libexec/gcc/x86_64-redhat-linux/4.1.2/:/usr/libexec/gcc/x86_64-redhat-linux/:/usr/lib/gcc/x86_64-redhat-linux/4.1.2/:/usr/lib/gcc/x86_64-redhat-linux/:/usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../x86_64-redhat-linux/bin/x86_64-redhat-linux/4.1.2/:/usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../x86_64-redhat-linux/bin/ 库:=/usr/lib/gcc/x86_64-redhat-linux/4.1.2/:/usr/lib/gcc/x86_64-redh…

quartz.dll中的整数溢出漏洞

网上流传一个错误的midi文件,一打开,就会导致windows media player/realplayer死掉。http://www.sunchangming.com/music/my.wav。quartz.dll中会抛出一个未处理的异常: Integer overflow。这个会让ie/播放器 挂掉,但是微软说这并不是一个网上所说的可用于执行任意代码的漏洞。
bug的原始报告:
http://www.milw0rm.com/exploits/7585
cve:
http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2008-5745
微软的解释:
http://blogs.technet.com/swi/archive/2008/12/29/windows-media-player-crash-not-exploitable-for-code-execution.aspx
据我看,的确仅仅是在执行div操作的时候cpu抛出了一个异常而已。唉……害我白跟踪了好久
但是mcafee已经把这样的wav/midi文件标记为木马了

续:段权限保护

今天继续往下看,大概是这样,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

"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发布了

对,就是今天,大概是这个新年最好的礼物了。
不过我倒没有什么兴奋的,我把freebsd格了,装在vmware中当玩具,于是就放心大胆的用svn中的最新的current代码了。
freebsdchina.org论坛上的关于为什么不用C++写kernel的帖子被锁了。去它的,别闹了。我就是要用C++写,不管写成啥样,总之我就是要告诉别人,I can do that!