第二章 课后习题
(1)内核编程环境和用户应用程序编程环境有哪些不同?
编程模式可分为两种:用户模式和内核模式。
其中用户应用程序的编程采用的是用户模式,这里都是在操作系统的隔离环境中完成的,也就是说对于这个模式来说不用考虑通用寄存器,内存是共享的,可通过操作系统实现进程间的资源共享,这属于单进程编程,利用的都是进程内的资源,不用担心会产生什么冲突。
内核编程使用的是内核模式编程,其内核属于操作系统的一个模块供各个进程调用,在内核空间中资源都是共享的并且不受操作系统的限制,很容易发生冲突。
(2)Windows有哪几种驱动开发模型?它们的发展现状如何?
model是根据操作系统的类型不同而取名的,有KDM(windows NT),WDM(windows 98 —— windows 2000),WDF(WDM的升级版),一脉相承的,不用担心过时。
(3)什么是用户空间?什么事内核空间?
进程的空间实际上被分成两个部分,一部分是进程独立使用的用户空间,一部分是容纳操作系统内核的内核空间。具体到4G内存控件的32位windows系统上,低2G是用户空间,高2G是内核空间。
(4)内核模块运行在什么进程环境下?
内核模块无处不在,内核模块属于操作系统的一个部分,为各进程提供服务,也就是说每个进程中都有可能运行有内核模块,但是内核模块一般是通过系统system进程进行加载的。
(5)请简述驱动对象、设备对象、请求之间的关系。
驱动对象、设备对象、请求
内核编程采用的是面向对象的编程思想来进行编程的,把每个事物都看成一个对象。而驱动对象可以说是一个驱动程序也可以说是一个内核模块。设备对象是唯一能接受请求的对象,而设备对象是在内核模块中建立的,也就是说设备对象属于驱动对象,设备对象在接收到请求以后交由驱动对象的分发函数进行处理。请求,内核模块之间的交互都是通过一个个的请求实现的,比如说申请资源、读取信息等,一般使用IRP请求,一个请求有可能要历经多个设备,所以需要暂时存储中间变量的栈空间。
(6)请简述如何判断对一个全局变量的访问是否要加自旋锁或者互斥体使之序列化。
当一个程序有可能会运行在多线程环境下的时候就需要保证其是多线程安全的,也就是说不能出现线程冲突。对一个全局变量的访问时候要加自旋锁或互斥体使之序列化,取决于被使用的变量是否影响到保证多线程的安全。
(7)请简述如何估计当前代码的中断级。
1、如果调用途径没有特殊情况,中断级和调用源一样
2、获自旋锁中断级升高,失自旋锁中断级降低