摘要: 收集整理看过的一些论文用,不定期更新:MMTk: The Memory Management Toolkithttp://cs.anu.edu.au/~Robin.Garner/mmtk-guide.pdf讲在JikesRVM,一个叫jikes写的虚拟机里面,结合Eclipse来实现一个Gabarge Collector。GCspy: An Adaptable Heap Visualisation... 阅读全文
posted @ 2008-12-30 23:08 lbq1221119 阅读(1651) 评论(3) 推荐(0) 编辑

摘要: 你是否真正的了解你所认识的.NET?Rotor、Mono?垃圾收集器、类装入器、类型系统、错误报告系统、应用程序域、配件、代理支持、反射、安全性和代码管理器等等等等的架构、实现。在实现这些名词中遇到的有趣的问题和睿智的解决方案。 在对新技术的追踪和应用中,国内的技术爱好者已经能基本上跟上国外同行的步伐。而对于.Net比较核心的基本技术,高级调试技术,FrameWork架构细节及其实现的研究,与国外... 阅读全文
posted @ 2008-03-10 07:43 lbq1221119 阅读(4179) 评论(90) 推荐(0) 编辑

2010年1月14日

摘要: 时间同步算法的应用非常广泛。譬如在Unix系统里面,Make命令,只是用来编译新修改过的代码文件。Make命令使用运行的客户端的时钟来决定哪个文件是被修改过的。但是,如果把代码放到文件服务器上面,而运行make命令的主机与文件服务器的时间不同的时候,make命令就有可能工作不正常。譬如玩dota的时候,几个客户端需要一个同步过的时钟来使每个人的画面保持一致。、再譬如PC电脑同步服务器上面的时间可以... 阅读全文
posted @ 2010-01-14 16:03 lbq1221119 阅读(7310) 评论(5) 推荐(3) 编辑

2009年9月14日

摘要: 上一节中的GarbageCollect()方法,主要是传递不同的Generation做为参数,来调用GarbageCollectGeneration方法,实现对heap中不同的Generation进行回收。 精简了以后的GarbageCollectGeneration方法以后的代码如下: 在第一次调用该方法的时候,Gen传递过来的参数值为max_generation,表示对GC Heap中所有G... 阅读全文
posted @ 2009-09-14 18:39 lbq1221119 阅读(780) 评论(0) 推荐(0) 编辑
摘要: 继续接着上篇的分析, F11从Fcall中跳出来,就到了sscli20\clr\src\vm\gcsmp.cpp中关于Garbage Collect的最外部的方法GCHeap::GarbageCollect: HRESULTGCHeap::GarbageCollect (int generation, BOOL collect_classes_p){ UINT GenerationAtEntry... 阅读全文
posted @ 2009-09-14 18:31 lbq1221119 阅读(2463) 评论(2) 推荐(3) 编辑

2009年9月11日

摘要: 首先在SSCLI2.0源代码的\clr\src\vm\comutilnative.cpp文件中的GCInterface类的CollectGeneration方法上下个断点,该宏方法主要实现了一个调用转换: /*==============================CollectGeneration===============================**Action: Collect... 阅读全文
posted @ 2009-09-11 11:13 lbq1221119 阅读(2584) 评论(20) 推荐(3) 编辑

2009年9月8日

摘要: Job Description:Responsibilities:- Design and implement software modules in .NET.Qualifications:- 2+ years commercial software development experience in C# after the BS degree, or MS degree graduates ... 阅读全文
posted @ 2009-09-08 15:46 lbq1221119 阅读(860) 评论(10) 推荐(1) 编辑

2009年6月17日

摘要: 1.在开启了主板的DHCP功能之后,由于主板每次重启之后,都会需要一定的时间获取一个IP地址,这个需要一定的时间。而在Visual Studio中debug的时候attach到电路板上面的时候,会reset一下来连接上tinyCLR的debug engine。连接和重试的时间,会小于主板获取IP地址的时间,这个时候,就会出现attach不上主板的现象。解决 这个问题的方法可以是: 打开注册表,... 阅读全文
posted @ 2009-06-17 18:49 lbq1221119 阅读(1864) 评论(4) 推荐(0) 编辑

2009年6月11日

摘要: 在.Net micro framework的一个项目的开发过程中,有一个GPRS的Modem。我们在主板上通过串口,提供了5v的电压。 GPRS Modem设计板如图: 我们使用TXD和RXD,对应到另外一块主板芯片上面的COM4,在开始实现GPRS Modem拨号的过程中,我想是使用GSM 7.07的标准,在Tera Term终端中,经由STK500开发电板连接上GPRS Modem上面的串口... 阅读全文
posted @ 2009-06-11 00:37 lbq1221119 阅读(3194) 评论(5) 推荐(0) 编辑

2009年5月26日

摘要: 周六参加了博客园北京俱乐部第三次活动,作为主讲人之一,我给出的题目是.Net 下垃圾回收算法与实现。内容主要包括三个部分:经典基本垃圾回收算法 CLR中垃圾回收算法介绍 SSCLI中Garbage Collection源码分析PPT可以在这个地址下载到: http://files.cnblogs.com/lbq1221119/GC_Algorithm_inside_dotNET.pptx这次活动的... 阅读全文
posted @ 2009-05-26 11:30 lbq1221119 阅读(2502) 评论(24) 推荐(0) 编辑

2009年3月3日

摘要: 在定义任何一个ValueType之后,它都是从System.ValueType继承过来的,默认的就继承了Equals方法和GetHashCode方法,在使用的时候,必须主意的是最好重写自定义ValueType的这两个方法,因为可能带来性能上面的严重问题或者是比较的不正确。譬如定义下面这样的一个结构体值类型: struct TestValueType { public int Myint; publ... 阅读全文
posted @ 2009-03-03 21:01 lbq1221119 阅读(2376) 评论(1) 推荐(1) 编辑

2009年1月8日

摘要: key words:DPWS,嵌入式设备,WebService,Http,嗅探,Micro Framework。。 为了实现一个嵌入式设备和一个host在IIS server上面的WebService交互,使用了MF3.0里面的DPWS方法。不过这个东西实在是Hard to use。今天就记录下使用的过程中的第一步,首先分析一个Client和一个Webservice是如何交互的,发送的数据流的格式... 阅读全文
posted @ 2009-01-08 18:43 lbq1221119 阅读(12436) 评论(2) 推荐(1) 编辑

2008年12月31日

摘要: 抓到一个dump文件之后,很多托管命令不能用,查看托管线程的时候,现如下显示: XXXX表示这个托管线程已经被结束了,同时在等待GC的回收。这个时候,用~[N]s命令来切换线程是不可以的。如果是Framework 1.1下,可以使用!dumpallexceptions (!dae)来查看所有的Exception。2.0的SOS下面,咋同样可以使用类似的命令: 然后用!pe address打印出相... 阅读全文
posted @ 2008-12-31 18:13 lbq1221119 阅读(1022) 评论(3) 推荐(0) 编辑

2008年12月25日

摘要: Random函数到底是如何返回一个随机数的呢?下面看实现: 调用了一个内部方法: 另外还有在random的构造函数里面实现初始化seed数组: 最后就是涉及到一些变量的定义: seed数组的初始化有点麻烦,其中为什么用55和21俺也不太清楚,估计是定义一个特定的随机取数方法吧。比较有意思,呵呵。发这篇文章的目的,主要是为了检验下cnblog用live writer发图片的效果。。 阅读全文
posted @ 2008-12-25 11:47 lbq1221119 阅读(1875) 评论(3) 推荐(0) 编辑

2008年12月9日

摘要: 在上一篇文章,讲到了双击一个应用程序之后,操作系统如何初始化Process,以及创建相关的context,最后引导到应用程序的Main方法中。在托管代码中,对于Main的启动还有点不同,有一个PAL层在启动main方法之前启动:#ifdef __cplusplus extern "C"#endifint __cdecl main(int argc, char **argv) { struct _m... 阅读全文
posted @ 2008-12-09 21:12 lbq1221119 阅读(1489) 评论(0) 推荐(0) 编辑

2008年12月7日

摘要: 从双击一个应用程序到生成一个OS的process,然后到执行这个exe文件的Main方法,中间做了些什么呢?经常看着call stack的这块灰色的地方,总是想看看其是如何实现的。 Process的creation分为两个级别的创建:NT级别的和Windows级别的。CreateProcess这个方法,就会进行这两个级别的创建,同时创建Threads。俺们找到c:\Program Files\Mi... 阅读全文
posted @ 2008-12-07 22:03 lbq1221119 阅读(1927) 评论(5) 推荐(0) 编辑

2008年12月5日

摘要: 在3.0的Micro Framework中,咱可以使用SPI(Serial Peripheral Interface)来和外围设备进行通信了。SPI是一种串口总线系统,和I2C,CAN,USB一样。 使用SPI来进行串口通信中,从设备的通讯模式如下: 两个数据口,一个进一个出,另外两个控制口。在标准SPI通信模式中,设备分为master设备和slave设备。Master设备决定clock信号和线... 阅读全文
posted @ 2008-12-05 23:23 lbq1221119 阅读(2095) 评论(2) 推荐(0) 编辑

2008年11月17日

摘要: Cordbg是和.Net Framework,以及Windows SDK一起ship的托管代码的调试工具,相对于VS来说,它是一个比较low-level的调试工具. 本文的主要目的,就是看看Cordbg如何来进行托管调试,然后演示下其功能,看看其和其它的托管调试工具,譬如MDBG和windbg+SOS有啥不同. Mdbg,是一个使用dbgeng.dll的调试接口来开发的一个开源调试工具,版本ms现... 阅读全文
posted @ 2008-11-17 22:23 lbq1221119 阅读(2655) 评论(4) 推荐(0) 编辑

2008年11月13日

摘要: 自从可以动态调试SSCLI之后,发现这个玩意还真是个宝山,越玩越有意思,就像捅开一扇门,发现门后面还有一座宝山……不光CLR的内部实现细节,可以象是放电影一样呈现在眼前,Visual Studio里面的一些底层的技术,还有OS的底层技术,查看起来那是相当的便捷。 这里就说说malloc函数是具体如何实现的,能够F10,F11动态的在VS里面跟踪其一步一步的实现的源码,真... 阅读全文
posted @ 2008-11-13 20:52 lbq1221119 阅读(5643) 评论(11) 推荐(0) 编辑

2008年11月12日

摘要: 以前build过几次sscli2都成功了,这次换了个新的环境,没想到出了一大堆的问题。折腾了半天,最终搞定,把解决问题的过程和方法都记录下来。首先说说build的过程中参考过的链接和资源。1. 首先就是sscli自带的文档:Building the Shared Source CLI 2.0 and C# 2.0 Source Tree(\sscli20\docs\buildtools\build... 阅读全文
posted @ 2008-11-12 18:48 lbq1221119 阅读(3601) 评论(5) 推荐(0) 编辑

2008年11月5日

摘要: 在分析MethodTable具体分配内存实现的时候,看到了计算MethodTable的大小,然后分配空间的算法。其中有个加法运算实现的非常赞,特地截取出来。 所有的MethodTable的分配,都是通过methodtable中的一个static方法AllocagteNewMT来实现的,该方法定义如下:MethodTable * MethodTable::AllocagteNewMT(EEClass... 阅读全文
posted @ 2008-11-05 18:12 lbq1221119 阅读(2095) 评论(5) 推荐(0) 编辑

2008年10月17日

摘要: 问题源自一个Seminar,如何使用Windbg找到在函数调用的时候,所传递的参数的值。 当使用live Debug模式attach到一个managed Process的时候,默认情况下并不显示函数内部之间的调用,这个时候,需要在这个函数没调用之间给下一个断点。 基于对一个托管函数下断点的两种方法,在上面一片文章里面已经讲过了,这里就显的容易多了。首先还是找上篇文章里面的程序作为例子:class ... 阅读全文
posted @ 2008-10-17 19:08 lbq1221119 阅读(2574) 评论(6) 推荐(0) 编辑
摘要: 本文介绍两种使用Windbg在Managed App中设置断点的方法。一种是在live Debug的时候,attach到了Process之后。另外一种是动态调试的时候,如何给几个模块的特定方法下一个断点。 使用Windbg在Native Code里面下断点是比较方便的,bp加上一个内存地址就可以做到。但是在托管的时候给一个方法下一个断点稍微有点麻烦。因为Windbg是一个native Debug... 阅读全文
posted @ 2008-10-17 19:05 lbq1221119 阅读(2840) 评论(6) 推荐(0) 编辑

2008年10月15日

摘要: 写本文主要两个目的,一个是解析下2.0下的对象在内存里面究尽是个什么样子的布局,使用windbg和sos来show下内存里面的bit是如何组织其来的。另外一个就是比较下和.Net Framework 1.1你面的内存布局有什么区别,修正下“Drill Into .NET Framework Internals to See How the CLR Creates Runtime Objects”里... 阅读全文
posted @ 2008-10-15 12:04 lbq1221119 阅读(3261) 评论(20) 推荐(0) 编辑

2008年8月18日

摘要: 在研究handle table的时候顺便研究的东西。Baidu了下,发现国内这方面的资料几乎没得,然后就准备瞎bb下,为下面的一篇介绍handle table的结构做准备。关于lock-free data structure。以及解决这个问题中使用的CAS(compare and swap)操作。以及使用CAS操作的时候出现的A-B-A Problem。对于lock-free data struc... 阅读全文
posted @ 2008-08-18 14:36 lbq1221119 阅读(4777) 评论(8) 推荐(0) 编辑

2008年8月12日

摘要: 好久没写了..恩,先写handle table。越学越发现,又回到了崇拜scz,pjf的日子... 阅读全文
posted @ 2008-08-12 17:15 lbq1221119 阅读(1389) 评论(1) 推荐(0) 编辑

2008年7月22日

摘要: 最近恶补操作系统和一些底层的知识。遂写篇文章来说说从操作系统的角度来研究Process的一些结构,实现,Porcess的初始化,重要的结构体域的定义,代表的含义,如何组织起来的,等。还有在前段时间研究托管的static字段到底在内存中如何组织的时候,遇到的handle table不熟悉的问题。 一个xp里面的Process,是由几个Eprocess,执行体进程块来表示的。这个Eprocess里面不... 阅读全文
posted @ 2008-07-22 14:45 lbq1221119 阅读(4394) 评论(11) 推荐(1) 编辑

2008年6月24日

摘要: 问题的提出,是源自Justin提出的一个case里面的一个问题,讨论了n久没得到一个答案,昨天justin周一早上一起来就又回忆起了这个问题,看来一直把这个问题放在脑子里面没有放下,佩服啊佩服 ^_^ 遂决定深入研究一番,下面是问题的提出:Boxed value typeIn C#, the value type instance having pure user data is resided ... 阅读全文
posted @ 2008-06-24 16:59 lbq1221119 阅读(2369) 评论(15) 推荐(0) 编辑

2008年6月17日

摘要: 下午,msn上面一个朋友发了一个dump文件过来,说是Web服务器的CPU使用率在100%,找不到问题在什么地方,让帮忙看看,遂让把dump文件传过来,找找问题出在哪儿。 Framework2.0,Windows 2k的OS。 加载了Dump文件之后,接着加载2.0版本的SOS扩展调试模块: .load C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\S... 阅读全文
posted @ 2008-06-17 23:36 lbq1221119 阅读(4451) 评论(25) 推荐(1) 编辑

2008年5月24日

摘要: 晚上,小落给推荐了一首非常好听的Folk名谣,说是网上很难找到的。:)给了一个地址:http://www.neocha.com/naivete/music!1657.html听了之后,很是喜欢这种风格。然后baidu了一个下载地址发给她,说是这个flash的MP3的地址,后来非要让我如何找到的….冂冏囧….只好拾起尘封了n久的hack技术… 首先查看Page Source,找到相关的一段:<... 阅读全文
posted @ 2008-05-24 23:36 lbq1221119 阅读(6764) 评论(57) 推荐(0) 编辑

2008年5月19日

摘要: 线程插入,在托管平台上面,是不能直接实现的。如果想通过托管平台在一个非托管的Process里面插入执行一段托管代码,就需要在非托管Process里面启动CLR。我们可以以此为突破口,通过直接调用CLR提供的功能接口来执行托管代码。 最终效果,是实现了非托管平台下托管代码执行的混合型线程插入。 在开发CLR的时候,MS将CLR作为一个COM服务器放到了一个DLL里面。MS为CLR定义了一个标准的CO... 阅读全文
posted @ 2008-05-19 14:10 lbq1221119 阅读(2777) 评论(8) 推荐(0) 编辑

2008年5月17日

摘要: 在开发CLR的时候,MS实际上是将CLR相关的功能作为一个COM服务实现在一个DLL里面。对这个DLL的选择,是由垫片来选择的。MS为CLR定义了一个标准的COM接口,并且为该接口和COM服务指定了GUID。虽然没有垫片mscoree.dll的实现代码,但是咱可以看看头文件….在MSCorEE头文件里面,定义了一些GUID和非托管的最重要的ICorRuntimeHost接口。任何windows应用... 阅读全文
posted @ 2008-05-17 14:07 lbq1221119 阅读(4397) 评论(17) 推荐(2) 编辑

2008年5月16日

摘要: 在以前的一篇叫做<深入追踪Exe加载过程>的文章里面,从clix的launch函数开始,再到CorExeMain2函数,在CorExeMain2里面有一个叫做CoInitializeEE的函数: result = CoInitializeEE(COINITEE_DEFAULT | COINITEE_MAIN) 一路找到EnsureEEStarted,这个是确保EE启动的方法。在这个方法... 阅读全文
posted @ 2008-05-16 10:59 lbq1221119 阅读(3462) 评论(10) 推荐(0) 编辑

2008年4月18日

摘要: 如果想自己获取应用程序的Call Stack,就需要查看Stack的内容。Stack Walker,在最近查看SSCLI源码的时候发现这个东西是和Stack Frame紧密联系在一起的。Walking the StackWe could conceivably attempt to unwind the stack ourselves using inline assembly. But stac... 阅读全文
posted @ 2008-04-18 14:58 lbq1221119 阅读(3866) 评论(3) 推荐(0) 编辑

2008年4月12日

摘要: 这几天Oracle培训,数据库功力倒是没太大长进,倒是Debug,Windows架构和实现还有CLR的觉悟突飞猛进。开篇前首先3ks下rick,他把他写的一票经典的文章都发到sscli.cnblogs.com团队里面来了。Rick可是我在看雪bbs上面久仰的大牛…由于写的文章时间在创建团队的时间之前,故需要翻到第一页才能看到rick的文章。 首先就从sscli中TLS预先定义的一个结构体说起了: ... 阅读全文
posted @ 2008-04-12 18:12 lbq1221119 阅读(3487) 评论(11) 推荐(0) 编辑

2008年3月31日

摘要: DataTable在内存中是如何存储一张表的结构的呢?如何使用Windbg直接在内存中找到一个DataTable里面的第M列第N行的值呢?这的确是一个比较有趣的问题^_^下面的内容,主要是讲如何用windbg+sos来看看一个DataTable在内存中是如何存储的,以及寻找内存中一个DataTable特定的行列的一个单元的值是多少。同时,还有一点Windbg Script的使用。找一个小白鼠先: ... 阅读全文
posted @ 2008-03-31 22:03 lbq1221119 阅读(3509) 评论(18) 推荐(0) 编辑

2008年3月25日

摘要: 前段写过一篇文章“CLR探索系列:深入追踪托管exe加载执行过程”,在那篇文章中,主要是侧重静态代码的分析,追踪源代码的流程一步一步看是如何实现的。这次,写一篇文章,结合Windbg,从一个托管应用程序执行的调用堆栈开始,追踪其调用堆栈中的线索,以及这些托管应用程序执行中调用的功能实现,来展示托管代码的加载和执行的流程和实现。首先还是找一个小白鼠:public partial class Form... 阅读全文
posted @ 2008-03-25 10:50 lbq1221119 阅读(3705) 评论(2) 推荐(0) 编辑

2008年3月14日

摘要: 无疑,一个Object在CLR中的逻辑结构是相当复杂的。前段时间,写了一篇CLR探索系列:System.Object内存布局模型及实现研究,侧重从System.Object这个基本类的基本内存布局,实现和结构来研究了下。这是远远不够的。今天就从如何存储一个Object中的Field,Method等信息,这些信息的逻辑组织方式和存储的逻辑结构。废话不多说,看看就知道了:首先,给一个图: 这个图,显示... 阅读全文
posted @ 2008-03-14 19:55 lbq1221119 阅读(5316) 评论(13) 推荐(1) 编辑

2008年3月13日

摘要: 吃饭回来,看到Share Source CLI团队的rss聚合上面Debug团队的juqiang发了一篇文章,说抓了一个minidump出现了:WARNING: Unable to verify timestamp for mscorwks.dll的错误。上次我在查看一个mini Dump的时候,ntdll.dll好像也出现过这个问题,当时把符号文件重新加载了一次就OK了。这次看到他出现了同样的问... 阅读全文
posted @ 2008-03-13 14:00 lbq1221119 阅读(3227) 评论(1) 推荐(0) 编辑
摘要: 前些天,发布了一个能够在Visual Studio2005查看sscli源代码的项目文件。不过,在VS2008中编译sscli,会出现一大堆错误。这里,有幸在Jeremy Kuhne's Blog上面找到了一篇文章来解决这个问题。原文链接可以点这里。这里,时间原因就不翻译过来了,希望对sscli团队中研究这个的同志们有帮助,特别希望“装配脑袋”能看到这篇文章。The currently avail... 阅读全文
posted @ 2008-03-13 08:37 lbq1221119 阅读(2013) 评论(4) 推荐(0) 编辑

2008年3月11日

摘要: 我想,有过研究sscli 2.0源码经历的朋友们看到这个标题,一定挺的高兴吧。在以前参阅SSCLI2.0的源码的时候,一直用的EditPlus。感觉在整个VM或者是PAL目录下面寻找对一个类的应用或者一个方法的定义相当的不方便。经常F3搜索整个目录中文件包涵的一个字符串,而且经常一不留神按F3大盘就出来了....这里发布一个项目文件,做为Share Source CLI团队的第一个团队资源。还有一... 阅读全文
posted @ 2008-03-11 10:27 lbq1221119 阅读(2884) 评论(13) 推荐(0) 编辑

导航