Thursday, March 25, 2010

tools to calculate LOC of a program

http://cloc.sourceforge.net/

Tuesday, March 23, 2010

XP 64 cannot hibernate issue

I have a server machine with 8GB and installed with XP 64bit. I tried to put it into hibernate mode. But I cannot find the option in the control panel. Pressing Shit key when shutting down the machine does not work either.
After some google search, I found out that when the memory is too big (larger than 4GB) and PAE is enabled, the XP (Vista, Server 2003, 08) then does not support hibernation.

I tested this on another machine also with 8GB ram but installed XP 32 without PAE. That machine can hiberate.

ref:
http://www.velocityreviews.com/forums/t525208-no-hibernate-tab-in-power-option-properties-in-xp-x64-in-pae-mode-its-not-allowed.html

Tuesday, March 16, 2010

用户态和内核共享内存--最简单的例子


http://wiki.tldp.org/kernel_user_space_howto#Mmap

Source code :

http://wiki.tldp.org/kernel_user_space_howto#Obtain_Example_Source_Code

(updated on 7.5.2015, old link does not work anymore.)

Friday, March 12, 2010

Increase MTU of the NIC on Linux

http://www.intel.com/support/network/sb/cs-009209.htm

今天用5分钟解决了一个SEGMENTATION FAULT 错误

一段LINUX小应用程序。主要功能是MMAP一段内存,MEMCPY点东西上去。

但是程序运行起来后,出现了SEGMENTATION FAULT的错误提示。如果是以前,我多半就慌了,也不知道咋解决。不过最近看了WING老兄的那篇文章之后,对这种提示已经没什么恐惧心理了,

呵呵。言规正传,我们知道SEGMENTATION FAULT一般也就是访问内存时出错了。由于我用到了MMAP, MEMCPY等。那么出错也很有可能。但是我想了下,上面那2个函数都没错啊,范围大小什么也都对。于是加了点PRINTF。发现是MEMCPY之后才出错的。比较奇怪,MEMCPY之后还有啥呢?

于是又开了个GDB调试下。在出现SGEMENTATION FAULT提示后,敲个“where”,看看在什么地方,显示是MAIN 531 行调用了PUTS,然后后面就是GLIBC的函数了。于是看看MAIN 的531, 是个PRINTF。 这也能引起SGEMENTATION FAULT? 有点怀疑。不过从调用PUTS来看,确实是PRINTF引起的。还真有点邪门啊。眼睛于是在PRINTF周围看了看。突然,发现上面一句是MUNMAP。这个也是和内存有关啊。有嫌疑。接着又仔细看了下。发现就是它。因为它在传入的大小参数时候是错的。主要原因是那个大小我之前改过几次,当时都是只改 MMAP那里,而忽略了MUNMAP!

于是改成正确的大小,搞定。前后大概也就5分钟吧。

终于解决了一个困扰了1周多的问题

要实现的功能不是很复杂,就是在SMM 下面操纵下网卡。

一开始在QEMU虚拟机里调试,还算比较顺利。想明白了之后,自己用汇编写个小程序,又写个小LOADER就实现了。这时心情很好,自信心也很足,剩下的就是把代码移植到一台真正的物理机器上了。

谁知道,恶梦开始了。在QEMU里跑的好好的程序在物理机器上就是不行。没办法,又重新看网卡SPEC,然后用各种方法,加了N多调试,始终不行。之前我努力的重点是看在操作网卡的时候有没有漏掉什么。因为我怀疑QEMU虚拟的网卡和真实的差别比较大。另外,我在我的SMI里把用到的数据都读出来,验证过,证明数据都是没有错的。于是继续怀疑网卡。同时又看了一堆LINUX 网卡实现方面的东西。

搞了好几天,还是不行,十分沮丧,差点都不想搞了。不过老板在后面逼着,不搞不行。于是接着想其他方法。后来又想到,也许是SMM的问题。如果我在 LINUX环境下用SMM里同样的方法操作下网卡,看看是否能得到想要的结果。如果可以,那么就是SMM的问题,如果不行,那么是我的程序在网卡设置什么地方不对。又改了下小程序,试了试,发现在LINUX中是可以的。也就是我操作网卡的地方没错。那么就是SMM的问题了。是什么问题呢?突然想到,我是把网卡的 TX_DESC之类的东西放在SMRAM里面的,难道网卡DMA的时候,读不到 SMRAM?于是接着改程序,把TX_DESC放到系统内存里。

再次怀着紧张的心情试了下,成了!!!!!!!!!!!!!!!!!!!!!!!!!

结论就是,网卡DMA的时候果然访问不到SMRAM里面的东西。其实这个我觉得还是有点奇怪的。也许只是适用我实验的那台老机器。按理说,我SMRAM也没加锁,而且又是在SMM模式下操作的网卡,PCI卡应该能访问到SMRAM才对啊? 不过也无所谓了,反正放到普通RAM里也一样。

PS:在这个过程中,顺手解决了一堆小BUG, 比如SMI只能触发一次啦。在SMM和OS之间没法利用共享的内存通信啦,如何检测网卡内部FIFO状态啦等等,呵呵。还是学到了不少东西。