Chinaunix首页 | 论坛 | 博客
  • 博客访问: 318895
  • 博文数量: 88
  • 博客积分: 2051
  • 博客等级: 大尉
  • 技术积分: 950
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-14 23:59
文章分类

全部博文(88)

文章存档

2012年(3)

2011年(2)

2010年(9)

2009年(14)

2008年(60)

我的朋友

分类: C/C++

2008-10-15 18:24:56

基本上所有R类都包含一个指向kernel-side object的handle,这个handle是一个整数!
通过这个整数,在DObjectIx这个容器中可以索引到R类指向的对象,这些对象都是从DObject派生出来的,
具有引用计数的功能!
 
当user-side的R类调用Close方法后,对应的计数减一! 到0时,就会自动析构内核的对象。
 
那么内核是如何把一个handle的32位整数解析成一个指向内核对象的指针的呢?
struct SDObjectIxRec
{
TInt16 instance;
TInt16 uniqueID;
DObject* obj;
};
这些指针通过SDObjectIxRec包装,放到DObjectIx的数组中,每一个DProcess或者DThread都有一个这样一个数组!(所以,当你创建一个R类的时候需要你指明是thread范围的还是process范围的,他们会被放到不同的地方)。
1.根据BIT30看这个handle是存在thread里还是process的DObjectIx里
2.根据这个handle的BIT0-14来判断这个handle真的在DObjectIx里,数组不越界
3.根据BIT0-14获取这个index对应的SDObjectIxRec
4.根据BIT16-29和获得SDObjectIxRec的instance比对
5.如果一致就无措,这些操作可能会需要NKern::LockSystem()
6.获得SDObjectIxRec的obj指针
 
 
阅读(812) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~