第2章 内核编程环境及其特殊性

第二章 课后习题

(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、获自旋锁中断级升高,失自旋锁中断级降低

时间: 2024-10-06 16:52:34

第2章 内核编程环境及其特殊性的相关文章

javascript数据结构和算法 第一章(Javascript编程环境和模型) 一

这一章介绍了我们在这本书中使用的描述各种数据结构和算法的Javascript的编程环境和编程架构. Javascript 环境 Javascript 在很长一段时间都是被作为web浏览器内置脚本编程语言来使用. 然而,在过去几年里,javascript编程环境得到了极大的发展,他们可以使javascript在桌面或者服务端运行. 在我们这本书中,我们使用其中的一个javascript环境:javascript shell:是Mozilla公司的javascript环境,被称为SpiderMonk

内核编程学习小结

The road to success was trial and error development, recompilation, and lots of crashes. 寒假过去一个月,计划很多时候也没法跟上.不过总体上来说,还是学习和收获了一些东西的.过去的事情不能改变,所以也不必过于纠结和懊悔.假期的前期还计划对英语进行系统性的学习,我个人任务是画错时间,用错力了,看专业英语的时间完全可以用开翻译与内核编程有关的开发文档,这样更有意义一些,在发现问题后也没办法放下,这是很不好的一个缺

Windows核心编程之核心总结(第三章 内核对象)(2018.6.2)

学习目标 第三章内核对象的概念较为抽象,理解起来着实不易,我不断上网找资料和看视频,才基本理解了内核对象的概念和特性,其实整本书给我的感觉就是完整代码太少了,没有多少实践的代码对内容的实现,而且书本给的源码例子,有太多我们不知道的知识,并且这些知识对本章主要内容来说是多余的,所以我们理解起来也非常困难.为了更好的学习这章,我补充了一些辅助性内容.这一章的学习目标:1.Windows会话和安全机制2.什么是内核对象?3.使用计数和安全描述符4.内核对象句柄表5.创建内核对象6.关闭内核对象7.跨进

初探linux内核编程,参数传递以及模块间函数调用

一.前言                                  我们一起从3个小例子来体验一下linux内核编程.如下: 1.内核编程之hello world 2.模块参数传递 3.模块间函数调用 二.准备工作                           首先,在你的linux系统上面安装linux头文件,debian系列: 1 $:sudo apt-get install linux-headers-`uname -r` 安装后,在你的/lib/modules/目录下有你刚

[CSAPP笔记][第十二章并发编程]

第十二章 并发编程 如果逻辑控制流在时间上是重叠,那么它们就是并发的(concurrent).这种常见的现象称为并发(concurrency). 硬件异常处理程序,进程和Unix信号处理程序都是大家熟悉的例子. 我们主要将并发看做是一种操作系统内核用来运行多个应用程序的机制. 但是,并发不仅仅局限于内核.它也可以在应用程序中扮演重要的角色. 例如 Unix信号处理程序如何允许应用响应异步事件 例如:用户键入ctrl-c 程序访问虚拟存储器的一个未定义的区域 其他情况 访问慢速I/O设备 当一个应

第十二章 并发编程 学习笔记

第十二章 并发编程 进程是程序级并发,线程是函数级并发. 三种基本的构造并发程序的方法: 进程:每个逻辑控制流是个一个进程,由内核进行调度和维护. I/O多路复用:应用程序在一个进程的上下文中显式地调度他们自己的逻辑流. 线程:运行在单一进程上下文中的逻辑流,由内核进行调度. 12.1 基于进程的并发编程 构造并发程序最简单的方法就是用进程. 使用大家都很熟悉的函数例如: fork exec waitpid 关于在父.子进程间共享状态信息:共享文件表,但不共享用户地址空间. 进程又独立的地址空间

第十二章 并发编程

第十二章 并发编程 三种基本的构造并发程序 进程:每个逻辑控制流是一个进程,由内核进行调度,进程有独立的虚拟地址空间 I/O多路复用:逻辑流被模型化为状态机,所有流共享同一个地址空间 线程:运行在单一进程上下文中的逻辑流,由内核进行调度,共享同一个虚拟地址空间 常用函数: fork exec waitpid 基于I/O多路复用的并发事件驱动服务器 事件驱动程序:将逻辑流模型化为状态机. 状态机: 状态 输入事件 转移 对于状态机的理解,参考EDA课程中学习的状态转换图的画法和状态机. 整体的流程

LPC基础教程-Lpc程序和编程环境 mudos 加载原理

编程环境 通常我们所见到的Mud大多是LpMud.LpMuds使用Unix的指令和文件结构.如果你对Unix有所了解,那么LpMud中的一些指令和它的文件结构与普通的Unix基本一样.如果你从未使用过Unix,那么它与Dos不同的是在文件的路径用"/",而不是Dos的"/".一个典型的LpMud的文件是这样的: /clone/player/player.c 其中"/clone/player/"是路径,player.c是文件名. 在多数的LpMud

C++windows内核编程笔记day13 进程、线程与信号量

Windows进程 进程是一个容器,包含程序执行需要的代码.数据.资源等信息, windows进程的特点: 每个进程都有自己的ID号 每个进程都有自己的地址空间,进程之间无法访问对方的地址空间. 每个进程都有自己的安全属性 每个进程至少包含一个线程. 获取和释放环境信息 GetEnvironmentStrings FreeEnvironmentStrings 获取或设置 本程序的环境变量 GetEnvironmentVariable SetEnvironmentVariable 示例: char