Electronic Joint Business

Solution for E-Business

make

操作系统开发初体验 (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 以上地址的访问。

>>> 阅读全文

 

, , , , , , , ,

详解GNU Make (二) 高级用法

在上一篇文章中,我们了解了 makefile 的基本结构和一些常见用法,在这篇文章中我们会更深入地了解一些“高级用法”,这些用法在实际的例子中相当常见,可以极大地提高 makefile 的编写效率。

Makefile 里有什么?
Makefile 里主要包含了五个东西:显式规则、隐晦规则、变量定义、文件指示和注释。

  • 显式规则。显式规则说明了如何生成一个或多的的目标文件。这是由 Makefile 的编写者显示地指出:要生成的文件、文件的依赖文件和生成命令。
  • 隐晦规则。由于 make 有自动推导的功能,所以隐晦规则可以让编写者比较简略地编写 Makefile,这是 make 所支持的。
  • 变量定义。在 Makefile 中我们可以定义一系列的变量,变量一般都是字符串,有点 C 语言中的宏,当 Makefile 被执行时,其中的变量都会被扩展到相应的引用位置上。
  • 文件指示。其包括了三个部分:一是在 Makefile 中引用另一个 Makefile,类似 C 语言中的 #include;二是指根据某些情况指定 Makefile 中的有效部分,类似 C 语言中的条件编译 #if ;三是定义多行的命令。有关这一部分的内容,我会在后续的部分中讲述。
  • 注释。Makefile 中只有行注释,和 UNIX 的 Shell 脚本一样,其注释是用“#”字符, 类似 C/C++ 中的“//”。如果要在 Makefile 中使用“#”字符,可以用反斜杆进行转义:“\#”。

最后要注意的是,在 Makefile 中的命令,必须要以 Tab 键开始。

Makefile 的文件名

默认的情况下,make 命令会在当前目录下按顺序找寻文件名为 “GNUmakefile”、“makefile”、“Makefile” 的文件,找到了就解释这个文件。在这三个文件名中,最好使用 “Makefile” 这个文件名,因为,这个文件名第一个字符为大写比较显目。最好不要用 “GNUmakefile”,这个文件是 GNU 的 make 识别的。有另外一些 make 只对全小写的 “makefile” 文件名敏感,但是基本上大多数的 make 都支持 “makefile” 和 “Makefile” 这两种默认文件名。

>>> 阅读全文

 

, , , , , ,

详解GNU Make (一) 基本规则

文章评价:
一个较大的项目会有许许多多源文件,一般我们会按类型、功能、模块等类别分别放在若干个目录中,makefile 提供了一系列的规则用于指定哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为 makefile 就像一个 Shell 脚本一样,其中也可以执行操作系统的命令。

因此,makefile 关系着整个项目的编译规则,带来的好处就是“自动化编译”。一旦写好 makefile,你只需要运行 make 命令,整个工程完全自动编译,极大地提高了软件开发的效率。

负责解释 makefile 中指令的工具是 make。一般来说,大多数的 C/C++ 编译器都提供这个工具,最常见的有:Visual C++ 的 nmake,GNU 的 make。但是不同产商的 make 各不兼容,makefile 语法也略有不同。这里我们以应用最为广泛的 GNU make 来做讲解。

Makefile 介绍
我们先引用 GNU 的 make 使用手册中的一个例子,假设我们的工程有 8 个 C 文件和 3 个头文件,要如何编写 Makefile 来实现自动编译和链接这几个文件。我们的要求是:
1)如果这个工程没有编译过,那么我们的所有 C 文件都要编译并被链接。
2)如果这个工程的某几个 C 文件被修改,那么我们只编译被修改的 C 文件,并链接目标程序。
3)如果这个工程的头文件被改变了,那么我们需要编译引用了这几个头文件的 C 文件,并链接目标程序。

所有这些要求,只需要一个 makefile 就可以完成了。make 命令会自动智能地根据当前的文件修改的情况来确定哪些文件需要重编译,从而自己编译所需要的文件和链接目标程序。

>>> 阅读全文

 

, , , , ,