本 科 生 毕 业 设 计 报 告 项 目 名 称 微 型 操 作 系 统 的 设 计 与 实 现 姓 名 与 学 号 曲 国 铖 3063027053 指 导 老 师 王 新 宇 专 业 计 算 机 科 学 与 技 术 学 院 计 算 机 学 院
A Dissertation Submitted to Zhejiang University for the Degree of Bachelor of Engineering TITLE: Design and Implementation of A Mini Operating System Author: Instructor: Major: College: Guocheng Qu Xinyu Wang Computer Science and Technology College of Computer Science Submitted Date: 2010/6/1
浙 江 大 学 本 科 生 毕 业 论 文 ( 设 计 ) 诚 信 承 诺 书 1. 本 人 郑 重 地 承 诺 所 呈 交 的 毕 业 论 文 ( 设 计 ), 是 在 指 导 教 师 的 指 导 下 严 格 按 照 学 校 和 学 院 有 关 规 定 完 成 的 2. 本 人 在 毕 业 论 文 ( 设 计 ) 中 引 用 他 人 的 观 点 和 参 考 资 料 均 加 以 注 释 和 说 明 3. 本 人 承 诺 在 毕 业 论 文 ( 设 计 ) 选 题 和 研 究 内 容 过 程 中 没 有 抄 袭 他 人 研 究 成 果 和 伪 造 相 关 数 据 等 行 为 4. 在 毕 业 论 文 ( 设 计 ) 中 对 侵 犯 任 何 方 面 知 识 产 权 的 行 为, 由 本 人 承 担 相 应 的 法 律 责 任 毕 业 论 文 ( 设 计 ) 作 者 签 名 : 曲 国 铖 2010 年 6 月 1 日
摘 要 摘 要 本 课 题 为 Intel X86 平 台 上 一 个 微 型 操 作 系 统 内 核 的 设 计 与 实 现 主 要 功 能 包 括 初 步 的 进 程 调 度 多 TTY 终 端 显 示 键 盘 I/O 输 入 输 出 响 应 和 基 本 的 系 统 调 用 开 发 方 法 是, 在 linux 环 境 下 面, 使 用 nasm 编 译 汇 编 文 件, 使 用 gcc 编 译 C 语 言 文 件, 使 用 ld 命 令 将 obj 文 件 链 接 为 一 个 elf 格 式 的 内 核 可 执 行 文 件 最 后 通 过 vmplayer 加 载 系 统 软 盘 映 像, 运 行 操 作 系 统 内 核 关 于 进 程 和 TTY 终 端 显 示 内 核 启 动 之 后, 会 运 行 一 个 TTY 终 端 进 程 和 三 个 普 通 进 程 TTY 终 端 进 程 的 特 权 级 为 1( 最 高 特 权 级 为 0, 只 有 内 核 运 行 在 0 特 权 级 ), 负 责 维 护 三 个 TTY 终 端, 并 且 对 用 户 的 键 盘 输 入 进 行 响 应 ;Alt+F1/F2/F3 三 种 按 键 组 合 可 以 在 三 个 TTY 终 端 之 间 进 行 自 由 切 换 三 个 普 通 进 程 的 特 权 级 为 3( 最 低 特 权 级 ), 每 个 进 程 通 过 调 用 printf 函 数 在 各 自 的 终 端 上 进 行 输 出 这 里 的 printf 是 模 仿 C 语 言 标 准 库 printf 的 一 个 简 单 实 现 内 核 中 的 时 钟 中 断 函 数 负 责 四 个 进 程 的 调 度 工 作 关 于 系 统 调 用 内 核 通 过 软 中 断 0x90 实 现 了 两 个 系 统 调 用 :get_ticks() 和 write() Get_ticks() 可 以 取 得 时 钟 中 断 的 次 数 write(char*buf,int count) 在 终 端 上 面 输 出 字 符 串 buf 关 键 词 进 程 系 统 调 用 终 端 键 盘 I/O I
Abstract Abstract This is a designation and implementation of a mini operating system. This mini system has 4 major functionalities: process scheduling, multi TTY terminals, keyboard I/O, system calls. Here is a description of how I developed this system. In Linux, use nasm to compile assembly language files, use gcc to compile C language files, and use ld to link all the object files to form the final kernel executable file. Finally, the software Vmplayer can load the floopy img to run the kernel bin file on Intel X86 processor. About the Processes and TTY terminals. After booting successfully, the kernel runs a TTY process and 3 ordinary processes. The TTY terminal process (running in privilege 1) manages 3 TTY terminals and responds users keyboard input by displaying corresponding characters on the current TTY terminal. Alt+F1/F2/F3 can switch free between 3 TTY terminals. Each of the 3 ordinary processes (running in privilege 3)prints characters on their TTY terminal by calling the printf function, which is a simple version of the C standard library function printf. The clock interrupt function schedules the 4 processes. About System Calls. The kernel offers 2 system calls by software interrupt 0x90:get_ticks() and write(char*buffer, int count). Get_ticks() gets the times of clock interrupts. write(char*buffer, int count) outputs the string buffer on the process terminal. The background coding is far more complicated than above functionalities look like. The kernel runs directly on hardware without any protection on memory or privilege. So a minor error can cause the entire system to run unexpectedly or dump. Keywords Process System Calls Terminal Keyboard I/O II
目 录 目 录 摘 要... I Abstract... II 第 1 章 绪 论... 1 1.1 课 题 背 景... 1 1.1.1 操 作 系 统 概 念 及 主 流 操 作 系 统... 1 1.1.2 操 作 系 统 作 为 核 心 技 术 的 重 要 性... 1 1.2 目 标 与 任 务... 2 1.2.1 初 步 的 进 程 调 度... 2 1.2.2 基 本 的 系 统 调 用... 2 1.2.3 键 盘 I/O 响 应... 2 1.2.4 多 TTY 终 端 显 示... 2 1.3 课 题 提 出 的 意 义... 2 第 2 章 开 发 工 具 及 运 行 环 境... 4 2.1 开 发 环 境... 4 2.2 运 行 环 境... 4 第 3 章 系 统 的 功 能 描 述... 5 3.1 多 TTY 终 端... 5 3.2 多 进 程 调 度 运 行... 6 3.3 键 盘 I/O 响 应... 7 3.4 系 统 调 用 接 口 函 数... 7 第 4 章 系 统 的 架 构 及 实 现... 9 4.1 整 体 系 统 启 动 流 程... 9 4.2 Boot 模 块... 9 4.2.1 在 Fat12 格 式 软 盘 中 寻 找 loader.com 文 件 扇 区 位 置... 9 4.2.2 加 载 loader.com 文 件... 11 4.3 Loader 模 块... 12 III
目 录 4.3.1 在 软 盘 中 加 载 kernel.bin 文 件... 12 4.3.2 从 实 模 式 跳 转 到 保 护 模 式... 12 4.3.3 组 装 内 存 中 的 elf 格 式 kernel.bin... 13 4.4 Kernel 模 块... 14 4.4.1 整 体 架 构... 14 4.4.2 保 护 模 式 下 8259a 的 编 程 设 置... 15 4.4.3 中 断 描 述 符 表 的 设 置... 15 4.4.4 系 统 调 用... 16 4.4.5 8253 系 统 时 钟 的 设 置... 16 4.4.6 进 程... 17 4.4.7 TTY 终 端 和 键 盘 响 应... 18 第 5 章 重 要 问 题 及 解 决...20 5.1 软 盘 文 件 的 加 载... 20 5.2 汇 编 文 件 的 编 译 过 程... 20 5.3 编 译 平 台 和 运 行 平 台... 20 5.4 Loop 指 令 的 一 个 bug... 20 5.5 进 程 堆 栈 和 内 核 堆 栈... 21 5.6 分 段 机 制 中 的 权 限... 21 5.7 Printf 函 数 的 参 数 问 题... 21 第 6 章 总 结 及 开 发 方 向...23 6.1 总 结... 23 6.2 系 统 未 来 开 发 方 向... 23 参 考 文 献...25 致 谢...26 IV
第 1 章 绪 论 第 1 章 绪 论 1.1 课 题 背 景 1.1.1 操 作 系 统 概 念 及 主 流 操 作 系 统 操 作 系 统 (Operating System, 简 称 OS) 是 一 管 理 电 脑 硬 件 与 软 件 资 源 的 程 序, 同 时 也 是 计 算 机 系 统 的 内 核 与 基 石 操 作 系 统 是 一 个 庞 大 的 管 理 控 制 程 序, 大 致 包 括 5 个 方 面 的 管 理 功 能 : 进 程 与 处 理 机 管 理 作 业 管 理 存 储 管 理 设 备 管 理 文 件 管 理 操 作 系 统 按 发 展 阶 段 不 同, 可 以 分 为 批 处 理 操 作 系 统 分 时 操 作 系 统 实 时 操 作 系 统 网 络 操 作 系 统 分 布 式 操 作 系 统 目 前 微 机 上 常 见 的 操 作 系 统 有 DOS OS/2 UNIX XENIX LINUX Windows Netware 等 linux windows 苹 果 mac os 是 当 前 最 流 行 的 操 作 系 统 1.1.2 操 作 系 统 作 为 核 心 技 术 的 重 要 性 众 所 周 知, 操 作 系 统 是 计 算 机 软 件 领 域 中 核 心 的 工 程 性 技 术, 尽 管 它 的 理 论 相 对 成 熟, 但 是 在 工 程 实 施 和 维 护 上, 仍 然 是 体 现 一 个 国 家 技 术 水 平 的 标 志 性 核 心 技 术 世 界 上 凡 是 在 软 件 产 业 方 面 存 有 雄 心 壮 志 的 国 家, 无 不 非 常 重 视 操 作 系 统 技 术 的 研 究 和 积 累 例 如, 法 国 在 他 们 的 一 个 国 家 级 实 验 室 中, 自 己 研 发 了 包 括 操 作 系 统 和 编 译 器 在 内 的 全 套 基 础 软 件, 并 由 国 家 投 入 资 金 不 断 维 护 和 发 展 德 国 拥 有 大 批 Linux 黑 客, 其 政 府 因 势 利 导, 通 过 一 系 列 的 大 型 工 程 将 自 己 的 Linux 软 件 人 才 组 织 起 来, 希 望 依 托 Linux 重 建 自 己 的 软 件 核 心 技 术 力 量 20 世 纪 80 年 代 中 期, 日 本 在 美 国 的 压 力 下 而 放 弃 了 自 己 的 BTRON 操 作 系 统, 此 后 软 件 产 业 的 发 展 让 日 本 后 悔 莫 及 痛 定 思 痛 之 后, 日 本 希 望 牢 牢 把 握 自 己 在 消 费 电 子 产 品 上 面 的 优 势, 一 方 面 继 续 发 展 国 产 的 ITRON OS, 另 一 方 面 把 握 住 Linux, 希 望 在 未 来 占 据 消 费 类 嵌 入 式 操 作 系 统 的 制 高 点 我 国 在 这 个 方 面 走 过 一 些 弯 路, 但 是 现 在 已 经 认 识 到 了 掌 握 核 心 软 件 技 术 的 重 要 性, 并 且 有 了 一 定 的 投 入, 相 信 今 后 国 家 在 这 方 面 的 支 持 力 度 会 越 来 越 强 1 相 对 于 90 年 代 中 后 期, 现 在 的 软 件 产 业 已 经 务 实 了 很 多, 今 天 的 程 序 员 更 关 心 的 是 如 何 尽 可 能 快 尽 可 能 简 单 地 用 软 件 解 决 实 际 问 题, 创 造 实 际 价 值, 1
第 1 章 绪 论 在 一 个 既 定 的 秩 序 中 寻 找 自 己 的 生 存 空 间, 而 不 是 异 想 天 开 地 憧 憬 能 成 为 Linux Torvalds 式 的 旧 秩 序 的 破 坏 者 因 此 诸 如 操 作 系 统 编 译 原 理 之 类 的 基 础 技 术, 已 经 是 关 心 者 寥 寥 了 目 前 的 课 本 偏 重 操 作 系 统 理 论, 把 大 量 的 笔 墨 放 在 对 操 作 系 统 运 行 机 制 的 剖 析 或 者 现 成 源 代 码 的 分 析 上 ; 没 有 为 读 者 提 供 一 个 可 以 实 际 实 践 的 氛 围 编 写 操 作 系 统 的 实 践 能 够 消 除 对 编 写 软 件 系 统 的 心 理 障 碍, 实 在 地 消 化 和 理 解 书 本 上 的 理 论 知 识, 学 会 解 决 问 题 的 思 路, 收 获 将 会 非 常 巨 大 2 1.2 目 标 与 任 务 1.2.1 初 步 的 进 程 调 度 系 统 内 核 内 部 包 含 若 干 个 进 程 模 块, 在 系 统 启 动 成 功 之 后, 能 够 运 行 这 些 进 程, 并 且 通 过 时 钟 中 断 来 进 行 进 程 调 度 操 作 系 统 的 本 质 目 标, 就 是 为 应 用 程 序 提 供 一 个 运 行 平 台 ; 没 有 进 程 管 理, 就 不 能 称 之 为 操 作 系 统 1.2.2 基 本 的 系 统 调 用 通 过 系 统 的 软 中 断 来 实 现 简 单 的 系 统 调 用 函 数 由 于 普 通 进 程 没 有 权 限 进 行 任 何 的 I/O 等 特 权 操 作, 所 以 提 供 系 统 调 用 函 数 对 普 通 进 程 完 成 I/O 任 务 获 取 系 统 信 息 来 说 非 常 重 要 1.2.3 键 盘 I/O 响 应 通 过 内 核 的 键 盘 中 断 程 序 将 用 户 的 键 盘 输 入 存 入 缓 冲 区 这 是 实 现 TTY 终 端 的 基 础,TTY 终 端 正 是 从 这 个 键 盘 输 入 缓 冲 区 中 获 取 数 据, 从 而 在 屏 幕 上 显 示 出 用 户 的 输 入 内 容 1.2.4 多 TTY 终 端 显 示 通 过 一 个 特 权 级 为 1 的 TTY 进 程 来 实 现 多 个 TTY 终 端 的 显 示 管 理 在 不 同 的 TTY 屏 幕 中, 可 以 分 别 有 不 同 的 输 入 和 输 出, 相 互 之 间 并 不 受 彼 此 影 响 1.3 课 题 提 出 的 意 义 选 择 做 微 型 操 作 系 统 内 核 主 要 源 于 笔 者 对 于 操 作 系 统 知 识 浓 厚 的 兴 趣 大 学 的 操 作 系 统 课 程 太 过 于 偏 重 理 论, 仅 有 的 实 践 性 课 程 Linux 系 统 实 验 虽 然 说 2
第 1 章 绪 论 实 际 地 进 行 了 编 码 工 作, 但 是 囿 于 很 小 的 范 围 ; 在 Linux 庞 大 的 代 码 体 系 中, 给 人 以 管 中 窥 豹 的 感 觉, 不 能 一 览 整 个 操 作 系 统 从 引 导 模 式 跳 转 内 核 加 载 等 等 一 系 列 流 程 至 于 进 程 调 度 内 存 管 理 和 文 件 系 统 方 面 更 加 是 云 里 雾 里, 不 能 很 清 晰 地 了 解 高 层 的 C 语 言 代 码 如 何 与 硬 件 的 交 互 从 而 实 现 进 程 文 件 系 统 等 等 用 户 可 见 的 概 念 操 作 系 统 一 直 带 着 神 秘 的 色 彩 吸 引 着 笔 者, 因 此, 决 定 利 用 毕 业 设 计 这 个 机 会 实 现 一 个 雏 形 的 操 作 系 统, 揭 开 一 直 困 扰 在 心 中 的 谜 团 3
第 2 章 开 发 工 具 及 运 行 环 境 第 2 章 开 发 工 具 及 运 行 环 境 2.1 开 发 环 境 本 课 题 在 Linux 操 作 系 统 下 进 行 开 发, 所 需 要 的 软 件 工 具 如 下 表 : 表 2-1 系 统 开 发 环 境 软 件 名 称 Nasm Ndisasm Gcc Make Dd Mount Umount Readelf Objdump bochs 描 述 汇 编 编 译 器 反 汇 编 器 C 语 言 编 译 器 对 整 个 工 程 项 目 的 编 译 链 接 顺 序 进 行 管 理, 是 Linux 下 管 理 项 目 的 常 用 工 具 生 成 软 盘 映 像 img 文 件 将 软 盘 映 像 img 文 件 加 载 到 Linxu 系 统 下 面, 以 便 将 loader.com kernel.bin 文 件 拷 贝 到 软 盘 中 去 卸 载 软 盘 查 看 elf 格 式 文 件 的 各 种 信 息 查 看 obj 格 式 文 件 的 各 种 信 息 硬 件 模 拟 器, 完 全 模 拟 x86 硬 件 以 及 一 些 外 围 设 备 ; 同 时 提 供 系 统 调 试 功 能 s 2.2 运 行 环 境 最 终 的 生 成 结 果 是 一 个 包 含 了 boot.bin loader.com kernel.bin 的 软 盘 系 统 映 像 文 件 boot.img 其 中,boot.bin 位 于 软 盘 的 第 一 个 扇 区, 以 0xAA55 结 束, 这 是 系 统 的 引 导 扇 区 这 个 扇 区 同 时 以 fat12 文 件 系 统 格 式 化, 所 以 能 够 使 用 mount 命 令 的 -o loop 选 项 加 载 使 用 vmplayer 软 件 挂 载 boot.img 文 件 作 为 软 盘, 设 置 为 加 电 时 即 挂 载 软 盘 这 样, 系 统 便 可 以 在 vmplayer 虚 拟 机 中 运 行 了 当 然, 如 果 将 文 件 拷 贝 到 真 实 的 软 盘 上 面, 然 后 放 到 真 实 的 物 理 机 上 面 运 行, 也 是 可 以 的 4
第 3 章 系 统 的 功 能 描 述 第 3 章 系 统 的 功 能 描 述 3.1 多 TTY 终 端 系 统 加 载 运 行 之 后, 会 首 先 进 行 一 些 GDT IDT 时 钟 等 初 始 化 工 作 相 应 的 显 示 如 下 图 所 示 :( 这 里 添 加 系 统 初 始 化 画 面 截 图 ) 初 始 化 工 作 完 成 之 后, 展 现 在 用 户 面 前 的 就 是 0 号 TTY 终 端 按 键 组 合 ALT+F1/F2/F3 可 以 在 三 个 TTY 终 端 之 间 自 由 切 换 由 于 三 个 TTY 的 输 出 都 是 不 同 的, 所 以 可 以 明 显 看 出 这 是 三 个 不 同 的 TTY 终 端 如 下 图 : TTY0 截 图 : TTY1 截 图 ( 进 程 A 的 输 出 定 向 终 端 ): 5
第 3 章 系 统 的 功 能 描 述 TTY2 截 图 ( 进 程 B C 所 定 向 的 输 出 终 端 ): 3.2 多 进 程 调 度 运 行 系 统 内 建 了 四 个 进 程, 每 一 个 进 程 的 输 出 都 定 向 在 一 个 TTY 上 面 第 一 个 进 程 是 特 权 级 为 1 的 TTY 进 程 它 负 责 全 权 管 理 上 述 三 个 TTY 终 端, 读 取 系 统 内 部 的 键 盘 输 入 缓 冲 区, 显 示 在 正 确 的 TTY 上 面 其 他 三 个 进 程 都 是 特 权 级 为 3 的 普 通 进 程 进 程 A 循 环 调 用 get_ticks() 函 数, 得 到 当 前 时 钟 中 断 的 次 数, 然 后 调 用 printf 函 数 打 印 出 来 进 程 A 对 应 的 是 1 号 TTY 终 端 (Alt+F2 切 换 ), 其 输 出 见 3.1 中 的 TTY1 截 图 进 程 B 循 环 调 用 printf 函 数 打 印 出 字 符 B, 进 程 C 循 环 调 用 printf 函 数 打 印 出 字 符 C, 这 两 个 进 程 对 应 的 都 是 2 号 TTY 终 端, 其 输 出 见 3.1 中 的 TTY2 截 图 6
第 3 章 系 统 的 功 能 描 述 3.3 键 盘 I/O 响 应 系 统 通 过 键 盘 中 断 程 序 来 捕 捉 用 户 的 键 盘 输 入, 然 后 将 键 盘 扫 描 码 存 入 键 盘 缓 冲 区 以 供 TTY 终 端 读 取 当 前 系 统 可 以 处 理 所 有 可 打 印 字 符, 可 以 区 分 字 符 大 小 写, 可 以 处 理 enter backsapce 键 如 下 图, This is what I input. HELLO,WORLD!!!!!!!!!!!! 这 两 句 话 是 用 户 的 输 入 3.4 系 统 调 用 接 口 函 数 系 统 通 过 int 0x90 号 软 中 断 实 现 了 两 个 系 统 调 用 Int get_ticks(void): 返 回 时 钟 中 断 的 次 数 Void write(char*buffer, int length): 将 字 符 串 buffer 的 前 len 个 字 符 7
第 3 章 系 统 的 功 能 描 述 输 出 到 进 程 定 向 的 TTY 终 端 上 面 系 统 内 部 实 现 的 printf 函 数 就 是 通 过 调 用 write 函 数 来 实 现 的 因 为 特 权 级 为 1 的 进 程 是 不 能 进 行 任 何 I/O 操 作 的, 所 以 输 入 输 出 这 些 操 作 必 须 通 过 系 统 调 用 来 完 成 8
第 3 章 系 统 的 架 构 及 实 现 第 4 章 系 统 的 架 构 及 实 现 4.1 整 体 系 统 启 动 流 程 第 一 步,bios 加 电 自 检, 检 查 软 盘 0 面 0 磁 道 1 扇 区 发 现 这 是 一 个 以 0xAA55 结 束 的 扇 区, 则 认 为 是 一 个 引 导 扇 区 ; 然 后 将 boot.bin 加 载 到 内 存 0000:7c00 处, 跳 转 到 0000:7c00 处 将 控 制 权 彻 底 交 给 boot.bin 第 二 步,boot.bin 从 文 件 系 统 格 式 为 fat12 格 式 的 软 盘 中 寻 找 loader.com 文 件, 加 载 至 内 存, 然 后 跳 转 至 loader.com 第 三 步,loader.com 从 软 盘 中 寻 找 kernel.bin 文 件, 加 载 至 内 存 初 始 化 一 个 GDT, 从 实 模 式 切 换 到 保 护 模 式, 然 后 跳 转 到 kernel.bin 内 核 第 四 步,kernel.bin 开 始 内 核 的 运 行 4.2 Boot 模 块 4.2.1 在 Fat12 格 式 软 盘 中 寻 找 loader.com 文 件 扇 区 位 置 Boot.bin 由 于 放 置 于 软 盘 的 第 一 个 扇 区, 而 我 们 的 软 盘 需 要 时 fat12 文 件 系 统 格 式, 所 以 boot 的 汇 编 代 码 中 必 须 带 有 fat12 文 件 系 统 所 需 要 的 格 式 参 数 而 且,boot.bin 需 要 在 软 盘 中 寻 找 并 加 载 loader.com 文 件 所 以, 这 里 对 Fat12 文 件 系 统 简 单 介 绍 一 下 4.2.1.1 引 导 扇 区 的 系 统 参 数 引 导 扇 区 的 系 统 参 数 如 下 表 所 示 : 3 表 格 4.1 引 导 扇 区 的 格 式 名 称 开 始 字 节 长 度 内 容 系 统 数 值 BS_jmpBoot 0 3 Jmp LABEL_START nop 9
第 3 章 系 统 的 架 构 及 实 现 续 表 x 表 格 4.1 引 导 扇 区 的 格 式 BS_OEMName 3 8 ForrestY BPB_BytesPerSec 11 2 0x200 BPB_SecPerClus 13 1 0x1 BPB_RsvdSecCnt 14 2 0x1 BPB_NumFATs 16 1 0x2 BPB_RootEntCnt 17 2 0xE0 BPB_TotSec16 19 2 0xB40 BPB_Media 21 1 0xF0 BPB_FATSz16 22 2 0x9 BPB_SecPerTrk 24 2 0x12 BPB_NumHeads 26 2 0x2 BPB_TotSec32 28 4 0 BPB_HiddSec 32 4 0 BS_DrvNum 36 1 0 BS_Reserved1 37 1 0 BS_BootSig 38 1 0x29 BS_VolID 39 4 0 BS_VolLab 43 11 Tinix0.01 BS_FileSysType 54 8 FAT12 引 导 区 代 码 62 448 引 导 代 码 结 束 标 志 0xAA55 510 2 0xAA55 4.2.1.2 根 目 录 条 目 格 式 紧 跟 着 引 导 扇 区 的 是 两 个 完 全 相 同 的 FAT 表, 每 个 FAT 占 用 9 个 扇 区 第 二 个 FAT 之 后 是 根 目 录 的 第 一 个 扇 区 根 目 录 开 始 的 扇 区 号 是 19, 它 由 若 干 个 目 录 条 目 组 成, 条 目 最 多 有 BPB_RootEntCnt 个 由 于 根 目 录 的 大 小 事 依 赖 BPB_RootEntCnt 的, 所 以 长 度 不 固 定 根 目 录 区 中 的 每 一 个 条 目 占 用 32 字 节, 格 式 如 下 表 : 10
第 3 章 系 统 的 架 构 及 实 现 4 表 格 4.2 根 目 录 区 中 的 条 目 格 式 名 称 偏 移 ( 字 节 ) 长 度 ( 字 节 数 ) 描 述 DIR_Name 0 0xB 文 件 名 8 字 节, 扩 展 名 3 字 节 DIR_Attr 0xB 1 文 件 属 性 保 留 位 0xC 10 保 留 位 DIR_WrtTime 0x16 2 最 后 一 次 写 入 时 间 DIR_WrtDate 0x18 2 最 后 一 次 写 入 日 期 DIR_FstClus 0x1A 2 此 条 目 对 应 的 开 始 簇 号 DIR_FileSize 0x1C 4 文 件 大 小 4.2.1.3 FAT 表 格 式 FAT 表 有 两 个,FAT2 可 以 看 做 FAT1 的 备 份 每 一 个 FAT 表 中, 每 12 位 称 为 一 个 FAT 项, 代 表 一 个 簇 第 2 个 FAT 项 簇 开 始 表 示 数 据 区 的 每 一 个 簇 FAT 项 的 数 值 代 表 的 是 文 件 下 一 个 簇 号, 但 是 如 果 大 于 或 者 等 于 0xFF8, 则 表 示 当 前 簇 已 经 是 本 文 件 的 最 后 一 个 簇 如 果 数 值 为 0xFF7, 表 示 它 是 一 个 坏 簇 4.2.2 加 载 loader.com 文 件 要 加 载 一 个 文 件 入 内 存 的 话, 免 不 了 读 取 软 盘 在 实 模 式 下 面, 这 就 需 要 用 到 BIOS 中 断 int 13h 如 下 表 所 述 : 5 表 格 4.3 BIOS 中 断 int 13h 的 用 法 中 断 号 寄 存 器 作 用 13h Ah=00h Dl= 驱 动 器 号 (0 表 复 位 软 驱 示 A 盘 ) Ah=02h Ch= 柱 面 号 Dh= 磁 头 号 Es:bx-> 数 据 缓 冲 区 Al= 要 读 扇 区 数 Cl= 起 始 扇 区 号 Dl= 驱 动 器 号 (0 表 示 A 盘 ) 从 磁 盘 读 数 据 入 es:bx 指 向 的 缓 冲 区 中 加 载 完 成 之 后, 就 可 以 jmp 到 loader.com 被 加 载 的 内 存 位 置 处 了 Boot 模 11
第 3 章 系 统 的 架 构 及 实 现 块 的 任 务 宣 告 完 成 4.3 Loader 模 块 4.3.1 在 软 盘 中 加 载 kernel.bin 文 件 这 一 环 节 与 boot 模 块 寻 找 loader.com 原 理 是 相 同 的, 略 去 不 讲 4.3.2 从 实 模 式 跳 转 到 保 护 模 式 4.3.2.1 实 模 式 和 保 护 模 式 简 介 实 模 式 下, 用 段 地 址 和 偏 移 地 址 组 合 访 问 存 储 单 元 段 地 址 确 定 任 何 64KB 存 储 器 段 的 起 始 地 址, 起 始 地 址 等 于 段 地 址 左 移 四 位 ; 偏 移 地 址 用 于 在 64KB 存 储 器 段 内 选 择 任 一 单 元 保 护 模 式 下, 在 原 来 放 段 地 址 的 段 寄 存 器 里 含 有 一 个 选 择 子, 用 于 选 择 描 述 表 内 的 一 个 描 述 符 描 述 符 描 述 存 储 器 段 的 位 置 长 度 和 访 问 权 限 实 模 式 操 作 方 式 只 允 许 微 处 理 器 寻 址 起 始 的 1MB 存 储 器 空 间, 而 保 护 模 式 则 允 许 访 问 4G 存 储 器 空 间 6 4.3.2.2 跳 转 方 法 从 实 模 式 跳 转 到 保 护 模 式 包 括 以 下 5 个 步 骤 7 : 12
第 3 章 系 统 的 架 构 及 实 现 准 备 一 个 GDT Lgdt 指 令 加 载 gdt 指 针 打 开 A20 地 址 线 置 位 寄 存 器 CR0 的 PE 位 Jmp 指 令, 跳 转 到 保 护 模 式 代 码 图 表 4.1 实 模 式 到 保 护 模 式 的 跳 转 4.3.3 组 装 内 存 中 的 elf 格 式 kernel.bin 由 于 内 核 文 件 的 格 式 是 elf(executable loadable file), 所 以 现 在 内 存 中 的 kernel.bin 还 不 是 能 够 直 接 运 行 的 ELF 文 件 由 四 部 分 组 成 :ELF 文 件 头 (elf header), 程 序 头 表 (program header table) 节 (sections) 节 头 表 (section header table) 在 这 里, 用 到 的 是 ELF 文 件 头 和 program header table Program header table 中 的 条 目 描 述 的 是 系 统 准 备 程 序 运 行 而 需 要 的 一 个 段, 段 在 文 件 中 的 偏 移 在 内 存 中 需 要 被 放 置 的 地 址 Program header table 的 位 置 可 以 通 过 elf header 得 到 ;elf header 就 在 文 件 的 开 始 处 8 在 这 里, 对 于 elf header 和 program header table 的 具 体 格 式 不 详 述 Loader 需 要 做 的 就 是 读 取 program header table 的 每 一 个 条 目, 将 段 复 制 到 指 定 的 内 存 处 所 有 段 复 制 结 束 之 后, 内 存 中 的 kernel 才 处 于 开 执 行 状 态 最 后, 跳 转 到 elf header 指 定 的 程 序 入 口 地 址, 将 控 制 权 转 交 给 kernel 13
第 3 章 系 统 的 架 构 及 实 现 4.4 Kernel 模 块 4.4.1 整 体 架 构 初 始 化 GDT,LDT 加 载 gdtr,idtr 寄 存 器 初 始 化 8259a 中 断 控 制 器 打 开 键 盘 中 断 时 钟 中 断 设 置 IDT: 各 个 中 断 和 异 常 所 对 应 的 处 理 函 数 ( 特 别 是 键 盘 中 断 程 序 时 钟 中 断 程 序 ) 设 置 0x90 号 软 中 断 初 始 化 系 统 调 用 函 数 表 设 置 时 钟 中 断 周 期 初 始 化 TTY 终 端 结 构 体 加 载 新 进 程 状 态 调 用 schedule 函 数 获 取 下 一 个 应 该 得 到 执 行 的 进 程 ID 保 存 当 前 进 程 状 态 Iretd 返 回 新 进 程 进 程 初 始 化 四 个 进 程 的 进 程 表 时 钟 中 断 retf 初 始 化 TSS 段, 将 内 核 堆 栈 参 数 填 入 TSS 将 第 一 个 进 程 的 ss esp cs eip 压 入 堆 栈 图 表 4.2 内 核 架 构 流 程 图 14
第 3 章 系 统 的 架 构 及 实 现 4.4.2 保 护 模 式 下 8259a 的 编 程 设 置 主 要 目 标 是 通 过 8259a 来 设 置 时 钟 中 断 键 盘 中 断 对 应 的 中 断 号, 并 且 打 开 时 钟 中 断 和 键 盘 中 断 外 部 可 屏 蔽 的 硬 件 中 断 与 CPU 的 关 系 是 通 过 对 可 编 程 中 断 控 制 器 8259a 建 立 起 来 的 8259a 的 设 置 并 不 复 杂, 是 通 过 向 相 应 的 端 口 写 入 特 定 的 ICW(Initialization Command Word) 来 实 现 的 主 8259a 对 应 的 端 口 地 址 是 20A 和 21A, 从 8259a 对 应 的 端 口 地 址 是 A0h 和 A1h ICW 共 有 四 个, 每 一 个 都 是 具 有 一 定 格 式 的 字 节, 而 且 四 个 ICW 的 写 入 顺 序 是 不 能 颠 倒 的 9 通 过 ICW1 ICW2 ICW3 ICW4 四 个 控 制 字 的 输 入, 就 可 以 设 定 好 时 钟 中 断 的 中 断 号 键 盘 中 断 的 中 断 号, 并 且 打 开 这 两 个 中 断 4.4.3 中 断 描 述 符 表 的 设 置 主 要 目 标 是 将 时 钟 中 断 程 序 键 盘 中 断 程 序 与 对 应 的 中 断 向 量 关 联 起 来 中 断 描 述 符 表 即 IDT 的 作 用 是 将 每 一 个 中 断 向 量 和 一 个 描 述 符 对 应 起 来 从 这 个 意 义 上 说,IDT 也 是 一 种 向 量 表 下 图 是 中 断 向 量 到 中 断 处 理 程 序 的 对 应 过 程 15
第 3 章 系 统 的 架 构 及 实 现 IDT 目 标 代 码 段 中 断 向 量 偏 移 中 断 处 理 程 序 段 段 描 述 符 段 基 址 IDT 中 的 描 述 符 有 统 一 的 格 式 要 求, 编 程 的 时 候 需 要 谨 慎 处 理 4.4.4 系 统 调 用 图 表 4.3 中 断 向 量 到 中 断 处 理 程 序 的 对 应 过 程 主 要 目 标 是 通 过 软 中 断 来 实 现 系 统 调 用 函 数 Eax 寄 存 器 存 储 系 统 调 用 号, 中 断 完 成 之 后, 返 回 数 值 ( 如 果 有 的 话 ) 存 放 在 eax 中 运 行 在 系 统 中 的 普 通 进 程 ( 特 权 级 最 低 ) 不 能 够 任 意 地 使 用 某 些 指 令, 不 能 访 问 某 些 权 限 更 高 的 内 存 区 域 但 是, 如 果 一 项 任 务 需 要 使 用 这 些 指 令, 那 么 只 能 通 过 系 统 调 用 来 实 现 4.4.5 8253 系 统 时 钟 的 设 置 目 标 是 将 系 统 设 置 为 每 10ms 产 生 一 次 中 断 时 钟 中 断 时 通 过 一 个 叫 做 PIT(Programmable Interval Timer) 的 芯 片 来 触 发 的, 又 叫 做 8253 8253 有 3 个 计 数 器, 都 是 16 位 的, 各 有 各 的 不 同 10 如 16
第 3 章 系 统 的 架 构 及 实 现 下 表 所 示 : 表 格 4.4 8253 的 计 数 器 计 数 器 Counter 0 Counter 1 Counter 2 作 用 输 出 到 IRQ0, 以 便 每 隔 一 段 时 间 让 系 统 产 生 一 次 时 钟 中 断 通 常 被 设 置 为 18, 以 便 大 约 每 15 微 秒 做 一 次 RAM 刷 新 连 接 PC 喇 叭 时 钟 中 断 实 际 上 是 由 8253 的 Counter 0 产 生 的 计 数 器 的 工 作 原 理 是 这 样 的 : 它 有 一 个 输 入 频 率, 在 PC 上 是 1193180Hz 在 每 个 时 钟 周 期, 计 数 器 数 值 会 减 1, 当 减 到 0 的 时 候, 就 会 触 发 一 个 输 出 由 于 计 数 器 是 16 位 的, 所 以 最 大 值 是 65535 因 此 默 认 的 时 钟 中 断 的 发 生 频 率 是 1193180/65536=18.2Hz 所 以 我 们 可 以 通 过 编 程 控 制 8253, 从 而 改 变 每 一 个 时 钟 周 期 的 时 间 长 度 4.4.6 进 程 这 一 模 块 的 目 标 是 实 现 进 程 的 运 行 以 及 调 度 4.4.6.1 进 程 表 使 用 进 程 表 结 构 体 对 进 程 所 需 要 的 所 有 资 源 进 行 管 理, 包 括 CPU 寄 存 器 LDT 堆 栈 输 出 定 向 到 的 TTY 终 端 等 等 4.4.6.2 进 程 状 态 的 保 存 CPU 只 有 一 个, 不 同 进 程 共 用 一 个 CPU 的 一 套 寄 存 器 所 以, 需 要 将 寄 存 器 的 数 值 统 统 保 存 起 来, 准 备 进 程 被 恢 复 执 行 的 时 候 使 用 为 了 保 证 进 程 状 态 不 被 破 坏, 应 该 在 进 程 刚 刚 被 中 断 的 时 候 保 存 所 有 的 寄 存 器 Intel 提 供 了 pushad 指 令, 可 以 保 存 所 有 通 用 寄 存 器 的 数 值 然 后 将 堆 栈 内 的 数 据 保 存 到 进 程 表 结 构 体 当 中 4.4.6.3 如 何 进 行 进 程 的 调 度 对 进 程 的 调 度 是 由 时 钟 中 断 函 数 进 行 的 时 钟 中 断 函 数 在 保 存 了 进 程 状 态 之 后, 会 调 用 一 个 shedule 函 数, 得 到 下 一 个 应 该 得 到 CPU 的 进 程 ID 然 后 将 此 进 程 的 状 态 加 载 进 来 shedule 函 数 内 部 17
第 3 章 系 统 的 架 构 及 实 现 可 以 实 现 设 计 者 自 己 的 调 度 算 法 4.4.6.4 进 程 状 态 的 恢 复 从 时 钟 中 断 返 回 的 时 候, 就 是 恢 复 进 程 的 时 候 所 以 需 要 将 进 程 的 状 态 加 载 到 各 个 寄 存 器 中, 并 且 ss esp efalgs cs eip 等 5 个 寄 存 器 的 数 值 需 要 加 载 到 堆 栈 当 中 以 便 使 得 iretd 指 令 能 够 恢 复 进 程 的 堆 栈, 并 跳 转 到 正 确 的 执 行 地 址 4.4.6.5 堆 栈 管 理 进 程 运 行 在 低 特 权 级, 在 从 进 程 中 断 到 内 核, 以 及 从 内 核 返 回 到 进 程 的 过 程 中 都 会 发 生 堆 栈 切 换 堆 栈 的 管 理 至 关 重 要, 如 果 堆 栈 被 破 坏, 将 会 发 生 不 可 预 料 的 后 果 4.4.6.6 从 进 程 到 内 核 对 于 有 特 权 级 变 换 的 转 移, 由 外 层 向 内 层 转 移 时, 需 要 从 TSS 段 中 取 得 内 层 ss 和 esp 作 为 目 标 代 码 的 ss 和 esp 所 以, 事 先 必 须 要 准 备 好 TSS 段 4.4.6.7 从 内 核 返 回 到 进 程 从 内 核 返 回 到 进 程 实 际 就 是 从 内 核 的 终 端 程 序 返 回 到 进 程, 由 iretd 指 令 完 成 Iretd 会 将 eip cs eflags esp ss 依 次 出 栈, 加 载 到 寄 存 器 要 恢 复 目 标 进 程 的 状 态, 则 除 了 恢 复 通 用 寄 存 器 和 其 他 段 寄 存 器 的 数 值 之 外, 必 须 将 进 程 表 中 保 存 的 eip cs eflags esp ss 数 值 在 iretd 之 前 更 新 到 内 核 堆 栈 之 中 只 有 这 样, 才 能 成 功 返 回 到 进 程 4.4.7 TTY 终 端 和 键 盘 响 应 4.4.7.1 TTY 架 构 18
第 3 章 系 统 的 架 构 及 实 现 键 盘 中 断 处 理 程 序 8042 芯 片 键 盘 中 断 读 取 扫 描 码 将 扫 描 码 写 入 缓 冲 区 系 统 自 定 义 的 键 盘 输 入 缓 冲 区 TTY 进 程 循 环 读 取 缓 冲 区 如 果 是 ALT+F1/F 2/F3 组 合, 则 进 行 TTY 切 换 ; 否 则 在 当 前 的 TTY 上 显 示 字 符 图 表 4.4 TTY 终 端 架 构 图 4.4.7.2 键 盘 中 断 当 计 算 机 中 的 8048 芯 片 检 测 到 一 个 键 的 动 作 后, 会 把 扫 描 码 发 送 给 8042 芯 片 8042 芯 片 将 其 转 换 成 Scan Code Set 1 扫 描 码, 并 放 置 在 芯 片 内 部 的 输 入 缓 冲 区 中 然 后 8042 告 诉 8259a 产 生 键 盘 中 断 如 果 此 时 键 盘 又 有 新 的 按 键 被 按 下,8042 将 不 再 接 收, 一 直 到 缓 冲 区 被 清 空,8042 才 会 收 到 更 多 的 扫 描 码 系 统 的 键 盘 中 断 程 序 做 得 事 情 很 简 单 --- 每 当 产 生 一 次 键 盘 中 断, 就 从 8042 芯 片 的 缓 冲 区 中 读 入 按 键 扫 描 码, 然 后 存 放 到 系 统 自 己 的 键 盘 输 入 缓 冲 区 中 4.4.7.3 TTY 结 构 体 一 个 TTY 实 际 上 对 应 着 一 部 分 显 存 TTY 结 构 体 中 保 存 了 这 块 显 存 的 起 始 地 址 结 束 地 址 当 前 显 示 地 址 光 标 当 前 地 址 等 四 个 域 所 谓 的 TTY 显 示 就 是 将 内 容 写 到 显 存 中 去 所 谓 的 TTY 切 换 就 是 设 置 当 前 被 显 示 的 显 存 区 域 设 置 当 前 被 显 示 的 显 存 区 域 涉 及 到 对 VGA 寄 存 器 系 统 进 行 操 作 4.4.7.4 TTY 进 程 TTY 进 程 循 环 读 取 键 盘 输 入 缓 冲 区 的 内 容, 判 断 当 前 有 效 地 TTY 终 端, 将 可 打 印 字 符 写 到 对 应 TTY 终 端 的 屏 幕 上 如 果 用 户 的 按 键 是 ALT+F1/F2/F3 其 中 的 一 种 组 合, 则 TTY 进 程 判 断 得 出 目 标 TTY 终 端 号, 然 后 切 换 到 这 个 终 端 19
第 4 章 重 要 问 题 及 解 决 第 5 章 重 要 问 题 及 解 决 5.1 软 盘 文 件 的 加 载 前 文 已 经 讲, 系 统 的 启 动 分 别 需 要 加 载 引 导 扇 区 boot.bin 文 件 loader.com 文 件 kernel.bin 文 件 在 做 这 方 面 工 作 的 时 候, 曾 经 遇 到 过 系 统 启 动 过 程 中 突 然 崩 溃 的 问 题, 完 全 没 有 任 何 征 兆 经 过 仔 细 检 查 代 码, 发 现 问 题 源 于 文 件 内 存 的 重 叠 当 loader.com 加 载 kernel.bin 文 件 的 时 候, 由 于 没 有 谨 慎 处 理 内 存 加 载 地 址, 导 致 新 加 载 的 kernenl.bin 将 loader.com 的 内 存 代 码 数 据 覆 盖 掉, 因 此 出 现 系 统 崩 溃 5.2 汇 编 文 件 的 编 译 过 程 理 解 汇 编 文 件 的 编 译 过 程 对 于 本 课 题 的 开 发 至 关 重 要 其 中 非 常 重 要 的 一 个 方 面 就 是 标 号 (LABEL) 地 址 的 确 定 当 编 译 一 个 汇 编 文 件, 会 将 整 个 文 件 当 做 一 个 代 码 段 来 编 译 ; 因 此, 标 号 的 地 址 就 是 在 这 个 代 码 段 内 的 偏 移 地 址 加 载 到 内 存 之 后, 在 实 模 式 下 面, 其 实 际 的 物 理 地 址 就 是 (cs<<4)+label 或 者 段 基 址 +LABEL 5.3 编 译 平 台 和 运 行 平 台 在 Kernel 模 块 开 发 过 程 中, 已 经 可 以 开 始 使 用 C 语 言 进 行 编 程 然 后, 在 开 发 初 始 阶 段,Kernel 一 直 在 复 制 loader.comgdt 的 时 候 出 错 迫 不 得 已 将 kernel.bin 使 用 objdump 命 令 反 汇 编 出 来 查 看 其 汇 编 代 码, 发 现 全 部 都 是 64 位 INTEL 指 令 于 是 猜 想 是 编 译 平 台 (64 位 ) 和 运 行 平 台 (32) 位 内 存 地 址 不 兼 容 产 生 的 错 误 于 是 将 所 有 输 出 文 件 的 平 台 都 指 定 为 32 位 Nasm 使 用 -f elf32 选 项, Gcc 使 用 m32 选 项,LD 指 令 使 用 elf32-i386 选 项 再 次 编 译 运 行, 果 然 不 再 出 错 5.4 Loop 指 令 的 一 个 bug 实 践 过 程 中, 发 现 当 ecx 的 初 始 数 值 为 0 的 时 候,loop 指 令 就 会 出 错 所 以 20
第 4 章 重 要 问 题 及 解 决 为 安 全 起 见, 汇 编 编 写 过 程 中 最 好 不 使 用 loop, 而 是 按 部 就 班 使 用 cmp 指 令 进 行 判 断 5.5 进 程 堆 栈 和 内 核 堆 栈 堆 栈 是 编 程 中 需 要 加 以 谨 慎 处 理 的 内 核 每 一 个 进 程 必 须 要 有 自 己 独 立 的 堆 栈 C 语 言 中, 堆 栈 的 一 个 主 要 作 用 是 在 调 用 函 数 之 前 的 参 数 入 栈 如 果 进 程 或 者 内 核 的 堆 栈 数 据 被 破 坏, 那 么 其 调 用 的 函 数 在 返 回 的 时 候, 可 能 的 后 果 就 是 发 现 返 回 地 址 eip 和 cs 已 经 被 改 得 面 目 全 非 了, 所 以 调 用 函 数 会 返 回 到 一 个 莫 名 其 妙 的 地 址, 然 后 产 生 莫 名 其 妙 的 错 误 如 果 时 钟 中 断 中 内 核 的 堆 栈 的 数 据 被 破 坏, 那 么 在 返 回 到 进 程 的 时 候, 完 全 不 能 加 载 正 确 的 eip cs efalgs esp ss 寄 存 器, 从 而 产 生 错 误 在 课 题 开 发 过 程 中, 由 于 堆 栈 操 作 错 误 而 导 致 系 统 崩 溃 的 情 况 时 有 发 生 这 是 笔 者 亲 身 实 践 得 来 的 教 训 5.6 分 段 机 制 中 的 权 限 权 限 同 样 是 编 程 中 需 要 加 以 谨 慎 处 理 的 分 段 机 制 的 描 述 符 中 包 含 了 目 标 段 的 权 限 属 性, 如 果 当 前 代 码 段 的 CPL 的 权 限 不 够, 就 不 能 够 访 问 目 标 代 码 段 Intel 分 段 机 制 有 一 套 权 限 管 理 规 则, 编 程 过 程 中 必 须 严 格 遵 守 这 套 规 则 这 里 值 得 一 提 的 是 TTY 进 程 的 I/O 权 限 问 题 由 于 TTY 进 程 需 要 与 8042 芯 片 和 VGA 寄 存 器 组 进 行 交 互, 所 以 需 要 拥 有 I/O 操 作 权 限 Eflags 寄 存 器 中 的 第 12 13 位 称 为 IOPL 域 in out ins outs cli sti 这 些 I/O 敏 感 指 令 只 有 在 CPL<=IOPL 的 时 候 进 程 才 有 权 限 使 用 因 此, 在 初 始 化 TTY 进 程 的 时 候, 其 eflags 寄 存 器 的 IOPL 域 需 要 设 置 为 1, 这 样, 使 得 TTY 进 程 可 以 自 由 使 用 I/O 敏 感 指 令, 特 权 级 低 于 1 的 进 程 则 不 能 够 使 用 I/O 敏 感 指 令 5.7 Printf 函 数 的 参 数 问 题 在 刚 开 始 编 写 printf(const char*, ) 不 定 参 数 函 数 的 时 候, 发 现 不 能 传 入 参 数 例 如, 调 用 语 句 如 下 : Printf( %d, 10); Printf 函 数 内 部 打 印 第 二 个 参 数 的 数 值 : Printf(const char*fmt, ){ 21
第 4 章 重 要 问 题 及 解 决 } Disp_int(*(int*)(&fmt+4)) int i; int *p; p=(int*)&fmt; i=*p; 其 他 代 码 Printf 函 数 内 部 调 用 disp_int 函 数 打 印 出 来 的 第 二 个 参 数 数 值 并 不 是 10 多 次 试 验 发 现, 不 管 调 用 者 传 入 的 第 二 个 参 数 是 多 少,disp_int 打 印 出 来 的 都 不 是 传 入 数 值 将 printf.o 文 件 反 汇 编 出 来 以 后, 得 到 的 对 应 代 码 如 下 1. Lead eax, [ebp+0x8] 2. Mov [ebp-0x10],eax 3. Mov eax, [ebp-0x10] 4. Mov eax, [eax] 如 上 所 示, 第 一 行 lea 是 p=(int*)&fmt 语 句 的 汇 编, 可 知 eax 被 赋 予 了 fmt 在 堆 栈 段 内 的 地 址 第 四 行 mov eax,[eax] 对 应 i=*p 这 一 句 所 以 这 样 一 来 问 题 就 很 清 晰 了 &fmt 取 得 时 fmt 的 堆 栈 段 内 地 址, 而 取 数 据 的 时 候 却 是 用 ds 作 为 选 择 子 去 取 的 我 的 进 程 ds 和 ss 选 择 子 对 应 的 数 据 段 和 堆 栈 段 的 基 址 是 不 同 的, 因 此 出 错 在 这 种 情 况 下, 只 能 修 改 LDT, 使 得 进 程 的 ds 和 ss 对 应 的 段 基 址 相 同 这 样 C 文 件 编 译 出 来 才 不 会 出 错 22
第 4 章 总 结 及 开 发 方 向 第 6 章 总 结 及 开 发 方 向 6.1 总 结 本 课 题 基 本 上 达 到 了 预 期 的 目 标, 成 功 完 成 了 一 个 操 作 系 统 内 核 初 步 实 现 了 操 作 系 统 中 最 基 础 最 重 要 的 概 念 ----- 进 程, 能 够 进 行 简 单 的 进 程 调 度 算 法 实 现 了 TTY 终 端 显 示 和 键 盘 响 应 的 I/O 功 能, 能 够 为 用 户 提 供 一 个 可 视 的 输 入 输 出 界 面 实 现 了 基 本 的 系 统 调 用, 使 得 用 户 进 程 能 够 通 过 系 统 调 用 来 获 取 系 统 信 息, 完 成 高 特 权 级 任 务 至 此, 内 核 的 功 能 已 经 大 致 具 备 本 课 题 用 到 了 两 种 编 程 语 言,nasm 汇 编 语 言 C 语 言 以 及 混 合 编 程 这 个 课 题 的 实 现, 让 笔 者 对 C 语 言 的 指 针 内 存 分 配 参 数 传 递 等 有 了 更 加 深 入 的 理 解, 对 汇 编 语 言 的 编 译 过 程 地 址 处 理 等 的 理 解 则 提 升 到 了 一 个 新 的 层 次 同 时, 对 于 Intel X86 处 理 器 的 工 作 原 理, 包 括 实 模 式 保 护 模 式 分 段 机 制 分 页 机 制 GDT LDT IDT 等 的 本 质 有 了 清 晰 明 朗 的 认 识 对 于 操 作 系 统 的 进 程 终 端 系 统 调 用 等 概 念 也 有 了 更 深 一 层 的 理 解 本 课 题 可 以 说 是 集 大 学 前 三 年 知 识 的 积 累 完 成 的 由 于 涉 及 到 底 层 硬 件 的 编 程, 项 目 进 展 过 程 中 出 现 了 非 常 多 超 出 意 料 的 错 误 这 种 情 况 下, 唯 有 从 头 开 始, 逐 次 检 查 代 码 模 块, 分 析 层 次 逻 辑 ; 然 后 再 从 错 误 逆 向 推 理 这 个 过 程 需 要 耐 心 和 毅 力, 同 时 要 需 要 坚 实 的 知 识 基 础 没 有 大 学 前 三 年 知 识 的 积 累 调 试 的 经 验, 笔 者 不 可 能 完 成 这 个 任 务 6.2 系 统 未 来 开 发 方 向 系 统 存 在 的 一 个 不 足 之 处 在 于 boot 模 块 和 loader 模 块 的 功 能 显 得 重 复, 考 虑 可 以 将 loader 模 块 去 掉, 仅 仅 使 用 boot 模 块 来 加 载 内 核, 然 后 再 内 核 中 完 成 实 模 式 到 保 护 模 式 的 跳 转 进 程 是 通 过 系 统 调 用 来 完 成 高 特 权 级 任 务 的 这 种 内 核 称 为 宏 内 核 另 一 种 微 内 核 的 思 想 则 是, 将 这 些 工 作 从 内 核 剥 离 出 来, 交 给 一 些 系 统 进 程 来 做, 让 内 核 只 是 负 责 它 必 须 负 责 的 工 作, 例 如 进 程 调 度 宏 内 核 的 优 势 在 于 其 逻 辑 简 单, 直 截 了 当, 实 现 起 来 也 容 易 ; 而 且 避 免 了 像 微 内 核 那 样 在 消 息 传 递 的 时 候 占 用 资 源 而 微 内 核 的 优 势 在 于, 逻 辑 虽 然 复 杂 但 是 严 谨, 结 构 上 显 得 非 常 23
第 4 章 总 结 及 开 发 方 向 优 雅 和 精 致, 而 且 程 序 更 容 易 模 块 化, 从 而 更 容 易 移 植 从 长 期 来 看, 当 内 核 逐 渐 变 大, 微 内 核 的 优 势 就 会 体 现 出 来 所 以, 今 后 将 选 择 微 内 核 作 为 我 们 系 统 的 内 核 架 构 方 法 当 前 的 系 统 实 际 是 雏 形 的 不 完 整 的, 因 为 它 不 具 备 文 件 系 统 管 理 内 存 管 理 功 能 虽 然 实 现 了 进 程 和 终 端, 但 是 只 能 运 行 编 译 在 系 统 内 部 的 进 程, 不 能 够 运 行 磁 盘 上 的 可 执 行 文 件 ; 内 存 管 理 恰 恰 是 运 行 用 户 应 用 程 序 的 基 础 因 此, 文 件 系 统 管 理 内 存 管 理 将 是 系 统 下 一 步 需 要 添 加 的 功 能 模 块 总 之, 系 统 还 有 很 多 方 面 需 要 完 善 和 改 进 这 次 毕 业 设 计 让 我 学 到 书 本 上 学 不 到 的 知 识, 也 给 了 我 自 信 这 个 课 题 虽 然 结 束 了, 但 我 将 会 继 续 坚 持 对 系 统 的 开 发, 直 到 完 成 一 个 五 脏 俱 全 的 操 作 系 统 24
第 4 章 总 结 及 开 发 方 向 参 考 文 献 [1] 于 渊,2005.8: 自 己 动 手 写 操 作 系 统, 北 京 电 子 工 业 出 版 社, 第 5 页 [2]( 荷 ) 坦 尼 鲍 姆 著, 陈 向 群 等 译,2005.9 : 现 代 操 作 系 统 ( 第 2 版 ), 机 械 工 业 出 版 社, 第 6 页 [3] 向 勇, 王 雷, 马 洪 兵, 郑 扣 根,( 美 )Dava Probert,2004.11 出 版 :windows 操 作 系 统 原 理 ( 第 二 版 ), 机 械 工 业 出 版 社, 第 6 页 [4] 汤 小 丹,2007.5: 计 算 机 操 作 系 统, 西 安 电 子 科 技 大 学, 第 8 页 [5] 王 玉 平,2002: 扩 展 BIOS 中 INT 13H 的 参 数 传 递 方 法, 微 计 算 机 应 用 [6] 金 惠 华, 艾 明 晶, 尚 利 宏 译,( 美 )Barry B.Brey 著,2008.2:Intel 微 处 理 器, 第 39 41 页 [7] 于 渊,2005.8: 自 己 动 手 写 操 作 系 统, 北 京 电 子 工 业 出 版 社, 第 47 页 [8] 工 具 接 口 标 准 委 员 :Executable and Linking Format,TOOLS INTERFACE STANDARDS [9] 金 惠 华, 艾 明 晶, 尚 利 宏 译,( 美 )Barry B.Brey 著,2008.2:Intel 微 处 理 器, 第 356 页 [10] 金 惠 华, 艾 明 晶, 尚 利 宏 译,( 美 )Barry B.Brey 著,2008.2:Intel 微 处 理 器, 第 318 页 25
第 4 章 总 结 及 开 发 方 向 致 谢 在 课 题 开 发 过 程 中, 王 新 宇 老 师 和 邱 炜 伟 学 姐 给 了 我 很 多 建 议 和 帮 助, 使 我 能 够 顺 利 完 成 这 次 毕 业 设 计 在 此, 我 对 他 们 表 示 衷 心 的 感 谢! 26
本 科 生 毕 业 论 文 ( 设 计 ) 任 务 书 一 题 目 : 微 型 操 作 系 统 的 设 计 与 实 现 二 指 导 教 师 对 毕 业 论 文 ( 设 计 ) 的 进 度 安 排 及 任 务 要 求 : 任 务 安 排 : 3.22~3.28 完 成 Boot 模 块 3.29~4.4 实 现 从 实 模 式 到 保 护 模 式 的 跳 转 4.5 ~4. 11 实 现 内 存 的 分 页 机 制 4.12~4.18 建 立 IDT, 实 现 一 个 中 断 实 现 一 个 内 核 loader 4.19~4.25 编 写 内 核, 并 且 能 够 使 用 loader 将 内 核 文 件 加 载 入 内 存 运 行 起 来 4.25~5. 1 实 现 简 单 的 进 程, 添 加 若 干 个 进 程, 并 且 实 现 进 程 调 度 管 理 5.2 ~5.8 实 现 键 盘 的 输 入 输 出 响 应 5.9~5.15 实 现 简 单 的 文 件 系 统 管 理 5.16-5.31 毕 设 报 告 撰 写 起 讫 日 期 2009 年 12 月 日 至 2010 年 6 月 日 三 系 或 研 究 所 审 核 意 见 : 指 导 教 师 ( 签 名 ) 王 新 宇 职 称 负 责 人 ( 签 名 ) 年 月 日 27
毕 业 论 文 ( 设 计 ) 考 核 一 指 导 教 师 对 毕 业 论 文 ( 设 计 ) 的 评 语 : 曲 国 铖 同 学 在 毕 业 设 计 中 完 成 了 一 个 微 型 操 作 系 统 的 设 计 与 实 现, 对 操 作 系 统 原 理 有 深 入 认 识, 并 体 现 出 较 好 的 编 程 能 力 作 者 工 作 认 真, 态 度 积 极 毕 设 报 告 内 容 充 实, 条 理 清 晰, 表 达 严 谨, 是 一 份 高 质 量 的 毕 业 设 计 指 导 教 师 ( 签 名 ) 王 新 宇 年 月 日 二 答 辩 小 组 对 毕 业 论 文 ( 设 计 ) 的 答 辩 评 语 及 总 评 成 绩 : 成 绩 比 例 文 献 综 述 占 (10%) 开 题 报 告 占 (20%) 外 文 翻 译 占 (10%) 毕 业 论 文 ( 设 计 ) 质 量 及 答 辩 占 (60%) 总 评 成 绩 分 值 答 辩 小 组 负 责 人 ( 签 名 ) 年 月 日 28