MAC OS X系统

VM映射和入口表

虚拟内存(VM)映射是任务地址空间的实际表示。每个任务都有自己的VM映射。映射是由vm_map结构来表示的。线程没有所谓的映射,因为它们共享其所属的任务的VM映射。

VM映射是一段内存区域的双向链接列表,这段内存区域被映射到了进程地址空间。每个内存区域都是一段虚拟连续内存地址(不必是连续的物理内存),用一个开始地址和结束地址来描述,和其他的元数据一样,如保护标志,可以是可读、可写和可执行的任意组合。这一区域由vm_map_entry结构来表示。如果再次分配的内存与已有内存相邻,或者内存被分割成更小的区域,那么VM映射入口表可以和相邻的入口表相融合。如果入口表所描述的地址范围的保护标志被修改,那么就会发生分割现象,因为保护标志只能在VM映射入口表上设置。

VM对象

VM映射入口表即可以指向一个VM对象,也可以指向一个VM子映射(VM submap)。子映射包含了其他的映射关系(也是VM映射)。子映射用于在不同地址空间共享内存。VM对象表示一个位置,或者是如何访问被描述的内存。对象下面的内存页并不会存在于物理内存中,但可以在放在扩展备份存储(OS X上的硬盘)上。这种情况下,VM对象会携带有关如何在扩展的页中进行分页的信息。转移到备份存储,或从备份存储中转移回来是由分页器来完成的。

VM对象以页为单位来描述内存。XNU中的一个页的大小是4096字节。虚拟页由vm_page结构描述。一个VM对象可能包含很多页,但一个页只能关联到一个VM对象。

当内存需要在任务间共享内存时,VM映射入口表将通过子映射来指向外部地址,而不是通过VM对象。这在使用共享库时会经常发生。

加载和卸载内核扩展

sudo chown -R root:wheel HelloWorld.kext

sudo kextload HelloWorld.kext

kextstat

sudo kextunload HelloWorld.kext

 

I/O Kit Framework

另外一个驱动作为nub的例子是,驱动接收来自用户应用程序的连接,这实际上也是更为常见的场景。如前所述,对于每一个用户应用程序到驱动的连接,I/O Kit都会实例化一个新的对象,即“user client”(用户代理)来处理来自应用程序的控制请求,并将它们传递给驱动。和主要驱动类一样,用户代理类也是一个I/O Kit服务,继承自相同的IOService基类,和所有其他驱动对象一样。每个用户代理使用主驱动对象作为它的提供程序类。但是,与主驱动不同的是,用户 代理 无需检查匹配,因为驱动为它的用户代理指定了特定的类名。

驱动类

正如我们在前面所看到的,当I/O Kit加载一个驱动时,它会根据驱动属性列表文件的指定来实例化一个类。该类必须是IOService类的子类,要么是直接子类,要么是IOService类的子类派生出来的子类。IOService类提供了虚函数,在驱动生命期内的任何时间点都可以被调用。例如,当它被加载并初始化后,或者当它检测其提供程序时,或者当驱动被停止时。因为这些方法在IOService类的定义中被声明为虚函数,它们可以在继承自IOService的自定义驱动中被很容易地重载。

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值