社区
进程/线程/DLL
帖子详情
对于内核对象的逻辑有点混乱
Mashpawo0
2009-04-04 02:39:21
刚看Windows核心编程一会 看到内核对象 知道了很多内核对象 内核对象被进程创建 返回一个句柄 这个句柄是进程级别的 也就是不同进程中相同的句柄未必指向(很可能是否定的)同一个内核对象
后来发现 进程也是一个内核对象 这下这个逻辑就有点混乱了 可能我对内核对象还没有深刻的认识 望高手指教指教 帮我弄清这个逻辑 一个内核对象拥有一群内核对象我就是理解不了
...全文
119
4
打赏
收藏
对于内核对象的逻辑有点混乱
刚看Windows核心编程一会 看到内核对象 知道了很多内核对象 内核对象被进程创建 返回一个句柄 这个句柄是进程级别的 也就是不同进程中相同的句柄未必指向(很可能是否定的)同一个内核对象 后来发现 进程也是一个内核对象 这下这个逻辑就有点混乱了 可能我对内核对象还没有深刻的认识 望高手指教指教 帮我弄清这个逻辑 一个内核对象拥有一群内核对象我就是理解不了
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
4 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
fly2009fly
2009-04-04
打赏
举报
回复
呵呵 你记住 一句话 就 行了 ;内核对象 和 他 被 创建 的(线程)大多数是(进程)的主线程;关系不大(你可能开始不会同意);他是 独立的 (顶多 在 进程的 句柄表 中有这个内核对象的 句柄);他 由 系统 来 管理;这 就是 为什么 内核对象 可能 生命周期 大于 创建 他的 线程(大多数是 主线程) 的 生命周期。
cnzdgs
2009-04-04
打赏
举报
回复
内核对象是在内核中分配了一块内存,内存中记录对象的各种信息,程序在使用内核对象时需要另外打开一个句柄(HANDLE),句柄也对应一块内存,记录与该句柄操作有关的信息。程序在创建内核对象时会自动打开一个句柄,程序也可以打开一个已存在的对象并得到一个句柄,通过这个句柄对对象进行操作,最后再关闭句柄,一个对象的所有句柄都关闭后,系统会将对象会自动释放。内核对象分为以下类型:
Access token
Communications device
Console input
Console screen buffer
Event
File
File mapping
Job
Mailslot
Memory resource notification
Mutex
Named pipe
Pipe
Process
Semaphore
Socket
Thread
Transaction
Waitable timer
Mashpawo0
2009-04-04
打赏
举报
回复
LS的朋友 你只是把书的内容复制给我了。。。
写不动代码的人
2009-04-04
打赏
举报
回复
内核对象主要要用来供系统和应用程序管理系统资源,像进程、线程、文件等。存取符号对象、事件对象、文件对象、作业对象、互斥对象、管道对象、等待计时器对象等都是内核对象。我们在编程时经常要创建、打开和操作它们。内核对象通过调用函数来创建,如要创建文件映射对象,就调用CreateFileMapping函数。每个内核对象都会分配一个内存块,只能由其内核访问。该内存块是一种数据结构,用于管理对象的各种信息。
我们的应用程序不能直接访问内核对象的数据结构。需要通过Windows提供的函数来访问。
内核对象由内核拥有,并不是进程所拥有。每个内核对象都有一个计数器来存储有多少个进程在使用它的信息。
内核对象有安全描述符的保护,安全描述符描述了谁创建了该对象以及谁能够使用该对象。用于创建内核对象的函数几乎都有一个指向SEC URITY_ATTRIBUTES 结构的指针作为其参数。CreateFileMapping函数的指针的代码如下所示:
HANDLE CreateFileMapping(
HANDLE hFile.
PSECURITY_ATTRIBUTES psa,
DWORD flProtect,
DWORD dwMaximumSizeHigh,
DWORD dwMaximuniSizeLow,
PCTSTR pszNarne);
大多数应用程序通过传NULL值创建具有默认安全性的对象(对象管理小组的任何成员及创建者拥有全部访问权,而其他任何人均无权访问)。如果你想限制别人对对象的访问,你就需要单独创建一个SECURITY_ATTRIBUTES对象并对其初始化。代码如下:
1 SECURITY_ATTRIBUTES sa;
2 sa.nLength = sizeof(sa); //Used for versioning
3 sa.lpSecuntyDescriptor = pSD, //Address of an initialized SD
4 sa.bInheritHandle = FALSE; //Discussed later
5 HANDLE hFileMapping = CreateFileMapping(INVALID_HANDLE_VALUE,
6 &sa, PAGE_REAOWRITE, 0, 1024, "MyFileMapping");
当一个进程被初始化时,系统会为其分配一个句柄表。句柄表用于内核对象,而不用于
用户对象和GDI对象。
表3-1 进程的句柄结构
索引 内核对象内存块的指针 访问屏蔽(标志位的D W O R D ) 标志(标志位的D W O R D )
1 0 x ? ? ? ? ? ? ? ? 0 x ? ? ? ? ? ? ? ? 0 x ? ? ? ? ? ? ? ?
2 0 x ? ? ? ? ? ? ? ? 0 x ? ? ? ? ? ? ? ? 0 x ? ? ? ? ? ? ? ?
... ... ... ...
创建内核对象
进程初次初始化时,句柄表是空的。进程中的线程调用创建内核对象的函数时,内核就为相应的内核对象分配一个内存块,并初始化。内核对进程的句柄表进行扫描,找到一个空项,用对象的数据结构的内存地址进行初始化。下面是一些创建内核对象的函数:
HANDLE CreateThread(
PSECURITY_ATTRIBUTES psa,
DWORD dwStackSize,
PTHREAD_START_ROUTINE pfnStartAddr,
PVOID pvParam,
DWORD dwCreationFlags,
PDWORD pdwfhreadId);
HANDEE CreateFile(
PCTSTR pszFileName,
DWORD dwDesiredAccebS,
DWORD dwShareMode,
PSECURITY_ATTRIBUTES psa,
DWORD dwCreationDistribution,
DWORD dwFlagsAndAttnbutes,
HANDEE hTemplateFile);
关闭内核对象
不论通过何种方式创建内核对象,都通过调用CloseHandle方法来结束对内核对象的操作。
BOOL CloseHandle(HANDLE hobj);
为什么结束进程能释放所有占用的资源?
进程在运行时有可能出现内存泄漏。在进程终止运行时,系统会自动扫描进程的句柄表。若表中拥有任何无效项目(进程终止前没关闭的对象),系统将关闭这些对象的句柄。对象的计数器被置0,内核便会撤销这些对象。
跨进程边界共享内核对象
很多时候,不同进程的线程需要共享内核对象。如邮箱和指定的管道使应用程序能在联网的计算机上不同的进程之间发送数据块。
对象句柄的兼容性:只有当进程之间是父子关系时,才能使用对象句柄的继承性。在这种情况下,父进程可以使用一个或多个内核对象句柄,并且该父进程可以决定生成一个子进程,为子进程赋予对父进程的内核对象的访问权。
实现过程:
1.父进程创建内核对象,并指明对象的句柄是可继承的句柄,注意内核对象本身不具备继承性。
2.使用对象句柄继承性时要执行的下一个步骤是让父进程生成子进程。这要使用CreateProcess函数来完成:
BOOL CreateProcess(
PCTSTR pszApplicationName,
PTSTR pszCommandLine,
PSECURITY_ATTRIBUTES psaProcess,
PSECURITY_ATTRIBUTES psaThread,
BOOL bInheritHandles, //TRUE表可继承,FALSE表不可继承
DWORD fdwCreale,
PVOIO pvEnvironment,
PCTSTR pszCurDir,
PSTARTUPINFO psiStartInfo,
PPROCESS_INFORMATION ppiProcInfo);
在这个过程中,系统将拷贝可继承的句柄的每个项目到子继承的句柄表中。并递增内核对象相应的计数器。CreateProcess函数返回后,父进程会立即关闭对象的句柄,而不影响子进程对该对象进行相关操作。
命名对象:共享跨越进程边界的内核对象的另一种方法。大部分内核对象可以被命名。若要按名字共享对象,则必须为对象赋予同一个名字。如下面的创建命名内核对象的代码:
HANDLE CreateMutex(
PSLCURITY_ATTRIBUTES psa,
BOOL bInitialOwner,
PCTSTR pszName);
HANDLE CreateEvent(
PSECURITY_ATTRIBUTES psa,
BOOL bManualReset,
BOOL bInitialState,
PCTSTR pszName);
不同编程语言的强大和劣势、
混乱
、编译警告
文章介绍了常见编程语言的优缺点,C语言适合写
内核
但过于底层,C++用于大型设计但难写上层应用,Java流行但占内存,Shell适合交互但难写业务,Python用于AI但效率不高。还提到早期编译型语言易
混乱
,以及C语言的编译警告设置。
Jupyter Notebook单元格执行顺序陷阱:避免PyTorch
逻辑
错误
本文揭示了Jupyter Notebook中因单元格非线性执行导致的PyTorch
逻辑
错误,重点分析GPU环境下模型状态
混乱
、设备不一致等问题,并提出通过重启
内核
实例化运行、模块化代码和防御性编程等手段保障实验可复现性。
内核
对象
&句柄&泄漏&检测
本文深入探讨了Windows系统中句柄的原理、句柄泄漏的影响及检测方法,介绍了自研工具HandleSpy的设计与实现,旨在帮助开发者高效定位并解决句柄泄漏问题。
Linux
内核
追踪(一):proc/sys/debugfs
本文介绍了Linux
内核
调试中的三个重要工具:proc、sys和debugfs文件系统。proc文件系统允许用户与
内核
数据结构交互,提供进程和系统信息;sysfs用于设备驱动管理和组织,避免proc的
混乱
;debugfs则是一个专为
内核
调试设计的内存文件系统,允许动态修改
内核
数据。通过proc_mkdir、proc_create、kobject_create_and_add等函数,开发者可以创建和操作这些虚拟文件系统。
从WDF到Linux
内核
的深度对话
本文系统比较Windows驱动基础框架(WDF)与Linux
内核
驱动模型在架构设计、
对象
模型、电源管理、即插即用、同步机制及调试生态等方面的核心差异。重点剖析二者在抽象层级、并发控制、I/O处理、生命周期管理及安全性保障上的设计理念与技术实现,并探讨虚拟化、跨平台开发、Rust语言引入及IoT轻量化等前沿趋势对驱动框架演进的影响。
进程/线程/DLL
15,465
社区成员
49,169
社区内容
发帖
与我相关
我的任务
进程/线程/DLL
VC/MFC 进程/线程/DLL
复制链接
扫一扫
分享
社区描述
VC/MFC 进程/线程/DLL
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章