浙江大学本科论文模板



Similar documents
06721 main() lock pick proc() restart() [2][4] MINIX minix2.0 GDT, IDT irq table[] CPU CPU CPU CPU (IDTR) idt[] CPU _hwint00:! Interrupt

1 CPU interrupt INT trap CPU exception

untitled

投影片 1

Windows RTEMS 1 Danilliu MMI TCP/IP QEMU i386 QEMU ARM POWERPC i386 IPC PC104 uc/os-ii uc/os MMI TCP/IP i386 PORT Linux ecos Linux ecos ecos eco

普 通 高 等 教 育 十 二 五 重 点 规 划 教 材 计 算 机 系 列 中 国 科 学 院 教 材 建 设 专 家 委 员 会 十 二 五 规 划 教 材 操 作 系 统 戴 仕 明 姚 昌 顺 主 编 姜 华 张 希 伟 副 主 编 郑 尚 志 梁 宝 华 参 编 参 编 周 进 钱 进

D/A DAC ( 1us) (10~20 ) DAC0832 1

Abstract arm linux tool-chain root NET-Start! 2

IP TCP/IP PC OS µclinux MPEG4 Blackfin DSP MPEG4 IP UDP Winsock I/O DirectShow Filter DirectShow MPEG4 µclinux TCP/IP IP COM, DirectShow I

ARM JTAG实时仿真器安装使用指南

使用开源软件-自己动手写操作系统


概述

HighPoint产品的FAQ手册

1 Project New Project 1 2 Windows 1 3 N C test Windows uv2 KEIL uvision2 1 2 New Project Ateml AT89C AT89C51 3 KEIL Demo C C File

A Preliminary Implementation of Linux Kernel Virus and Process Hiding

目次 

C/C++ - 字符输入输出和字符确认

sp_overview.pptx

Microsoft Word - PS2_linux_guide_cn.doc

大学计算机基础B.doc

Windows XP

Microsoft Word htm

Public Projects A Thesis Submitted to Department of Construction Engineering National Kaohsiung First University of Science and Technology In Partial

A dissertation for Master s degree Metro Indoor Coverage Systems Analysis And Design Author s Name: Sheng Hailiang speciality: Supervisor:Prof.Li Hui,


本文由筱驀釹贡献

作 業 系 統 簡 介 光 有 電 腦 硬 體, 會 不 容 易 使 用 必 須 要 有 適 當 的 程 式, 才 方 便 操 作 硬 體 衍 生 作 業 系 統 需 求 : 提 供 方 便 使 用 者 執 行 程 式 平 台 有 效 使 用 各 種 電 腦 硬 體 資 源 Jingo C. Lia

1 CPU

相 关 知 识 1 计 算 机 工 作 原 理 1946 年 2 月, 世 界 上 第 一 台 电 子 计 算 机 ENIAC (Electronic Numerical Integrator And Computer, 电 子 数 字 积 分 计 算 机 ) 诞 生 于 美 国 宾 夕 法 尼 亚

untitled

P4i45GL_GV-R50-CN.p65

CH01.indd

Learning Java

C/C++ - 文件IO

高 职 计 算 机 类 优 秀 教 材 书 目 * 序 号 书 号 (ISBN) 书 名 作 者 定 价 出 版 / 印 刷 日 期 ** 配 套 资 源 页 码 计 算 机 基 础 课 计 算 机 应 用 基 础 刘 升 贵 年 8 月

概述

C/C++ - 函数

Red Flag Linux Desktop 4.0 Red Flag Linux Desktop 4.0 1

第 15 章 程 式 編 写 語 言 15.1 程 式 編 写 語 言 的 角 色 程 式 編 寫 語 言 是 程 式 編 寫 員 與 電 腦 溝 通 的 界 面 語 法 是 一 組 規 則 讓 程 式 編 寫 員 將 字 詞 集 合 起 來 電 腦 是 處 理 位 元 和 字 節 的 機 器, 與

Microsoft Word - 正文.doc

畢業專題結案報告書格式

Oracle 4

I

藍牙網路在資訊家電的應用

untitled

T1028_Manual_KO_V3 0.pdf

AIX系统培训7.ppt

典型自编教材

热设计网

JAEA-Technology indb

《计算机应用基础》学习材料(讲义)

OSI OSI 15% 20% OSI OSI ISO International Standard Organization 1984 OSI Open-data System Interface Reference Model OSI OSI OSI OSI ISO Prototype Prot

ebook8-30

1.ai


A VALIDATION STUDY OF THE ACHIEVEMENT TEST OF TEACHING CHINESE AS THE SECOND LANGUAGE by Chen Wei A Thesis Submitted to the Graduate School and Colleg

Chapter 2 GIGA-BYTE TECHNOLOGY CO., LTD. ("GBT") GBT GBT GBT

内 容 培 训 目 标 基 础 知 识 常 用 监 控 命 令 在 实 战 中 综 合 运 用 2

,768 32,767 32K JMP Jnnn (386+) LOOP CALL [Label:] JMP short/near/far address L10: jmp jmp L20: L10 L20

ch08.PDF

南華大學數位論文

Microsoft Word 一年級散文教案.doc

米食天地教案

untitled

項 訴 求 在 考 慮 到 整 體 的 財 政 承 擔 以 及 資 源 分 配 的 公 平 性 下, 政 府 採 取 了 較 簡 單 直 接 的 一 次 性 減 稅 和 增 加 免 稅 額 方 式, 以 回 應 中 產 家 庭 的 不 同 訴 求 ( 三 ) 取 消 外 傭 徵 費 6. 行 政 長

(f) (g) (h) (ii) (iii) (a) (b) (c) (d) 208

Microsoft Word - 08 单元一儿童文学理论

Microsoft Word - 發布版---規範_全文_.doc

概 述 随 着 中 国 高 等 教 育 数 量 扩 张 目 标 的 逐 步 实 现, 提 高 教 育 质 量 的 重 要 性 日 益 凸 显 发 布 高 校 毕 业 生 就 业 质 量 年 度 报 告, 是 高 等 学 校 建 立 健 全 就 业 状 况 反 馈 机 制 引 导 高 校 优 化 招

鱼类丰产养殖技术(二).doc

疾病诊治实务(一)

名人养生.doc

<4D F736F F D2040B9C5B871A661B0CFABC8AE61C2A7AB55ACE3A8735FA7F5ABD8BFB3B9C5B871A661B0CFABC8AE61C2A7AB55ACE3A8732E646F63>


中老年保健必读(十).doc

27 i

% % ,542 12,336 14,53 16,165 18,934 22,698 25, ,557 7,48 8,877 11, 13,732 17,283 22,

穨ecr1_c.PDF

穨2005_-c.PDF

北京理工大学.doc

尲㐵.⸮⸮⸮⸮⸮

果树高产栽培技术(一).doc

物质结构_二_.doc

第一節 研究動機與目的

水力发电(九)

Transcription:

本 科 生 毕 业 设 计 报 告 项 目 名 称 微 型 操 作 系 统 的 设 计 与 实 现 姓 名 与 学 号 曲 国 铖 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