如何深刻理解“多道程序设计”,“微内核调试器”

答:指令跟踪是指为该进程而执荇的指令序列

通常那些事件会导致创建一个进程?

答:新的批处理作业;交互登录;操作系统因为提供一项服务而创建;由现有的进程

Φ的进程模型请简单定义每个状态。

:进程做好了准备只要有机会就开始执行。

:进程在某些事件发生前不能执行如

程,操作系统還没有把它加入到可执行进程组中

:操作系统从可执行进程组

中释放出的进程,或者是因为它自身停止了或者是因为某种原因被取消。

抢占一个进程是什么意思

答:处理器为了执行另外的进程而终止当前正在执行的进程,这就叫进程抢占

什么是交换,其目的是什么

答:交换是指把主存中某个进程的一部分或者全部内容转移到磁盘。当主存中没有处

于就绪态的进程时操作系统就把一个阻塞的进程換出到磁盘中的挂起队列,从而使

另一个进程可以进入主存执行

答:有两个独立的概念:进程是否在等待一个事件(阻塞与否)以及进程是否已经被

的组合,需要两个阻塞态和两个挂起态

进程可能是或不是正在等待一个事件。如果是阻塞条

阻塞事件的发生不会使进程竝即被执行。

可以通过代理把这个进程置于挂起态代理可以是进程自己,也可以是父进程或操作

除非代理显式地命令系统进行状态转换否则进程无法从这个状态中转移。

对于哪类实体操作系统为了管理它而维护其信息表?

列出进程控制块中的三类信息

答:进程标识,处理器状态信息进程控制信息。

为什么需要两种模式(用户模式和内核调试器模式)

答:用户模式下可以执行的指令和访问的内存區域都受到限制。这是为了防止操作系

统受到破坏或者修改而在内核调试器模式下则没有这些限制,从而使它能够完成其功能

操作系統创建一个新进程所执行的步骤是什么?

给新进程分配一个唯一的进程标识号

创建或扩充其他的数据结构。

中断和陷阱有什么区别

答:中断与当前正在运行的进程无关的某些类型的外部事件相关,如完成一次

作陷阱与当前正在运行的进程所产生的错误或异常条件相关,如非法的文件访问

模式切换和进程切换有什么区别?

答:发生模式切换可以不改变当前正处于运行态的进程的状态发生进程切换时,一

个正在执行的进程被中断操作系统指定另一个进程为运行态。进程切换需要保存更

}
  • 一个藏匿bug的内核调试器版本
  • 相关內核调试器代码的知识和运气

2. 在跟踪bug的时候掌握的信息越多越好。

1. 内核调试器bug多种多样产生的原因有很多:从错误代码(没有把正确嘚值存放在恰当的位置);到同步时发生的错误(共享变量锁定不当);再到错误的管理硬件(给错误的控制寄存器发送错误的指令)。

2. 從降低所有程序的运行性能到毁坏数据再到使得系统处于死锁状态都可能是bug发作时的症状

3. 从隐藏在源代码中的错误到展现在目击者面前嘚bug,往往是经历一系列连锁反应的事件才可能触发的

printk()是内核调试器提供的格式化打印函数,除了和C库提供的printf()函数功能相同外还有一些自身特殊的功能

1.健壮性是printk()函数最容易让人们接受的一个特质,在任何时候内核调试器的任何地方都能调用它

除非在启动过程的初期就要在终端输出,否则可以认为printk()在什么情况下都能工作

  • 可以在中断上下文和进程上下文中被调用
  • 可以在任何持有锁时被调用
  • 可以在多處理器上同时被调用,调用者不必使用锁

2.printk()函数也会有漏洞,解决办法是提供一个变体函数early _ printk()但这种办法在某些硬件体系结构上无法实现,缺少可移植性

1.printk()可以指定一个日志级别,内核调试器根据这个级别来判断是否在终端上打印消息内核调试器把级别比某个特萣值低的所有消息显示在终端上。

2. KERN_ WARNING和KERN_ DEBUG都是简单的宏定义加进printk()函数要打印的消息的开头。内核调试器用这个指定的记录等级和当前终端的記录等级console_loglevel来决定是不是向终端上打印

3.如果没有指定一个等级记录,函数会选用默认的DEFAULT _ MESSAGE _ LOGLEVEL现在的默认等级为KERN _ WARNING。但默认值将来存在变化性所以还是应该指定一个记录等级。

5.有两种赋予记录等级的方法:

  • 保持终端的默认记录等级不变给所有调试信息KERN _ CRIT或更低的等级。
  • 给所有调試信息KERN _ DEBUG等级调整终端的默认记录等级。

内核调试器消息都被保存在一个环形队列中该缓冲区的大小可以在编译时通过设置CONFIG _ LOG _ BUF _ SHIFT進行调整,在单处理器的系统上默认值是16kb也就是说内核调试器在同一时间只能保存16kb的内核调试器消息,再多的话新消息就会覆盖老消息读写都是按照环形队列方式操作的。

  • 优点:健壮性在中断上下 文中也可以方便的使用;简单性,使记录维护起来更容易
  • 缺点:可能會丢失消息。

1.在标准的Linux系统上用户空间的守护进程klogd从记录缓冲区中获取内核调试器消息,再通过syslogd守护进程将他们保存在系统日志文件Φ

2.klogd:既可以从/proc/kmsg文件中,也可以通过syslog()系统调用读取获得的内核调试器信息默认情况下选择读取/proc方式实现。两种情况klogd都会阻塞直到有新嘚内核调试器消息可供读出,被唤醒之后默认处理是将消息传给syslogd。在启动时可以通过-c标志来改变终端的记录等级。

1.oops是内核调试器告知鼡户有不幸发生的最常用的方式

2.因为内核调试器是整个系统的管理者,不能采取像在用户空间出现运行错误时使用的那些简单手段因為他很难自我修复,也不能将自己杀死只能发布oops,过程为:向终端上输出错误消息、输出寄存器中保存的信息、输出可供跟踪的回溯线索通常发布oops之后,内核调试器会处于一种不稳定状态

  • 发生在中断上下文:内核调试器无法继续,会陷入混乱导致系统死機
  • 发生在idle进程或init进程(0号进程和1号进程),同上
  • 发生在其他进程运行时内核调试器会杀死该进程并尝试着继续执行
3.oops中包含的重要信息:

寄存器上下文和回溯线索

  • 回溯线索:显示了导致错误发生的函数调用链,以便我们观察发生了什么
  • 寄存器上下文信息:帮助冲进引发问题的现场。

回溯线索中的地址需要转化成有意义的符号名称才可以方便使用需要调用ksymoops命令,还必须提供编译内核调试器时产生的System.map如果用的是模块,还需要一些模块信息调用方法:

现在的版本中不需要使用sysmoops这个工具,因为可能会发生很多问题新版本Φ引入了kallsyms疼,可以通过定义CONFIG _ KALLSYMS配置选项启用

18.5 内核调试器调试配置选项

在编译时,为了方便调试和测试内核调试器玳码内核调试器提供了许多配置选项。这些选项都在内核调试器配置编译器的内核调试器开发菜单中都依赖于CONFIG_ DEBUG_ KERNEL。

1.一些內调用可以用来方便标记bug提供断言并输出信息。最常用的两个是BUG()和BUG_ON()当被调用时会引发oops,导致栈的回溯和错误信息的打印

2.大部分体系紦BUG()和BUG_ON()定义成某种非法操作,这样自然会产生需要的oops可以把这些调用当做断言使用,想要断言某种情况不该发生:

3.引用panic()可以引发更严重的錯误不但会打印错误信息,还会挂起整个系统

4.dump_stack()只在终端上打印寄存器上下文和函数的跟踪线索。

18.7 神奇的系统请求键

1.該功能可以通过定义CONFIG _ MAGIC _ SYSRQ配置选项来启用SysRq(系统请求)键在大多数键盘上都是标准键。

2.当该功能被启用时无论内核调试器出于什么状态,嘟可以通过特殊的组合键和内核调试器进行通信

3.除了配置选项以外,还要通过一个sysctl用来标记该特性的开或关需要启动它时使用如下命囹:

18.8 内核调试器调试器的传奇

1.可以使用标准的GNU调试器对正在运行的内核调试器进行查看。针對内核调试器启动调试器的方法与针对进程的方法大致相同:

  • vmlinx:未经压缩的内核调试器映像区别于zImage或bImage,它存放于源代码树的根目录上
  • /proc/kcore作為一个参数选项,是作为core文件来用的通过它能够访问到内核调试器驻留的高端内存。只有超级用户才能读取此文件的数据

2.可以使用gdb的所有命令来获取信息。

3. 如果编译内核调试器的时候使用了-g参数(在内核调试器的Makefile文件的CFLAGS变量中加入-g)gdb还可以提供更多的信息

1.kgdb是一个补丁 ,可以让我们在远端主机上通过串口利用gdb的所有功能对内核调试器进行调试

这需要两台计算机:第一台运行带有kgdb补丁的内核调试器,第②台通过串行线使用gdb对第一台进行调试

2.通过kgdb,gdb的所有功能都能使用:

1.一般情况下只要保留原有的算法而把你嘚新算法加入到其他位置上,基本就能保证安全

可以把用户id(UID)作为选择条件来实现这种功能,通过某种选择条件安排到底执行哪种算法:

2.除了uid为7777的用户以外,其他所有的用户都是用的老算法可以创建一个UID为7777用户,专门用来测试新算法

如果代码与进程無关,或者希望有一个针对所有情况都能使用的机制来控制某个特性可以使用条件变量。这比使用UID更简单只需要创建一个全局变量作為一个条件选择开关。如果该变量为0就使用某一个分支上的代码;否则,选择另外一个分支可以通过某种接口提供对这个变量的操控,也可以直接通过调试器进行操控

1.这种方法常用于使用者需要掌握某个特定事件的发生规律的时候。

2.方法是创建统计量并提供某种机制访问其统计结果。

3.这种实现并非是SMP安全的更好的方式是用原子操作。

当系统的调试信息过多的时候有两种方式可以防止这类问题发生:

      限制调试信息,最多几秒打印一次可以根据自己的需要调节频率。

  • 这种方法是要调试信息至多输出几次超过次数限制后就不能再输出。
    这种方法可以用来确认在特定情况下某段代码的确被执行了

注:不管哪种方法用到的变量需要是静态的、局部的。并且限制在函数的局部范围以内这样才能保证变量的值在经历多次函数调用后仍然能够保留下来。不是SMP安全或抢占安全的哽好的方式是用原子操作。

18.10  使用二分查找法找出罪恶的变更

1.Git源码管理工具提供了一个有用的二分搜索机制如果使用Git来控制Linux源码树的副本,则Git将自动运行二分搜索进程此外,Git会在修订版本中进行二分搜索可以具体找到哪次提交的代码引发了bug。

告知git要进行二分搜索:
提供┅个出现问题的最早内核调试器版本:
当前版本就是引发bug的最初版本的情况下使用这条命令:
 提供一个最新的可正常运行的内核调试器版夲:

2.这之后git就会利用二分搜索法在Linux源码树中,自动检测正常的版本内核调试器和有bug的内核调试器版本之间那个版本有隐患然后再编译、运行以及测试正被检测的版本。

如果这个版本运行有异常:

3.对于每一个命令Git将在每一个版本的基础上反复二分搜索源码树,并且返回所查的下一个内核调试器版本直到不能再进行二分搜索位置,最终Git会打印出有问题的版本号

}

2.1 操作系统的目标和功能
2.1.1 作为用户/計算机接口的操作系统
  1. 操作系统是应用程序和计算机硬件间的接口三个目标:方便、有效、扩展能力

  2. ? (1) 系统程序包括实用工具或库程序、操作系统等,操作系统是最重要的系统程序

    ? (2) 计算机系统中的三种重要接口

    ? 1) 指令系统体系结构(ISA):定义了机器语言指令系统是软硬件嘚分界线,可分为用户级ISA和系统级ISA

    ? 2) 应用程序二进制接口(ABI):定义了操作系统的系统调用接口

    ? 3) 应用程序编程接口(API):允许应用程序访问系统嘚硬件资源和服务

  3. (1) 程序开发:提供应用程序开发工具

    (2) 程序运行:把指令和数据加载到内存、初始化I/O设备等

    (3) I/O设备访问:用户可使用简单的读寫操作来访问I/O设备

    (5) 系统访问:控制对共享或公共系统的访问

    (6) 错误检测和响应:对内部和外部硬件错误、软件错误等提供响应以清楚错误條件,响应可以是终止引起错误的程序、重试操作或给应用程序报告错误

    (7) 记账:收集对各种资源的利用率的统计数据

2.1.2 作为资源管理器的操莋系统
  1. 计算机是一组资源这些资源用于移动、存储和处理数据,操作系统管理这些资源

  2. (1) 操作系统与普通计算机软件一样都是由处理器執行的一组程序

    (2) 操作系统会释放控制,且必须依赖处理器才能恢复控制

  3. 操作系统的一部分在内存中包括内核调试器程序(kernel/necleus)和当前使用的其怹操作系统程序

2.1.3 操作系统的易扩展性

? 操作系统具有易扩展性的需求来自于,硬件升级和新型硬件的出现、新的服务、纠正错误

2.2 操作系統的发展史
  1. (1) 调度:用户预订机器时间若提前完成工作会导致计算机闲置,若未在分配时间内完成工作则在解决问题前会被强制停止

    (2) 在程序运行前的准备工作需要花费大量的时间

2.2.2 简单批处理系统
  1. 简单批处理方案的中心思想:使用监控程序(monitor)软件。操作员将作业按顺序组织成批再把批作业提供给监控程序, 每个程序完成作业后返回监控程序监控程序自动加载下一个程序

  2. 监控程序控制事件的顺序

    (2) 其他部分如實用程序、公用函数等,只在用户程序调用时载入

    (3) 监控程序读取作业放置在用户程序区域,控制权交给作业作业完成后,控制权返回給监控程序读取下一个作业

  3. 控制权交给作业,意味着处理器当前取的和执行的都是用户程序中的指令;控制权返回给监控程序 意味着處理器当前从监控程序中取指令并执行指令

  4. (1) 监控程序完成了调度功能,完成作业后处理器自动加载下一作业

    (2) 监控程序改善了作业的等待時间,每个作业中的指令均以作业控制语言(Job Control Language, JCL)的基本形式给出

  5. 监控程序(批处理操作系统)的其他硬件功能

    (1) 内存保护:用户程序运行时不能改變包含监控程序的内存区域

    (2) 定时器:防止一个作业独占系统,定时器时间到则停止用户程序

    (3) 特权指令:特权指令只能由监控程序执行如I/O指令

  6. (1) 用户程序以用户模式(user mode)执行,受到内存保护和特权指令限制

    (2) 监控程序以内核调试器模式(kernel mode)执行可执行特权指令和访问内存保护区域

  7. 批处悝操作系统的系统开销

    (1) 一部分内存交付给监控程序

    (2) 监控程序消耗了一部分机器时间

2.2.3 多道批处理系统
  1. I/O设备相对于处理器而言速度太慢,处理器仍经常处于空闲状态
  2. 多道程序设计(multiprogramming)或多任务处理(multitasking):扩展存储器以保存多个程序处理器在它们之间切换,当一个作业需要等待I/O时切换箌另一个并不在等待I/O的作业
  3. 多道批处理系统的依赖硬件:支持I/O中断和直接存储器访问(DMA)的硬件
  4. 多道批处理系统还必须有内存管理(memory management)和调度算法
  1. 汾时(time sharing)技术:多个用户分享处理器时间,操作系统控制每个用户程序在很短时间内交替执行通过设计使得系统响应时间接近于专用计算机嘚响应时间

  2. 时间片技术:在固定的时间间隔内,当前用户被抢占另一用户被载入

  3. 第一个分时操作系统:CTSS兼容分时系统

    只有当新来的程序需要重写用户存储空间时,用户存储空间才被写出

  4. 分时和多道程序设计的问题

    (1) 内存中有多个作业时保护其不互相干扰

    (2) 多个交互用户时,對文件系统进行保护

    (3) 处理资源竞争问题

  1. 操作系统开发的4个重要领域:进程、内存管理、信息保护和安全、调度和资源管理
  1. 计算机系统发展嘚三条主线:多道程序批处理操作、分时和实时事务系统

    (1) 多道程序批处理操作:处理器通过切换不同程序使处理器和I/O设备同时保持忙状態

    (2) 分时:同时支持多个用户,且及时响应每个用户的要求

    (3) 实时事务处理系统:同时支持多个用户开始程序、执行作业及各种各样的应用程序如多个用户同时对数据库进行查询和修改的航空公司预订系统

  2. 早期系统软件运行错误的常见原因

    (1) 不正确的同步:信号丢失或接收到重複信号

    (3) 不确定的程序操作:程序调度顺序可能对某个程序的输出结果造成影响

    (4) 死锁:多个程序相互挂起等待,等待对方释放自己想要的资源

  3. (1) 一段可执行的程序

    (2) 程序所需要的相关数据(变量、工作空间、缓冲区等)

    state)是操作系统管理进程及处理器正确执行进程所需的所有信息,包括各种处理器寄存器的内容(程序计数器、数据寄存器)、操作系统使用的信息(进程优先级、进程是否在等待特定I/O事件的完成)(大部分)执行上丅文和进程是分开存储的

  4. (1) 每个进程(程序、数据和部分上下文信息)分配一块存储器区域,并由操作系统维护的进程表记录

    (2) 进程表:每个进程嘚表项包括指向包含进程的存储块地址的指针、该进程的部分或全部执行上下文
    (3) 保存进程执行上下文的重要寄存器

    1) 进程索引寄存器(process index register):当湔正在控制处理器的进程在进程表中的索引

    2) 程序计数器(program counter):指向该进程中下一条待执行的指令

    3) 基址寄存器(base register):保存进程所在的存储器区域的开始地址

    4) 界限寄存器(limit register):保存进程所在存储器区域的大小

  5. 一个分配了资源的进程可分解为多个并发的线程(thread)

  1. 操作系统的5项存储器管理职责:

    (1) 进程隔离:操作系统必须保护独立的进程,防止其互相干扰

    (2) 自动分配和管理

    (3) 支持模块化程序设计

    (4) 保护和访问控制:操作系统允许一部分内存可甴各种用户以各种方式进行访问的同时保护其完整性

    (5) 长期存储:在计算机关机后长时间地保存信息

  2. (1) 信息保存在文件对象中,文件系统实現了长期存储

    (2) 对操作系统来说文件是访问控制和保护的一个有用单元

  3. (1) 目的:为了满足有多个用户作业同时驻留在内存中的要求

    (2) 虚存机制尣许程序以逻辑方式访问存储器,而不考虑物理内存上可用的空间数量

    1) 进程由许多固定大小的块即页组成

    2) 程序通过虚地址访问字,虚地址包括页号和页中的偏移量

    3) 分页系统提供了程序中使用的虚地址(virtual address)和内存中的实地址(real address)或物理地址之间的动态映射

    (4) 一个进程的所有页保留在磁盘中,进程执行时一部分页调入内存中存在内存的帧中(每帧的大小等于页大小)

    (5) 若需要访问的某页不在内存中,则在检测到后安排载入缺页(misssing pages)

  4. 给每个进程分配唯一的不重叠的虚存空间可实现进程隔离;使两个虚存空间的一部分重叠可实现内存共享

  5. (1) 程序(处理器)通过向虚地址訪问,内存管理单元(地址转换机制)将虚地址映射成真实的内存地址若所访问的虚地址不在内存中则进行内存和辅存的数据交换

    (2) 目标:开發开销少的地址转换机制

    ? 开发能减小各级存储器间通信量得存储分配策略

2.3.3 信息保护和安全
  1. 与操作系统相关的4类安全和保护问题

    (1) 可用性:保护系统不被中断

    (2) 保密性:保证用户不能读取未授权访问的数据

    (3) 数据完整性:保护数据不被未授权修改

    (4) 认证:涉及用户身份的正确认证和消息或数据的合法性

2.3.4 调度和资源管理
  1. 管理各种可用资源(内存空间、I/O设备、处理器),并调度各种活动进程来使用这些资源是操作系统的关鍵任务

  2. 资源分配和调度策略考虑因素

    (1) 公平性:给竞争使用同一资源的所有进程提供几乎同等的访问机会

    (2) 有差别的响应性

    (3) 有效性:操作系统唏望获得最大的吞吐量和最小的响应时间

  3. 多道程序设计中的进程调度和资源分配

    (1) 操作系统维护多个队列:短程队列、长程队列、I/O队列,每個队列代表等待某些资源的进程列表

    (2) 短程队列:在内存中等待处理器可用并随时准备运行的进程处理器选择执行哪个进程的策略有两种

    1) 時间片轮转(round-robin)技术:依次给队列中的每个进程分配一定时间

    2) 给不同的进程分配不同的优先级,并据此进行调度

    (3) 长程队列:等待使用处理器的噺作业列表把长程队列中的作业转移倒短程队列后才能执行

2.4 现代操作系统的特征
  1. 现代操作系统有了新的硬件发展、应用程序与安全威胁

    (1) 硬件发展:多处理器、高速增长的机器速度、高速网络连接、大容量存储设备

    (2) 安全威胁:互联网,病毒、蠕虫和黑客技术

  2. 微内核调试器体系结构、多线程、对称多处理、分布式操作系统、面向对象设计

  3. (2) 微内核调试器体系结构:只给内核调试器分配最基本的功能其他操作系統服务由运行在用户模式且与应用程序类试的进程提供

  4. (2) 进程(process):一个或多个线程和相关系统资源的集合

    (3) 将执行一个应用程序的进程划分为多個线程,处理器在不同的线程间来回切换

  5. (1) 硬件体系结构+操作系统行为

    硬件体系结构:对称多处理器

    操作系统行为:调度进程或线程到所有嘚处理器上运行

    1) 性能:若能让工作在不同的处理器上并行完成则性能更加

    2) 可用性:单个处理器失效不会导致机器停止

    3) 增量增长:通过添加处理器可提高性能

    4) 可扩展性:厂家根据系统配置的处理器数量提供不同性能的产品

  6. 一群实体(计算机),每个实体都有自己的内存、外存和其他I/O模块

  1. 容错性指系统或部件在发生软/硬件错误时能继续正常运行的能力
  1. 与容错性相关的基本度量指标是可靠性、平均失效时间和可用性

  2. 从时刻t=0开始系统正确运行,到时刻t时系统保持正确运行的概率

    正确运行指一系列程序正常运行保护数据不被意外地修改

  3. 平均修复时间(MTTR):修复或替换错误部分所花费的平均时间

  4. 可用性(availability):系统能够有效服务用户请求的时间段,定义为某个给定的时刻和条件下实体正常运行嘚概率

    (2) 正常运行时间(uptime):系统可用的时间

  1. 错误定义(IEEE):不正确的硬件或软件状态,该状态由环境、设计错误、程序错误、数据结构错误所导致嘚组件错误、操作错误、物理干扰造成

  2. (1) 硬件设备或组件缺陷如短路或线路损坏

    (2) 计算机程序中不正确的步骤、过程或数据定义

  3. (1) 永久性错误:在故障部分替换或修复前一直存在,如硬盘磁头损坏、软件错误、通信部件损坏

    1. 瞬时性错误:仅发生一次如冲激噪声造成的位传输错誤等

    2. 间歇性错误:如连接松动导致的错误

  4. (1) 空间(物理)冗余:使用多个组件同时执行相同功能,或设置一个可用组件作为备份

    (2) 时间冗余:检测箌错误时重复某一功能或操作对临时性错误有效

    (3) 信息冗余:通过复制或编码数据的方式来检测和修复位数据

操作系统软件提高容错性的技术

  1. 进程隔离:进程在内存、文件存取和执行过程中相互隔离

  2. 虚拟机:提供更高程度的应用隔离和错误隔离

  3. (1) 检测点是应用程序状态的一个副本

    (2) 回滚是先前存储的检测点重新开始执行

    (3) 该技术可用于从瞬时错误、永久性硬件故障、某些类型的软件异常中恢复

2.6 多处理器和多核操作系统设计考虑因素
2.6.1 对称多处理器操作系统设计考虑因素
  1. SMP系统中,内核调试器可在任一处理器上执行典型情况为每个处理器分别从可用进程池获取任务并进行自调度。内核调试器可由多个进程或多个线程构造而成允许各部分并行执行

  2. SMP系统设计关键问题

    (1) 并发进程或线程:内核调试器程序应可重入,以使多个处理器能同时执行同一段内核调试器代码

    (2) 调度:任何一个处理器都可执行调度增加了执行调度策略、保证调度相关数据结构不被损坏的复杂度

    (3) 同步:多个活跃进程访问共享地址空间或共享I/O自愿地情况

    (4) 内存管理:不同处理器上的分页机制,偠实现多处理器共享页或段时的数据一致性执行页面置换

    (5) 可靠性和容错性:出现处理器故障时,操作系统其他部分应识别出发生故障的處理器

2.6.2 多核操作系统设计考虑因素
  1. 主要挑战:如何有效利用多核计算能力智能且有效地管理芯片上的资源

  2. 从三个层次开发多核系统潜在嘚并行能力

    (1) 指令级并行:每个核内部的硬件并行

    (2) 处理器层次上的潜在并行能力:在每个处理器上多道程序或多线程程序的执行能力

    (3) 多核层佽:多核上一个应用程序以并发多进程或多线程形式执行的潜在并行能力

  1. 应用程序开发者决定如何将应用分割为多个独立运行的子任务,使其以多线程或多进程形式并行执行

  2. (1) 为一个进程分配一个或更多的核让处理器处理进程

    (2) 丢弃内核调试器模式和用户模式的区别,让操作系统成为管理程序应用程序自己负责资源管理,操作系统负责分配处理器和内存资源

  1. Windows NT包含了内核调试器和执行体以及一系列面向对象嘚特征
  2. Windows 8从根本上改变了操作系统的内核调试器结构,尤其是线程管理和虚拟内存管理
  1. (1) Windows操作系统将面向应用的软件(运行在用户模式)和操作系統核心软件(运行在内核调试器模式)分开

    (2) 操作系统核心软件包括在内核调试器模式下运行的执行体、内核调试器、设备驱动器和硬件抽象层

    (3) 內核调试器模式下运行的软件可以访问系统数据和硬件用户模式下运行的软件则不可访问

  2. (1) Windows的体系结构是高度模块化

    (2) 每个系统函数由一個操作系统部件管理,操作系统的其余部分和所有应用程序通过相应的部件使用标准接口访问该函数

  3. (1) 执行体(Executive):操作系统核心服务如内存管理、进程和线程管理、安全、I/O和进程间通信

    (2) 内核调试器(Kernel):控制处理器的执行,包括线程调度、线程切换、异常和中断处理、多处理器同步内核调试器本身的代码不在线程内执行

    (3) 硬件抽象层(Hardware Abstraction Layer, HAL):在通用的硬件命令和响应与某一特定平台专用的硬件命令和相应之间进行映射,將操作系统从与平台相关的硬件差异中隔离出来

    (4) 设备驱动(Device drivers):用于扩展执行体的动态库包括硬件设备驱动程序,及实现文件系统、网络协議等系统扩展功能的软件构件

  4. (1) I/O管理器:提供应用程序访问I/O设备的一个框架负责为进一步的处理分发合适的设备驱动程序

    (2) 高速缓存管理器

    1) 讀:使最近访问过的磁盘数据驻留在内存中,以实现快速访问

    2) 写:更新后的数据发送的磁盘前在内存中保留一段时间延迟磁盘写操作,鉯提高基于文件的I/O性能

    (3) 对象管理器:创建、管理和删除Windows执行体对象和用于表示诸如进程、线程和同步对象等资源的抽象数据类型

    (4) 即插即用管理器:决定并加载特定设备的驱动

    (5) 电源管理器:调整各种设备间的电源管理

    (6) 安全访问监控程序:强制执行访问确认和审核产生规则

    (7) 虚存管理器:管理虚拟地址、物理地址和磁盘上的页面文件

    (8) 进程/线程管理器:创建、管理和删除进程和线程对象跟踪进程和线程对象

    (9) 配置管悝器:负责执行和管理系统注册表。系统注册表是保存系统和用户参数设置的数据仓库

    (10) 本地过程调用(Local Procedure Call, LPC)机制:针对本地进程在服务和子系統间进行通信的一套跨进程的高效过程调用机制

  5. 用户模式进程(Windows支持4种基本的用户模式进程)

    (1) 特殊系统进程:管理系统所需的用户模式服务,洳会话管理程序、服务管理程序和登陆进程等

    (2) 服务进程:打印机后台管理程序等服务进程实在Windows系统中后台运行用户模式活动的唯一方法

    (3) 環境子系统:提供不同的操作系统个性化设置(环境)

    (4) 用户应用程序:为充分利用系统功能而为用户提供的可执行程序(EXE)和动态链接库(DLL)

  1. Windows操作系统垺务、受保护子系统和应用程序都采用客户-服务器计算模型构建

  2. (1) Windows为在用户模式进行中实现某些功能提供了丰富的服务,环境子系统和Windows用户模式服务都以通过RPC与客户端进行通信的进程来实现

    (2) 每个服务器进程都等待客户的一个服务请求(如存储服务、进程创建服务或处理器调度服務)

    (3) 客户可以是应用程序或另一个操作系统模块它通过发送消息来请求服务

    (4) 过程:消息从执行体发送到适当的服务器,服务器执行所请求嘚操作并通过另一条消息返回结果或状态信息,再由执行体发送回客户

  3. 客户-服务器体系结构的优点

    (1) 简化了执行体可在用户模式服务器Φ构造各种各样的API

    (2) 提高了可靠性,每个新服务运行在内核调试器之外且有自己的存储空间免受其他服务的干扰

    (3) 为应用程序与服务间通过RPC調用进行通信提供了一致的方法

    (4) 为分布式计算提供了适当的基础

  1. Windows的两个重要特征:支持线程和对称多处理(SMP)

    (1) 操作系统例程可在任何可用的处悝器上,不同例程可在不同处理器上同时执行

    (2) Windows支持在单个进程中执行多个线程同一进程中的多个线程可在不同处理器上同时执行

    (3) 服务器進程可以使用多个线程来处理多个用户同时发出的请求

    (4) Windows提供在进程间共享数据和资源的机制及灵活的进程间通信能力

  1. Windows使用的面向对象的重偠概念

    (1) 封装:一个对象由称为属性的数据项组成,在数据上可以执行称为服务的过程访问对象中数据的唯一方法是引用对象的一个服务,使对象中的数据易于保护

    (2) 对象类和实例:一个对象类是一个模板列出了对象的属性和服务。操作系统可在需要时创建对象的特定实例

    1) 執行体可使用继承来添加新的特性以扩展对象类

    2) 每个执行体类都基于一个基类

    (4) 多态性:Windows内部使用通用API函数集操作任何类型的对象,但部汾API是特定对象类型所特有的

  2. 在用户模式下访问数据时都要使用对象,对象表示的实体有文件、进程、线程、信号、计时器和窗口

  3. 执行体Φ的对象称为内核调试器对象(与用户级对象区分)只能被内核调试器访问

    (1) 应用程序不能直接操作内核调试器对象,而是通过一组执行体支歭的对象操作函数来间接操作对象的

    (2) 创建对象后请求这一创建的应用程序会得到该对象的句柄,句柄实际上是指向被引用对象的指针

  4. Windows中嘚对象可以有名称或无名称

    (1) 无名称:进程创建无名对象后对象管理程序程序返回该对象的句柄

    (2) 有名称:其他进程可以用该名称获得这个對象的句柄

    (3) 进程只希望在其内部使用对象时,一般创建无名对象若希望两个进程同步,则可创建有名对象并把名称传递给另一进程

  5. Windows同步使用处理器时所用的两类对象

    (1) 分派器对象:执行体对象的子集,线程可以在该类对象上等待以控制基于线程的系统操作的分发与同步

    (2) 控制对象:内核调试器组件用来管理不受普通线程调度控制的处理器操作

  1. UNIX由贝尔实验室开发,运行在PDP-7上

  2. 第一个里程碑式的成果:把UNIX系统从PDP-7迻植到了PDP-11上预示着UNIX可成为所有计算机上的操作系统

  3. 第二个里程碑式的成果:用C语言重写了UNIX

  4. 此前认为操作系统必须完全用汇编语言编写,洇为

    (1) 内存容量小且价格贵必须高效使用内存

    (2) 业界对编译器生成代码的质量有顾虑

    (3) 处理器和总线速度相对较慢,应节省时钟周期

  1. (2) 操作系统通常称为系统内核调试器简称内核调试器

    (3) 用户服务和接口,包括命令解释器、其他接口软件和C编译器部分(编译器、汇编器、加载器)

    (4) 用户應用程序和到C编译器的用户接口

  2. (1) 用户程序可以直接调用操作系统服务也可通过库程序调用操作系统服务

    (2) 系统调用接口是内核调试器和用戶的边界;操作系统通过原子例程直接与硬件交互

    (3) 在这两个接口之间,系统主要划分为两部分一个关心进程控制,一个关心文件管理和I/O

  3. 傳统UNIX系统总结S

    (1) 设计在单一处理器上运行

    (2) 内核调试器不通用只支持一种文件系统、进程调度策略和可执行文件格式

    (3) 内核调试器不可扩展,鈈是模块化的不能重用代码

  1. 现代UNIX系统具有现代操作系统特征和模块化结构

    中心为一个以模块化编写的小核心软件,外部为多种功能及接ロ

  1. 最初由Linus Torvalds编写后由多个开发者联合开发
  2. Linux特点:高度模块化且易于配置、跨平台、开源
  1. 大多UNIX系统使用单体内核调试器,而非微内核调试器結构

  2. (1) 未使用微内核调试器的方法但采用了多模块结构

    (3) 模块本质上是内核调试器在运行时可以链接或断开链接的对象文件

  3. Linux可加载模块的两個重要特征

    (1) 动态链接:当内核调试器在内存中运行时,内核调试器模块可被加载和链接到内核调试器也可断开链接并移出内存

    (2) 可堆叠模塊:模块按层次结构排列。被高层客户模块访问时作为库被低层模块访问时作为客户

    (3) 动态链接的优点:简化了配置任务,节省了内核调試器所占的内存空间

    (4) 可堆叠模块的优点

    1. 多个模块的相同代码移入单个模块降低了重复性

    2. 内核调试器可确保所需模块的存在,避免卸载其怹运行模块所依赖的模块并在加载新模块时加载其依赖模块

  4. (1) 每个模块由模块表符号表共同定义

    (2) 符号表列出了在此模块定义并在其他地方用到的符号

    (3) 模块表包含元素:

    1) *next:指向下一个模块的指针

    2) *name:只想模块名的指针

    3) size:模块大小,以内存页计

    8) *syms:指向模块的符号表的指针

    9) *deps:指向被模块引用的模块清单的指针

    10) *refs:指向使用此模块的模块清单的指针

  1. 信号(Signals):内核调试器使用信号向进程提供信息
  2. 系统调用(System calls):进程通过系统调鼡来请求系统服务系统调用大致分为6类:文件系统、进程、调度、进程间通信、套接字和其他
  3. 文件系统(File System):为文件、目录等提供全局的分层命名空间
  4. 字符设备驱动(Character device drivers):管理向内核调试器一次发送/接收1字节数据的设备,如终端、调制解调器和打印机
  5. 块设备驱动(Block device drivers):管理以块为单位向內核调试器发送/接收数据的设备如外存(磁盘)

? Android操作系统:为触屏移动设备设计的基于Linux的操作系统

  1. Android是一个包含操作系统内核调试器、中间件和关键应用的软件栈

  2. 应用:应用层由与用户直接进行交互的所有应用组成,包括一套通用的应用程序如电子邮件客户端、短信系统、ㄖ历、地图、浏览器、联系人等

  3. 应用框架:应用框架层提供高级构建块,为程序员开发程序提供标准化的访问接口

    关键的应用框架组件包括:活动管理器、窗口管理器、包管理器、电话管理器、内容接口、资源管理器、师徒系统、位置管理器、通知管理器、XMPP

  4. 系统库:应用框架下面的一层由两部分组成:系统库和运行库系统库组件是用C或C++编写的实用系统函数集,可被Android系统各个组件使用

    关键系统库包括:界面管理器、OpenGL、媒体框架、SQL数据库、浏览器引擎、仿生LibC

  1. 应用和框架:包括应用及其访问低层服务的API
  2. Android系统服务:分为媒体服务(处理播放和录制媒體文件)、系统服务(处理应用所需的系统功能)
  3. 硬件抽象层(HAL):HAL提供调用核心层设备驱动的标准接口

? 活动是单个可视用户界面组件包括菜单選项、图标和复选框等

  1. Android在Linux内核调试器中增加了两个提升电源管理能力的新功能:报警和唤醒锁

  2. 报警功能:通过运行库中的报警管理器请求垺务,让应用在系统休眠时也能触发警告提醒

  3. 唤醒锁:阻止Android系统进入休眠模式

  1. 操作系统设计的三个目标是什么

  2. 处理器通过在多个进程切換的方式,达到同时处理多个程序的目的

  3. 可执行的程序程序执行所需的数据,及执行上下文共同组成了一个进程

  4. 操作系统是怎样使用进程上下文的

    (1) 内存中的进程表存放着指向程序所在存储器区域地址的指针,以及执行上下文

    (2) 进程执行时程序计数器存放指向下一条将要執行指令的地址,进程索引寄存器存放当前执行进程在进程表中的索引基址寄存器存放当前执行进程在存储器中的起始地址,界限寄存器存放当前进程站用的存储器大小

  5. 列出并简要介绍操作系统的5种典型存储管理职责

    (2) 自动分配和管理

    (3) 程序模块化设计

    (4) 访问控制和包含

  6. 实地址囷虚地址的区别是什么

    虚存机制允许处理器利用虚地址访问其为一种逻辑地址,同一进程的虚地址是连续的;实地址是进程在内存中的粅理地址进程以页的形式存储在内存中,同一进程的实地址不一定连续

  7. 描述时间片轮转调度技术

    (1) 操作系统维护多个队列短程队列、长程队列与I/O设备一一对应的I/O队列,短程队列为随时准备执行的进程

    (2) 采用时间片轮转调度技术处理器在短程队列的进程中不断切换执行。其Φ一种策略是队列中的每个进程平均分配执行时间;另一种策略是,给不同的进程分配优先级优先级高的进程分配得到的时间更多

  8. 解釋单体内核调试器和微内核调试器的区别

    (1) 单体内核调试器:操作系统的多数服务由一个大内核调试器提供

    (2) 微内核调试器:操作系统只将必偠的服务放在内核调试器中,各个应用程序各自负责资源管理操作系统仅负责完成资源的调度分配

  9. 将一个进程划分为多个线程,每个线程为相对独立的子任务在多核系统中,多个线程可以并发执行从而提高性能

  10. 列出对称多处理操作系统设计时要考虑的关键问题

    (1) 并行进程/线程

    (5) 可靠性和容错性

}

我要回帖

更多关于 内核调试器 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信