Enterprise Just Builder

Solution for Enterprise Software Architecture

os

CPU C-State 详解

如果你对计算机电源管理方面有所了解,一定会接触到 S-States、C-States 和 P-States 这三种工作状态。其中S-States (Sleeping states)指系统睡眠状态 ,由 ACPI 规定,C-States(CPU Power state) 则是 CPU 电源状态,而 P-States (CPU Performance states) 则指 CPU 性能状态。当然除了这三种外,还有 G-States(全局状态)和 D-States (设备状态)。

S-States 很好理解,就是用户手动点击“睡眠”,或者达到一定的待机时间(由系统电源管理设置而定)进入睡眠状态,S0 就是指正常运作。而 C-States 和P-States 看起来也很类似,都会调节处理器的核心电压、电流以及频率,因此经常被混淆。我们通过图1-1 来梳理一下上面这三种状态的关系。

S-States 中的 S0 指非睡眠状态,即系统正常运作状态或待机状态(idle)。只有在 S0 状态下,C-States 才会存在。同样的,C0 代表 CPU 正常工作状态,而P-States 正是处理器正常运作时的状态,所以 P-States 只存在于 C0 状态下。

因此简单来说,P-States 是根据系统的负载情况调节处理器核心电压和频率,处理器仍在运作当中;而 C-States 则是改变处理器各个部分的状态,包括核心、缓存、总线以及各种后来集成进来的模块,此时处理器应该是处于工作或待机状态。我们日常使用电脑的时候,系统就是频繁地在这些状态下切换,以达到提高续航和降低功耗的目的。1

C-States 的 11 个工作状态
目前 C-States 有以下这11个状态:

>>> 阅读全文

 

, ,

Windows 下如何实现键盘记录器

首先强调的是本文不提供任何键盘记录器的源代码,我们所要侧重了解的是键盘记录器背后所涉及的系统机制,从而更好地了解 Windows 操作系统是如何与硬件协调工作的。本文适合那些对内核或驱动开发有经验的用户。1

在 Windows 中处理键盘输入数据
有多种技术可以截取键盘和鼠标事件,而键盘记录器或多或少都用到了这些技术。因此在剖析某款键盘记录器之前,有必要先了解一下 Windows 是如何处理键盘输入数据的。这个过程可以简单描述为:

  • 1. 键盘上某一个键被按下;
  • 2. 键盘系统中断控制器被激活;
  • 3. WM_KEYDOWN 消息出现;

有关内容可以参考:

  • “Apparatnoe obeshpechenie IBM PC” 作者 Alexander Frolov 和 Grigory Frolov, 第2卷, 第 1 册。 Dialog-MIFI出版社, 1992 年出版。第二章 “键盘” 介绍了键盘的工作原理、使用的端口和键盘硬件中断。
  • MSDN 上 “HID / Human Input Devices” 小节内介绍了键盘输入处理过程的底层部分(驱动)。
  • Jeffrey Richter 的著作 《Creating effective Win32 applications for 64-bit Windows》 第 27 章 “A model of hardware input and the local input condition” 中谈到了键盘输入处理过程的顶层部分(用户模式)。

作为物理设备的键盘是如何工作的。
大多数键盘都是独立设备,通过 PS/2 或 USB 接口连接到计算机上。有两个微控制器负责处理从键盘输入数据,i8042 在主板上,i8048 在键盘内。可以说 PC 键盘本身就是个小型计算机系统,其所使用的 i8048 微控制器独立于中央 CPU,负责不断地扫描被按下的按键。

每个按键都会被指定某一特定值,具体值和按键矩阵图强相关,而与按键上印刷的字符无关。这些数值被称为“扫描码”(这个名称凸显了计算机通过扫描键盘来搜索敲键的事实)。扫描码是 IBM 公司在为其 PC 创造出第一个键盘时选择的随机数。对单个按键来说,其扫描码并不是和 ASCII 码一一对应,相反它可以对应于多个 ASCII 码值。扫描码表可以在《汇编语言程序设计的艺术》一书的第 21 章中找到。

>>> 阅读全文

 

, , ,

操作系统开发初体验(2)C++ 支持代码和控制台

在开始阅读第二篇文章前,我建议你翻阅上一篇文章,不然,接下来的内容可能就用处不大了。

现在我们需要一些支持代码,G++ 会用到其中的一些,不过我们增加了更多的代码以避免奇怪的错误。这里我们要添加的代码有:

  • 对构造器的调用
  • 提供 new 和 delete 的实现
  • 在 GCC 无法调用虚拟方法的时候提供一个方法以供调用。

除了上述三个,还有就是:据说有些操作系统会在内核代码结束的地方调用析构函数,但我没看过这样的案例,大多数多任务操作系统都会在 main 函数的末尾进入无限循环,这样定时器 IRQ 就可以来接管任务。(要晚很多)

首先,我们需要调用构造函数。链接脚本可以指出这些构造函数的指针起始和结束的地址。要调用它们,我们要做只是遍历它们。虽然链接器有可能会弄错顺序,不过概率很低。至少在本系列文章中,我们还是可以信任 GCC 的。

要调用构造器,我们可以使用下面的代码:

>>> 阅读全文

 

, ,

操作系统开发初体验 (1)

文章评价:
如果你正在读这篇文章,没准你想知道更多有关如何创建自己的 OS 方面的内容。不过你首先要知道,我这短短几篇文章是没办法涵盖 OS 开发的各个方面的。我会介绍一些 OS 的基础知识,但还需要靠你自己去研读相关的技术文档,这样你才能明白操作系统为何如此工作。确定还想读下去吗?好,让我们开始吧。

理解 OS 开发很关键的一点是:一切将从零开始,你直接和硬件打交道。你会遇到硬件故障,也不能指望系统每次都如期工作。你没有标准库可供使用,更没有 .NET 框架或者Java 虚拟机。一切只能靠你自己。

开始之前,你要了解系统控制权是如何转交到你手上的。很奇怪的是,没有什么标准规定电脑开机之后应置于什么状态,唯一能确定的是,开机之后一定会去执行引导扇区,它位于可启动的存储介质的起始部分,会被加载到内存地址 0x7C00 处,其长度为 512字节,并以 0xAA55 作为文件末尾签名。引导扇区通常用汇编语言编写。为了节约时间,我们将使用现成的 GRUB (Grand Unified Bootloader)。这可为后续工作提供可靠的基础,并将电脑置于同一个标准状态。

Grub 会将电脑置于以下状态:

  • 保护模式
  • A20 地址线启用
  • 寄存器 EBX 存有指向多重启动信息结构(Multiboot information structure)的指针
  • 寄存器 EAX 存有固定值 0x2BADB002
  • 分页机制关闭
  • 栈位于内存的某处
  • 中断机制关闭

下面我会逐一介绍这些状态。保护模式允许内核开发人员按虚拟地址空间访问最大为 4GB 的内存,并引入了保护环“Ring”的概念。以下几小节会介绍更多的内容。 A20 门电路是键盘控制器附近的一条“古老”的地址线。它最初设计是为了与 8086 保持兼容,在“关闭”的时候,屏蔽了对内存开始部分 1M 以上地址的访问。

>>> 阅读全文

 

, , , , , , , ,

从虚拟化到云计算(一)概述

文章评价:

在计算机科学领域中,虚拟化有广义和狭义两种概念。广义上来说,虚拟化代表着对计算资源的抽象,而不仅仅局限于虚拟机的概念。例如对物理内存的抽象,产生了虚拟内存技术,使得应用程序认为其自身拥有连续可用的地址空间(Address Space),而实际上,应用程序的代码和数据可能是被分隔成多个碎片页或段),甚至被交换到磁盘、闪存等外部存储器上,即使物理内存不足,应用程序也能顺利执行。

狭义的虚拟化技术,则通常指的是硬件虚拟化技术,即计算元件在虚拟的硬件基础上而不是真实的硬件基础上运行。将这个概念应用到计算机系统中,可以在一台计算机上同时运行多个操作系统(例如,一台计算机可以同时运行 Linux 和 Windows),不同用户看到不同的单个系统,而且每一个操作系统中都有多个程序运行,每一个操作系统都运行在一个虚拟的CPU或者是虚拟主机上。这通常称为全虚拟化(full virtualization)。

硬件虚拟化也可以有更加复杂的格式,例如单个计算机看上去具有多个架构(对于一个用户来说,它是一个标准的 x86 平台;对于另外一个用户来说,它是 IBM Power PC 平台)。这种虚拟化形式通常被称为硬件仿真。

反之,更加简单的一种硬件虚拟化是操作系统虚拟化 (OS Level Virtualization),其中一台计算机可以运行相同类型的多个操作系统。在传统操作系统中,所有用户的进程本质上是在同一个操作系统的实例中运行,因此内核或应用程序的缺陷可能影响到其它进程。操作系统级虚拟化是一种在服务器操作系统中使用的轻量级的虚拟化技术,内核通过创建多个虚拟的操作系统实例(内核和库)来隔离不同的进程,不同实例中的进程完全不了解对方的存在。比较著名的有 Solaris Container,FreeBSD Jail 和 OpenVZ 等。

>>> 阅读全文

 

, , , ,

Windows 8 之用UEFI 保护操作系统预启动环境

文章评价: 英文原文,本文翻译与中文MSDN略有不同
指导原则 – 安全问题绝不妥协
UEFI 安全启动协议是实现跨平台和固件安全的基础,与体系结构无关。在固件(firmware)被允许执行前,基于公钥(Public Key Infrastructure -PKI) 构件会验证其映像,安全启动有助于减少 boot loader attack 的风险。在 Windows 8 中,Microsoft基于该协议改进了平台安全性。

微软正和其伙伴合作,确保安全启动能为客户带来良好的安全体验。微软支持 OEM 灵活地决定谁来管理安全认证,如何让客户导入并管理这些认证以及管理安全启动。我们相信为 OEM 提供这种灵活性以及允许用户决定如何管理自己的系统来说非常重要。

对于 Windows 用户,Microsoft 正用 Windows 验证计划来确保带有 Windows 8 的系统默认就启用了安全启动;这样固件将不允许以编程方式来控制安全启动(以防止恶意软件关闭固件中的安全选项);在未经授权的情况下,OEM 禁止更新固件,因为这可能会危及系统的完整性。。

大部分的策略对于 UEFI 固件来说并不是新东西,如今大部分的 PC 也带有某种形式上的固件验证。甚至现存的老旧系统也支持诸如 BIOS 密码,一种已经被 OEM 和最终用户使用多年的安全启动的形式。但是,有了安全启动和 UEFI,微软和业界可以用更高的高度来创建更良好,更完整的系统,最终提供给用户更强有力的保护以应对不断增加的威胁。

什么是UEFI?
UEFI (Unified Extensible Firmware Interface) 由 UEFI 论坛管理,该论坛由芯片、硬件、系统、固件和操作系统厂商联合组建。该该论坛负责维护有关的规范、测试工具和参考实现,以便在不同的 UEFI PC 间使用。Microsoft 是该论坛的董事成员,该论坛对于任何个人或公司开放,并可免费加入。

>>> 阅读全文

 

, , ,