详解内核对象

来源:互联网 发布:大数据明细实时查询 编辑:程序博客网 时间:2024/06/05 15:40

当我们程序被加载内存时会被自动创建一个进程对象用于描述该进程信息

进程对象:

进程对象有一个进程I D、一个基本优先级和一个退出代码!

文件对象是当我们程序使用fopen等代码打开文件时操作系统会自动为要打开的文件创建一个文件对象用于与该文件产生映射关系,也就是我们所说的用户态到内核态之间的切换!

而文件对象则拥有一个字节位移、一个共享模式和一个打开模式。

 

内核对象就是在内存中的一个结构体,该结构体是动态分配的存在于进程堆中,但是该内核对象只能被操作系统所访问,程序员是没有办法在内存中找到这些结构体里的数据并修改它们。

比如进程对象,那么在内存中就是一个结构体,里面包含了一个long int的进程id和基本的优先级(进程调度之间的优先级)退出代码(用于描述是否正常结束)。

当我们使用创建内核对象的函数时,比如fopen,当我们调用fopen创建一个文件对象时,应用程序会到内核态中寻找代码并调用操作系统内核中的创建文件代码帮我与指定目标文件创建一个文件对象并产生映射关系,这就实现了用户态到内核态之间的切换,fopen创建后会返回一个指针指向内核对象的首地址,我们无法通过这个首地址来修改文件对象数据结构体里的类型数据,但是可以通过操作系统提供的对内核对象操作的代码来实现,比如seekread等,这些代码均属于内核代码,所以调用时也会从应用态到内核态之间的切换。

返回的用于指向内核对象的指针无法把该数据给其它进程使用,这受到8086保护模式的限制。

 

这里来说一下在内核编程中经常会用到创建内核对象和打开内核对象的函数,所谓的创建内核对象并不是真正的创建一个内核,而是由操作系统内核new一个新的内核结构体,然后返回一个指向位于堆中结构体的指针或者操作句柄,我们可以通过这个指针或者操作句柄使用相应的函数来修改,获取里面相应的数据,这些指针或操作句柄是不能用于其它进程所使用的。

而打开内核对象就更容易理解了,就是直接打开已经创建好的内核对象。

Fopen这个函数会创建文件内核对象而不是打开!有的时候不要被函数名所糊弄!

在操作系统当中每个程序被加载到内存后拥有4G的用户空间,其中1G是内核空间,这里说的是所有的应用进程,说的是每个进程在加载到内存中都有4G的用户空间。

其实并不是,这只是操作系统的虚拟内存管理方式(拆东墙补西墙)给程序员一种当每个进程加载进来时就有3G的用户空间一样,其中0x00-0x400-1(字节)这段内存是供操作系统内核所使用的,里面包含了许多操作系统的核心工作模块,内核对象等等,所有的进程对应的1G内核空间都是0x00-0x400-1(字节)这段地址的!

当内存(RAM)中的内存不够给应用进程所分配内存时,就会从磁盘中切割内存出来供应用进程所分配内存。


为什么要-1?内存单元是索引下标是从0开始的。

注意:当内存不空间不够时会从磁盘中分割内存,在CDEF的那个盘分割可以在系统的虚拟内存管理中设置!