目 录 ( 下 ) 计 算 的 美 丽 -- 图 灵 奖 的 第 一 个 四 十 年 陈 怀 临 对 中 国 系 统 架 构 师 的 七 个 期 望 陈 怀 临 对 高 端 通 信 系 统 设 计 的 七 个 展 望 陈 怀 临 微 内 核 操 作 系 统 及 L4 概 述 杰 夫 微 内 核 与

Similar documents
说 明 为 了 反 映 教 运 行 的 基 本 状 态, 为 校 和 院 制 定 相 关 政 策 和 进 行 教 建 设 与 改 革 提 供 据 依 据, 校 从 程 资 源 ( 开 类 别 开 量 规 模 ) 教 师 结 构 程 考 核 等 维 度, 对 2015 年 春 季 期 教 运 行 基

龚 亚 夫 在 重 新 思 考 基 础 教 育 英 语 教 学 的 理 念 一 文 中 援 引 的 观 点 认 为 当 跳 出 本 族 语 主 义 的 思 维 定 式 后 需 要 重 新 思 考 许 多 相 连 带 的 问 题 比 如 许 多 发 音 的 细 微 区 别 并 不 影 响 理 解 和

何 秋 琳 张 立 春 视 觉 学 习 研 究 进 展 视 觉 注 意 视 觉 感 知

<433A5C446F63756D656E E E67735C41646D696E F725CD7C0C3E65CC2DBCEC4CFB5CDB3CAB9D3C3D6B8C4CFA3A8BCF2BBAFA3A95CCAB9D3C3D6B8C4CF31302D31392E646F63>

深圳市新亚电子制程股份有限公司

《C语言基础入门》课程教学大纲

,,,,, :,, (.,, );, (, : ), (.., ;. &., ;.. &.., ;, ;, ),,,,,,, ( ) ( ),,,,.,,,,,, : ;, ;,.,,,,, (., : - ),,,, ( ),,,, (, : ),, :,


( 二 ) 现 行 统 一 高 考 制 度 不 利 于 培 养 人 的 创 新 精 神,,,,,,,,,,,,, [ ],,,,,,,,,,, :, ;,,,,,,? ( 三 ) 现 行 统 一 高 考 制 度 不 利 于 全 体 学 生 都 获 得 全 面 发 展,, [ ],,,,,,,,,,,

评 委 : 李 炎 斌 - 个 人 技 术 标 资 信 标 初 步 审 查 明 细 表 序 号 投 标 单 位 投 标 函 未 按 招 标 文 件 规 定 填 写 漏 填 或 内 容 填 写 错 误 的 ; 不 同 投 标 人 的 投 标 文 件 由 同 一 台 电 脑 或 同 一 家 投 标 单

一 公 共 卫 生 硕 士 专 业 学 位 论 文 的 概 述 学 位 论 文 是 对 研 究 生 进 行 科 学 研 究 或 承 担 专 门 技 术 工 作 的 全 面 训 练, 是 培 养 研 究 生 创 新 能 力, 综 合 运 用 所 学 知 识 发 现 问 题, 分 析 问 题 和 解 决

HSK( 一 级 ) 考 查 考 生 的 日 常 汉 语 应 用 能 力, 它 对 应 于 国 际 汉 语 能 力 标 准 一 级 欧 洲 语 言 共 同 参 考 框 架 (CEF) A1 级 通 过 HSK( 一 级 ) 的 考 生 可 以 理 解 并 使 用 一 些 非 常 简 单 的 汉 语


修改版-操作手册.doc

课程类 别

0 年 上 半 年 评 价 与 考 核 细 则 序 号 部 门 要 素 值 考 核 内 容 考 核 方 式 考 核 标 准 考 核 ( 扣 原 因 ) 考 评 得 3 安 全 生 产 目 30 无 同 等 责 任 以 上 道 路 交 通 亡 人 事 故 无 轻 伤 责 任 事 故 无 重 大 质 量

马 克 思 主 义 公 正 观 的 基 本 向 度 及 方 法 论 原 则!! # #


( ) 信 号 与 系 统 Ⅰ 学 科 基 础 必 修 课 教 周 2016 年 06 月 13 日 (08:00-09:35) ( )

名 称 生 命 科 学 学 院 环 境 科 学 1 生 物 学 仅 接 收 院 内 调 剂, 初 试 分 数 满 足 我 院 生 物 学 复 试 最 低 分 数 线 生 命 科 学 学 院 生 态 学 5 生 态 学 或 生 物 学 生 命 科 学 学 院

18 上 报 该 学 期 新 生 数 据 至 阳 光 平 台 第 一 学 期 第 四 周 至 第 六 周 19 督 促 学 习 中 心 提 交 新 增 专 业 申 请 第 一 学 期 第 四 周 至 第 八 周 20 编 制 全 国 网 络 统 考 十 二 月 批 次 考 前 模 拟 题 第 一 学

抗 日 战 争 研 究 年 第 期

一 从 分 封 制 到 郡 县 制 一 从 打 虎 亭 汉 墓 说 起

<4D F736F F D D323630D6D0B9FAD3A6B6D4C6F8BAF2B1E4BBAFB5C4D5FEB2DFD3EBD0D0B6AF C4EAB6C8B1A8B8E6>

I

伊 犁 师 范 学 院 611 语 言 学 概 论 全 套 考 研 资 料 <2016 年 最 新 考 研 资 料 > 2-2 语 言 学 纲 要 笔 记, 由 考 取 本 校 本 专 业 高 分 研 究 生 总 结 而 来, 重 点 突 出, 借 助 此 笔 记 可 以 大 大 提 高 复 习 效

抗 战 时 期 国 民 政 府 的 银 行 监 理 体 制 探 析 % # % % % ) % % # # + #, ) +, % % % % % % % %

评 委 : 徐 岩 宇 - 个 人 技 术 标 资 信 标 初 步 审 查 明 细 表 序 号 投 标 单 位 投 标 函 未 按 招 标 文 件 规 定 填 写 漏 填 或 内 容 填 写 错 误 的 ; 不 同 投 标 人 的 投 标 文 件 由 同 一 台 电 脑 或 同 一 家 投 标 单

Microsoft Word - 第7章 图表反转形态.doc

2006年顺德区高中阶段学校招生录取分数线


 编号:

西 南 民 族 学 院 学 报 哲 学 社 会 科 学 版 第 卷 资 料 来 源 中 国 统 计 年 鉴 年 年 新 中 国 五 十 年 统 计 资 料 汇 编 中 国 人 口 统 计 年 鉴 年 数 据 资 料 来 源 中 国 统 计 年 鉴 中 国 统 计 出 版 社 年 版 资 料 来 源

3 复 试 如 何 准 备 4 复 试 成 绩 计 算 5 复 试 比 例 6 复 试 类 型 7 怎 么 样 面 对 各 种 复 试 04 05

2014年中央财经大学研究生招生录取工作简报


<433A5C C6B73625C B746F705CB9FABCCAD6D0D2BDD2A9D7A8D2B5B8DFBCB6BCBCCAF5D6B0B3C6C6C0C9F3C9EAC7EBD6B8C4CFA3A CDA8D3C3B0E6A3A92E646F63>

3 月 30 日 在 中 国 证 券 报 上 海 证 券 报 证 券 时 报 证 券 日 报 和 上 海 证 券 交 易 所 网 站 上 发 出 召 开 本 次 股 东 大 会 公 告, 该 公 告 中 载 明 了 召 开 股 东 大 会 的 日 期 网 络 投 票 的 方 式 时 间 以 及 审

中 国 软 科 学 年 第 期!!!

!!!!!

收 入 支 出 项 目 2016 年 预 算 项 目 2016 年 预 算 预 算 01 表 单 位 : 万 元 ( 保 留 两 位 小 数 ) 一 公 共 财 政 预 算 拨 款 一 人 员 经 费 一 般 财 力 人 员 支 出 成 品

¹ º ¹ º 农 业 流 动 人 口 是 指 户 口 性 质 为 农 业 户 口 在 流 入 地 城 市 工 作 生 活 居 住 一 个 月 及 以 上 的 流 动 人 口 非 农 流 动 人 口 是 指 户 口 性 质 为 非 农 户 口 在 流 入 地 城 市 工 作 生 活 居 住 一 个

随着执业中医师资格考试制度的不断完善,本着为我校中医学专业认证服务的目的,本文通过对我校中医类毕业生参加2012年和2013年的中医执业医师考试成绩及通过率、掌握率进行分析,并与全国的平均水平进行差异比较分析,以此了解我校执业中医师考试的现状,进而反映我校中医类课程总体教学水平,发现考核知识模块教学中存在的不足,反馈给相关学院和教学管理部门,以此提高教学和管理水平。

年 8 月 11 日, 公 司 召 开 2015 年 第 五 次 临 时 股 东 大 会, 审 议 通 过 了 关 于 公 司 <2015 年 股 票 期 权 激 励 计 划 ( 草 案 )> 及 其 摘 要 的 议 案 关 于 提 请 股 东 大 会 授 权 董 事 会 办 理 公

珠江钢琴股东大会

全国建筑市场注册执业人员不良行为记录认定标准(试行).doc

一 开 放 性 的 政 策 与 法 规 二 两 岸 共 同 的 文 化 传 承 三 两 岸 高 校 各 自 具 有 专 业 优 势 远 见 杂 志 年 月 日

教师上报成绩流程图

Microsoft Word - 文件汇编.doc

<4D F736F F D20B9D8D3DAB0BABBAAA3A8C9CFBAA3A3A9D7D4B6AFBBAFB9A4B3CCB9C9B7DDD3D0CFDEB9ABCBBE C4EAC4EAB6C8B9C9B6ABB4F3BBE1B7A8C2C9D2E2BCFBCAE92E646F6378>

证券代码: 证券简称:长城电脑 公告编号:

国债回购交易业务指引

现 场 会 议 时 间 为 :2016 年 5 月 19 日 网 络 投 票 时 间 为 :2016 年 5 月 18 日 年 5 月 19 日 其 中 通 过 深 圳 证 券 交 易 所 交 易 系 统 进 行 网 络 投 票 的 时 间 为 2016 年 5 月 19 日 9:30-

中 中 中 中 部 中 岗 位 条 件 历 其 它 历 史 师 地 理 师 生 物 师 体 与 健 康 师 从 事 中 历 史 工 从 事 中 地 理 工 从 事 中 生 物 工 从 事 中 体 与 健 康 工 2. 课 程 与 论 ( 历 史 ); 2. 科 ( 历 史 )

ETF、分级基金规模、份额变化统计

公 开 刊 物 须 有 国 内 统 一 刊 (CN), 发 表 文 章 的 刊 物 需 要 在 国 家 新 闻 出 版 广 电 总 局 ( 办 事 服 务 便 民 查 询 新 闻 出 版 机 构 查 询 ) 上 能 够 查 到 刊 凡 在 有 中 国 标 准 书 公 开



21 业 余 制 -- 高 起 专 (12 级 ) 75 元 / 学 分 网 络 学 院 学 生 沪 教 委 财 (2005)49 号 江 西 化 校 工 科 22 业 余 制 -- 高 起 专 (12 级 ) 70 元 / 学 分 网 络 学 院 学 生 沪 教 委 财 (2005)49 号 吉

三武一宗灭佛研究

采 取 行 动 的 机 会 90% 开 拓 成 功 的 道 路 2

上证指数

抗 日 战 争 研 究 年 第 期 % & ( # #

untitled

目 录 关 于 图 标... 3 登 陆 主 界 面... 3 工 单 管 理... 5 工 单 列 表... 5 搜 索 工 单... 5 工 单 详 情... 6 创 建 工 单... 9 设 备 管 理 巡 检 计 划 查 询 详 情 销 售 管

新, 各 地 各 部 门 ( 单 位 ) 各 文 化 事 业 单 位 要 高 度 重 视, 切 实 加 强 领 导, 精 心 组 织 实 施 要 根 据 事 业 单 位 岗 位 设 置 管 理 的 规 定 和 要 求, 在 深 入 调 查 研 究 广 泛 听 取 意 见 的 基 础 上, 研 究 提

第二讲 数列

·岗位设置管理流程

2016年德州市机构编制委员会


2016 年 荔 湾 区 财 政 核 定 支 出 汇 总 表 表 二 单 位 名 称 : 广 州 文 化 公 园 基 本 支 出 项 目 支 出 科 目 编 码 预 算 科 目 名 称 一 般 公 共 预 算 5, , , , ,

第2章 数据类型、常量与变量

年 第 期 % %! & % % % % % % &

学 年 第 二 学 期 集 中 考 试 安 排 (18 周 ) 考 试 日 期 :6 月 27 日 星 期 一 8:10-9:50 第 二 公 共 教 学 楼 A 区 A 高 等 数 学 ( 理 二 2) 复 材 材 料 科 学 与 工 程

思 想 政 治 理 论 经 核 查 无 误 思 想 政 治 理 论 经 核 查 无 误 思 想 政 治 理 论 经 核 查 无 误 思 想

i 1) 系 统 运 作 前 设 定 *1. [2.1 网 页 主 机 名 称 设 定 ] -- 设 定 校 务 系 统 的 主 机 IP 地 址, 以 供 其 他 个 人 电 脑 连 接 及 使 用 该 系 统 *2. [2.3.1 输 入 / 修 改 学 校 资 料 ] -- 输 入 系 统 使


正 规 培 训 达 规 定 标 准 学 时 数, 并 取 得 结 业 证 书 二 级 可 编 程 师 ( 具 备 以 下 条 件 之 一 者 ) (1) 连 续 从 事 本 职 业 工 作 13 年 以 上 (2) 取 得 本 职 业 三 级 职 业 资 格 证 书 后, 连 续 从 事 本 职 业

第二部分 阅读理解(Part II Reabing Comprehension)

Microsoft Word - 资料分析练习题09.doc


目 录 一 系 统 访 问... 1 二 门 户 首 页 申 报 用 户 审 核 用 户... 2 三 系 统 登 录 用 户 名 密 码 登 录 新 用 户 注 册 用 户 登 录 已 注 册 用

本 期 目 录 1. 一 图 看 懂 : 湖 南 大 学 两 学 一 做 学 习 教 育 实 施 方 案 习 近 平 : 要 整 顿 不 合 格 基 层 党 组 织 平 语 近 人 习 近 平 谈 党 章 党 规 习 近 平 为 何 要 求 在 两 学 一

上海证券交易所会议纪要

!!

浙 江 海 洋 学 院 417 普 通 生 态 学 与 鱼 类 学 全 套 考 研 资 料 <2016 年 最 新 考 研 资 料 > 2-2 基 础 生 态 学 笔 记, 此 笔 记 为 高 分 研 究 生 复 习 所 用, 借 助 此 笔 记 可 以 大 大 提 高 复 习 效 率, 把 握 报

定 位 和 描 述 : 程 序 设 计 / 办 公 软 件 高 级 应 用 级 考 核 内 容 包 括 计 算 机 语 言 与 基 础 程 序 设 计 能 力, 要 求 参 试 者 掌 握 一 门 计 算 机 语 言, 可 选 类 别 有 高 级 语 言 程 序 设 计 类 数 据 库 编 程 类

<4D F736F F D20BFC9B1E0B3CCD0F2BFD8D6C6CFB5CDB3C9E8BCC6CAA6B9FABCD2D6B0D2B5B1EAD7BC2E646F63>


境 外 上 市 外 资 股 股 东 持 有 股 份 总 数 (H 股 ) 489,157,907 3 出 席 会 议 的 股 东 所 持 有 表 决 权 股 份 数 占 公 司 有 表 决 权 股 份 总 数 的 其 中 :A 股 股 东 持 股 占 股 份 总 数 的

金 不 少 于 800 万 元, 净 资 产 不 少 于 960 万 元 ; (3) 近 五 年 独 立 承 担 过 单 项 合 同 额 不 少 于 1000 万 元 的 智 能 化 工 程 ( 设 计 或 施 工 或 设 计 施 工 一 体 ) 不 少 于 2 项 ; (4) 近 三 年 每 年

登录、注册功能的测试用例设计.doc

2.5 选 举 陈 晓 非 女 士 为 第 六 届 董 事 会 董 事 候 选 人 的 议 案 ; 2.6 选 举 卢 婕 女 士 为 第 六 届 董 事 会 董 事 候 选 人 的 议 案 ; 2.7 选 举 张 文 君 先 生 为 第 六 届 董 事 会 独 立 董 事 候 选 人 的 议 案

2016年市委组织部部门预算

2016年山东省民主党派办公大楼管理处

试 论 后 民 权 时 代 美 国 黑 人 的 阶 层 分 化 和 族 裔 特 征 学 者 年 代 黑 人 中 产 阶 层 定 义 弗 瑞 泽 毕 林 斯 勒 马 克 艾 德 威 尔 逊 科 林 斯 兰 德 里 奥 力 威 夏 佩 罗 帕 锑 罗 收 入 来 源 于 从 事 可 以 定 义 为 白

导 数 和 微 分 的 概 念 导 数 的 几 何 意 义 和 物 理 意 义 函 数 的 可 导 性 与 连 续 性 之 间 的 关 系 平 面 曲 线 的 切 线 和 法 线 导 数 和 微 分 的 四 则 运 算 基 本 初 等 函 数 的 导 数 复 合 函 数 反 函 数 隐 函 数 以

《遗情书》

目 录 第 一 部 分 概 况 一 主 要 职 能 二 部 门 预 算 单 位 构 成 第 二 部 分 15 年 部 门 预 算 表 一 15 年 收 支 预 算 总 表 二 15 年 收 入 预 算 表 三 15 年 支 出 预 算 表 ( 按 科 目 ) 四 15 年 支 出 预 算 表 ( 按

股票代码:000936

Transcription:

弯 曲 评 论 论 文 集 ( 下 ) (TekTalk Lecture Notes) [ 谨 于 此 文 集 献 给 以 邓 稼 先 (1924/6/25/--1986/7/29)/ 等 为 代 表 的, 为 国 家 和 民 族 利 益 鞠 躬 尽 瘁 的 科 技 知 识 分 子 ] 弯 曲 评 论 编 辑 部 2012 年 6 月 25 日

目 录 ( 下 ) 计 算 的 美 丽 -- 图 灵 奖 的 第 一 个 四 十 年 陈 怀 临 对 中 国 系 统 架 构 师 的 七 个 期 望 陈 怀 临 对 高 端 通 信 系 统 设 计 的 七 个 展 望 陈 怀 临 微 内 核 操 作 系 统 及 L4 概 述 杰 夫 微 内 核 与 Unix 实 时 扩 充 的 分 析 :Neutrino vs. RTCore 陈 怀 临 MIPS 体 系 结 构 和 Linux 内 核 陈 怀 临, 张 富 新 对 华 为 系 统 软 件 的 思 考 ( 上 ) 陈 怀 临 对 华 为 系 统 软 件 的 思 考 ( 下 ) 陈 怀 临 后 科 技 时 代 -- 对 处 理 器 的 思 考 王 奇 邓 稼 先 传 陈 怀 临

对 下 一 代 系 统 软 件 架 构 师 的 七 个 期 望 有 诗 云 : 人 之 老, 其 言 真 ; 人 之 去 ; 其 行 善 系 统 软 件 设 计 是 软 件 系 统 的 皇 冠 中 的 宝 石 绚 烂 美 丽 令 无 数 男 女 痴 迷 在 系 统 软 件, 特 别 是 通 信 系 统 软 件 的 设 计 上, 有 没 有 一 些 可 以 提 炼 的 方 法 论? 今 身 处 幽 州 ( 北 平 ), 心 在 大 宋 聊 聊 数 语 谈 谈 我 对 大 宋 年 轻 一 代 的 系 统 软 件 工 程 师 的 期 望 1 The Thinner vs. The Thicker 年 轻 人 都 以 为 有 些 事 情 需 要 粗, 有 些 事 情 需 要 厚 其 实, 合 适 就 好 系 统 软 件 一 定 要 越 细 越 好 ; 越 薄 越 好 我 在 华 为 做 speech 的 时 候, 也 提 到 过 : 能 把 系 统 软 件 做 薄, 才 是 一 代 高 手 最 可 怕 的 就 是 为 了 做 而 做 最 高 境 界 是 : 能 不 做 就 不 做 每 一 行 代 码, 都 会 成 为 历 史 (Legacy); 每 一 份 恋 情 都 会 成 为 过 去 工 程 的 事 情, 就 是 要 简 简 单 单 内 在 算 法 的 复 杂 不 代 表 外 在 的 臃 肿 一 个 女 人, 要 的 是 清 澈 美 丽 ; 而 非 妖 娆 迷 人 智 慧 者 应 该 做 的 是 cut; 而 非 单 纯 的 add 2 Re-Create vs Re-Search ReCreate 是 工 程 之 大 忌 任 何 一 个 问 题, 必 须 首 先 养 成 良 好 的 科 研 习 惯 : -- 是 否 陈 首 席 已 经 解 答 过 类 似 的 问 题 -- 是 否 友 商 ( 敌 商 ) 解 决 过 类 似 的 问 题 -- 是 否 Open Source 领 域 已 经 解 决 过 类 似 的 问 题 -- 是 否 Google 和 Baidu 已 经 解 答 过 类 似 的 问 题 如 果 有, 拿 来 主 义 基 础 上 的 改 良 主 义 就 是 最 好 的 重 复 发 明 已 经 发 明 了 的 算 法, 模 型 是 兵 家 之 大 忌 学 术 界 的 Research 的 意 思 是 : 伊 人 已 经 在 阑 珊 处 ; 要 的 是 反 复 寻 找, 找 到 你 的 爱 人 工 业 界 的 Recreate 是 : 瞎 折 腾 利 己 但 害 公 司 3 Qualitative vs Quantitative 大 宋 文 化 博 大 精 深, 但 似 乎 更 多 的 是 在 形 而 上, 在 君 臣 父 子, 为 相 为 官 上 做 文 章 自 然 科 学 在 中 国 的 错 失 是 我 们 大 宋 百 年 之 痛 之 根 本 之 一 定 性 和 定 量 分 析 的 有 机 结 合, 是 成 为 一 个 优 秀 的 系 统 软 件 架 构 师 的 基 本 素 养 只 有 定 性 分 析 的 胶 片, 是 研 发 之 大 忌 一 定 要 养 成 能 case study, 算 法 分 析 的 良 好 工 作 习 惯 要 的 是 数 据 说 话 ; 不 要 的 是 框 架 忽 悠 4 Feature Parity vs Disruptive Innovation 大 宋 某 公 司 特 别 喜 欢 玩 一 个 词 汇 : 技 术 断 裂 点 还 有 一 些 : 领 先 世 界 产 品 的 优 势 点

这 基 本 上 是 胡 扯 或 者 从 大 样 本 的 角 度, 是 胡 扯 是 文 革 作 风 是 党 八 股 作 为 一 个 工 程 设 计 人 员, 不 要 羞 于 Feature Parity 学 习 和 模 仿 美 军, 伪 军 的 东 西, 是 提 高 自 己 的 最 佳 方 法 不 要 上 来 就 是 什 么 断 裂 点 邓 公 稼 先 都 说 : 我 们 这 几 代 人 要 做 的 是 使 得 国 家 不 要 差 距 加 大 我 们 这 2,3 代 人 能 做 的 是 :Follow 领 先 基 本 上 不 存 在 现 实 这 其 中, 最 大 的 问 题 不 是 工 程, 而 是 教 育 的 落 后 教 育 的 落 后 使 得 我 们 不 存 在 成 为 一 个 高 科 技 大 国 的 基 础 yet 所 以, 不 要 有 强 迫 症, 没 事 玩 断 裂 点 跟 上 并 略 微 有 改 良 就 好 这 就 好 比, 明 明 不 是 AV 明 星, 非 要 玩 AV 明 星 的 动 作 受 罪 请 把 创 新 留 给 90 后 和 00 后 吧 5 Semi-Optimal Optimization vs Full-Optimal Optimization 工 程 上, 没 有 最 好 的 算 法 ; 只 有 最 好 的 折 衷 爱 情 上, 没 有 最 好 的 恋 人 ; 只 有 心 中 的 情 人 不 要 过 分 追 求 最 佳 算 法 要 能 把 握 算 法 带 来 的 时 间 和 空 间 上 代 价 的 折 衷 更 为 重 要 的 是, 在 工 程 上, 如 果 出 了 问 题, 调 试, 调 优 和 定 位 带 来 的 代 价 否 则, 能 解 决 问 题 的 算 法, 就 是 好 算 法 6 Application vs System 系 统 是 为 应 用 服 务 的 男 人 的 钱 是 为 你 爱 的 女 人 而 挣 的 做 系 统 不 能 玩 意 淫 不 能 为 做 系 统 而 做 系 统 一 切 要 为 人 民 服 务, 为 应 用 服 务 只 有 人 民 的 需 要, 才 是 系 统 软 件 的 需 要 爱 系 统 软 件 就 是 爱 人 民 是 等 价 的 这 是 愚 弄 人 民 不 能 本 末 倒 置 应 用 和 系 统 是 相 通 的 你 能 写 汇 编, 也 能 写 object-c 都 是 逻 辑 的 表 达 而 已 7 Proprietary vs Open Source 拿 来 主 义, 没 人 反 对 也 需 要 提 倡 但 如 何 贡 献 和 反 馈 给 社 区, 这 是 每 一 个 大 宋 系 统 软 件 工 程 师 应 该 反 思 的 知 识 共 享 不 仅 仅 是 一 个 方 法 论, 也 应 该 是 一 种 精 神 家 园 天 天 信 息 安 全, 什 么 都 藏 着, 躲 着, 非 一 代 天 骄 之 所 为 成 大 事 者, 必 有 大 胸 怀 公 司 也 好 ; 个 人 也 罢

对 下 一 代 高 端 通 信 系 统 设 计 的 七 个 展 望 高 端 通 信 系 统 设 计 从 来 就 是 一 个 困 难 的 话 题 一 个 优 秀 的 系 统 设 计 往 往 决 定 了 其 竞 争 力 和 相 应 的 生 命 周 期 本 文 试 图 阐 述 笔 者 对 下 一 代 高 端 通 信 系 统 设 计 的 一 些 展 望 抛 豆 腐 引 砖 块, 其 目 的 是 通 过 读 者 的 评 论, 使 得 美 军, 共 军, 国 军, 伪 军 等 的 知 识 和 经 验 可 以 共 享 使 得 Open Source 的 精 神 发 扬 光 大 1 LDF Rule(Legacy Decides Future) 系 统 都 是 演 变 的, 而 非 设 计 的 一 个 好 的 系 统 设 计 必 须 首 先 满 足 对 历 史 系 统, 历 史 代 码 的 演 进 路 标 否 则, 就 是 在 做 Science, 而 非 Engineering 这 方 面 最 大 的 挑 战 就 是 在 哪 个 release 去 掉 哪 些 历 史 遗 留 问 题 改 良 的 代 价 一 定 是 小 于 革 命 在 这 个 第 一 重 要 的 法 则 里, 要 求 的 是 系 统 设 计 师 必 须 了 解 细 节 需 要 能 进 能 出 [ 想 歪 了 的 同 学 请 自 己 惩 罚 一 下 自 己 邪 恶 的 心 灵 ] 要 的 是 能 bottom up 然 后 在 bottom up 的 基 础 上, 进 行 top down 的 设 计 缺 一 不 可 只 能 bottom inside, 是 一 个 单 纯 的 工 程 师 ; 只 能 top through 就 是 一 个 玩 胶 片 的 大 忽 悠 2 CDMD Convergence Rule (Control Plane,Data Plane,Management Plane and Debug Plane Convergence) 这 个 rule 类 似 与 我 大 宋 气 功 中 的 一 句 经 典 法 则 : 人 身 无 处 不 丹 田 啥 意 思 呢? 控 制 平 面, 数 据 平 面, 管 理 平 面, 调 试 平 面 都 将 是 一 个 逻 辑 的 概 念, 而 非 一 个 物 理 的 实 体, 例 如 控 制 平 面 卡, 数 据 平 面 卡 上 述 的 各 个 Plane 都 是 你 中 有 我, 我 中 有 你 [ 想 歪 了 的 同 学 请 自 己 惩 罚 一 下 自 己 邪 恶 的 心 灵 ] 在 任 何 一 个 环 节 都 需 要 有 相 应 的 逻 辑 部 分 整 体 系 统 的 任 何 一 个 平 面 是 通 过 分 布 在 系 统 各 个 环 节 中 的 子 平 面 来 共 同 构 成 的 这 方 面 最 大 的 挑 战 是 : 系 统 架 构 师 必 须 对 分 布 式 系 统 的 设 计 非 常 过 敏,sorry, 敏 感 在 分 布 式 系 统 设 计 中, 一 个 最 重 要 的 理 论 悖 论 是 : 在 分 布 式 系 统 中, 在 任 何 时 刻, 在 任 何 一 个 节 点 上, 是 无 法 知 道 当 时 的 全 局 状 态 的 这 是 啥 意 思 呢? 就 是, 除 了 上 帝, 你 在 一 个 时 刻 点 Ti, 是 不 可 能 知 道 Ti 时 刻 系 统 其 他 信 息 的 你 能 知 道 的 信 息 只 能 是 T(i+Delta) 这 个 Delta 就 是 通 信 开 销 所 带 来 的 大 白 话 就 是, 杨 小 姐 ( 杨 贵 妃 ), 从 理 论 上,Y 从 来 就 没 有 吃 过 新 鲜 的 荔 枝,no matter 驿 道 上 的 马 儿 跑 的 有 多 快 在 这 个 分 布 式 天 生 的 死 穴 问 题 上, 带 来 的 问 题 是 最 多 的 作 为 系 统 架 构 师, 必 须 对 时 序 逻 辑 (Temporal Logic) 有 所 掌 握 Otherwise, 系 统 设 计 一 定 是 漏 洞 十 出 另 外, 分 布 式 系 统 的 nature 决 定 了 任 何 全 局 算 法 的 优 化 一 定 不 是 最 优 的, 而 是 次 优 的 在 CDMD Convergence 的 设 计 基 础 上, 一 个 很 大 的 演 变 就 是 :C,D,M,D 的 计 算 资

源 的 自 适 应 (Adaptive) 的 调 配 而 非 静 态 的 划 分 要 充 分 利 用 计 算 池 的 模 型,Processing on Demand 3 CTP(Close To Port, Close To Packet, Close To Payload) Rule 计 算 或 者 存 储 能 力 一 定 要 离 端 口 (Port) 近, 离 数 据 (Packet Descriptor 和 Payload) 近 越 远, 越 歇 火 当 官 是 要 离 党 中 央 近 做 系 统 是 要 离 Traffic 近 这 里 的 一 个 设 计 Case study 是 : 要 充 分 利 用 系 统 中 线 卡, 处 理 卡,I/O 卡 上 的 计 算 能 力 这 些 计 算 能 力 是 离 端 口 最 近 的, 对 Traffic 而 言, 是 Local Bus 的 距 离, 而 非 Interconnect 的 长 途 跋 涉 计 算 是 分 布 的 分 布 计 算 的 集 合 就 是 系 统 的 总 体 计 算 和 ( 或 ) 处 理 能 力 4 CCNUMA Adoption Rule CCNUMA 一 定 会 被 广 泛 的 用 在 将 来 的 高 端 通 信 系 统 中 只 有 CCNUMA 的 应 用, 才 能 达 到 分 布 式 技 术 的 同 时, 又 能 支 持 历 史 系 统,CDMD 的 融 合 和 Close to Port 的 法 则 在 CCNUMA 系 统 设 计 中, 必 须 对 Memory 的 分 布 非 常 敏 感 跨 Interconnect, 例 如 QPI, 的 过 分 存 取, 一 定 是 带 来 硬 伤 系 统 架 构 师 必 须 对 Cache,L1,L2, 和 L3 和 ccnuma-interconnect, 例 如 QPI 等 一 些 知 识 有 足 够 的 积 累 和 实 战 能 力 否 则, 很 难 把 握 CCNUMA 系 统 5 Hybrid Model Rule ASIC,FPGA 等 等 不 会 消 亡 消 亡 的 是 你 革 命 的 心 任 何 设 计 都 是 一 个 性 价 比 的 折 衷 天 下 没 有 最 美 丽 的 女 子 ; 只 有 最 适 合 你 的 女 人 在 这 个 设 计 法 则 方 面, 要 格 外 注 意 ASIC 或 者 FPGA 上 的 控 制 CPU 的 计 算 能 力 的 浪 费 在 CCNUMA 的 基 础 上, 所 有 的 CPU 的 整 合 就 是 一 个 CPU 所 不 同 的 是 处 理 的 数 据 可 以 不 同 而 已 6 MapReduce Rule 经 典 的 并 行 计 算 的 MIMD 模 型 应 该 被 广 泛 的 应 用 多 个 计 算 流 形 成 一 个 计 算 池 ; 多 个 数 据 流 形 成 一 个 数 据 池 MapReduce 不 应 该 只 是 Loosely Coupled Distributed Computing 的 宠 儿, 例 如 Google,Facebook MapReduce 的 思 想 精 髓 应 该, 而 且 也 会 被 广 泛 的 应 用 在 高 端 通 信 系 统 (Tightly Coupled Distributed Computing) 的 设 计 上 7 x86+ zero-overhead Linux x86+linux 的 在 通 信 系 统 中 一 定 会 得 到 广 泛 的 应 用 从 而 使 得 通 信 系 统 能 够 迅 速 的 实 现, 更 为 重 要 的 是, 支 持 大 量 的 3rd party 的 应 用 任 何 不 adopt Linux/Unix 的 力 量 都 是 错 误 的 历 史 的 将 来 会 证 明 这 一 点 应 用 决 定 一 切 Linux 的 强 大 中 的 强 大 就 是 无 数 的 应 用

微 内 核 操 作 系 统 及 L4 概 述 杰 夫 jliu71@gmail.com 摘 要 : 本 文 是 对 微 内 核 操 作 系 统 及 L4 的 发 展 历 程 和 主 要 功 能 的 综 述 本 文 还 对 微 内 核 操 作 系 统 的 优 缺 点 及 发 展 前 景 发 表 评 论 关 键 词 : 微 内 核, 操 作 系 统,L4 Abstract: This paper describes the history of microkernel-based operating systems, and the structure and main functions of L4. It also discusses the pros and cons of microkernel systems and their prospect of actual deployments in the industry. Keywords: microkernel, operating system, L4 1. Introduction 微 内 核 (microkernel) 并 非 是 一 个 新 的 概 念, 这 个 名 词 至 少 在 七 十 年 代 初 就 有 了 一 般 认 为, 他 的 发 明 权 属 于 Hansen [Han70] 和 Wulf [Wul74]. 但 是 在 这 一 名 词 出 现 之 前 已 经 有 人 使 用 类 似 的 想 法 设 计 计 算 机 操 作 系 统 了 早 期 的 操 作 系 统 绝 大 多 数 是 Monolithic Kernel, 意 思 是 整 个 操 作 系 统 - 包 括 Scheduling ( 调 度 ), File system ( 文 件 系 统 ), Networking ( 网 络 ), Device driver ( 设 备 驱 动 程 序 ), Memory management ( 存 储 管 理 ), Paging( 存 储 页 面 管 理 ) 都 在 内 核 中 完 成 一 直 到 现 在 广 泛 应 用 的 操 作 系 统, 如 UNIX, Linux, 和 Windows 还 大 都 是 monolithic kernel 操 作 系 统 但 随 着 操 作 系 统 变 得 越 来 越 复 杂 ( 现 代 操 作 系 统 的 内 核 有 一 两 百 万 行 C 程 序 是 很 常 见 的 事 情 ), 把 所 有 这 些 功 能 都 放 在 内 核 中 使 设 计 难 度 迅 速 增 加 微 内 核 是 一 个 与 Monolithic Kernel 相 反 的 设 计 理 念 它 的 目 的 是 使 内 核 缩 到 最 小, 把 所 有 可 能 的 功 能 模 块 移 出 内 核 理 想 情 况 下, 内 核 中 仅 留 下 Address Space Support( 地 址 空 间 支 持 ),IPC (Inter-Process Communication, 进 程 间 通 讯 ), 和 Scheduling( 调 度 ), 其 他 功 能 模 块 做 为 用 户 进 程 运 行 对 于 内 核 来 说, 他 们 和 一 般 用 户 进 程 并 无 区 别 它 们 与 其 他 用 户 进 程 之 间 的 通 讯 通 过 IPC 进 行 在 八 十 年 代 中 期, 微 内 核 的 概 念 开 始 变 得 非 常 热 门 第 一 代 微 内 核 操 作 系 统 的 代 表 作 品 是 Mach [Mac85] Mach 是 由 位 于 痞 子 堡 的 卡 内 基 梅 隆 大 学 (CMU) 设 计 CMU 是 美 国 计 算 机 科 学 研 究 重 镇, 其 计 算 机 排 名 长 期 位 于 美 国 大 学 前 五 位 美 国 只 有 少 数 几 所 大 学 的 计 算 机 是 学 院 不 是 系,CMU 就 是 其 中 之 一 除 Mach 外, CMU 的 另 一 重 要 成 果 是 衡 量 计 算 机 软 件 设 计 能 力 的 CMM (Capability Maturity Model) 模 型, 广 泛 用 于 评 估 业 界 软 件 公 司 的 计 算 机 软 件 开 发 能 力 好 像 印 度 的 软 件 公 司 们 非 常 热 衷 于 此, 通 过 CMM-5 最 高 规 格 评 价 的 软 件 公 司 们 有 一 半 是 印 度 的 在 微 内 核 刚 兴 起 时, 学 术 界 普 遍 认 为 其 优 点 是 显 而 易 见 的 :

支 持 更 加 模 块 化 的 设 计 ; 小 的 内 核 更 易 于 更 新 与 维 护,bug 会 更 少 大 家 知 道 Windows 的 死 机 很 多 是 因 为 device drivers 造 成 的 如 果 把 他 们 移 出 内 核, 他 们 中 的 bugs 很 可 能 就 不 会 造 成 死 机 ; 许 多 模 块 的 bugs 可 被 封 闭 在 其 模 块 内, 更 加 易 于 debug 软 件 工 程 师 都 知 道 kernel debug 是 件 非 常 头 疼 的 事 情 如 果 file system, memory management, 和 device drivers 成 为 一 个 个 独 立 的 进 程, 不 用 说 这 肯 定 会 使 kernel engineers 的 日 子 好 过 许 多 由 于 上 述 原 因, 很 多 学 术 研 究 人 员 和 软 件 厂 家 开 始 尝 试 使 用 微 内 核 的 概 念 设 计 操 作 系 统 甚 至 Microsoft 也 有 所 动 作, 在 设 计 Windows NT 时, 他 们 把 UI (User Interface) 从 Windows kernel 中 整 个 拿 了 出 来 由 此 可 看 出 microkernel 的 流 行 程 度, 因 为 Microsoft 总 是 最 后 一 个 尝 试 新 想 法 的 但 是 这 一 热 潮 很 快 就 冷 了 下 来, 原 因 只 有 一 个 字 :Performance(Well, 汉 语 是 两 个 字 : 性 能 ) Microsoft 在 Windows NT 后 续 版 本 中, 又 把 部 分 底 层 UI 放 回 了 Windows kernel 这 种 现 象 在 计 算 机 界 并 不 少 见 在 Java 刚 开 始 流 行 时, 由 于 其 许 多 C/C++ 没 有 的 优 点, 很 多 人 认 为 它 会 很 快 取 代 C/C++ 成 为 第 一 编 程 语 言 但 直 至 今 天 也 没 有 发 生, 其 中 一 个 重 要 原 因 就 是 Java 程 序 的 performance 落 后 于 C 程 序, 至 今 还 限 制 着 它 在 许 多 场 合 的 应 用 第 一 代 的 微 内 核 操 作 系 统 的 性 能, 包 括 Mach 在 内, 远 不 及 monolithic kernel 操 作 系 统 所 以 大 多 数 人 又 回 到 传 统 技 术 中 去 了 Microkernel 也 像 过 时 的 流 行 歌 曲 或 减 肥 方 法, 很 快 被 遗 忘 了 但 在 九 十 年 代 后 期, 微 内 核 迎 来 了 其 生 命 中 的 第 二 春 一 些 研 究 人 员 认 真 分 析 了 微 内 核 系 统 性 能 差 的 原 因, 指 出 其 性 能 差 并 非 根 本 内 在 的 因 素 造 成, 而 是 设 计 实 现 的 失 误 为 证 明 其 论 点, 他 们 设 计 并 实 现 了 几 个 性 能 远 超 第 一 代 的 微 内 核 操 作 系 统, 我 们 把 它 们 称 为 第 二 代 微 内 核 系 统 [Bar03, Eng95, Lie93A] 其 中 的 一 个 代 表 作 品 就 是 L4 [Lie93A, Lie93B, Lie95, Lie96] L4 由 德 国 的 GMD 设 计 GMD 是 德 国 国 家 信 息 技 术 研 究 院, 相 当 于 中 科 院 计 算 所 加 上 软 件 所 ( 但 在 计 算 机 研 究 能 力 方 面,GMD 远 非 中 科 院 可 比 与 作 者 一 起 工 作 过 的 几 位 GMD 研 究 人 员 都 是 extremely smart) L4 的 创 始 人 和 总 设 计 师 是 Jochen Liedtke [Kar05] 此 公 在 GMD 之 后, 还 供 职 于 IBM 的 T.J. Watson Research Center, 后 成 为 德 国 Univ. of Karlsruhe 操 作 系 统 方 向 的 正 教 授 (full professor) 了 解 德 国 大 学 系 统 的 人 都 知 道, 当 德 国 的 正 教 授 可 比 当 美 国 的 正 教 授 要 难 许 多 倍, 地 位 也 要 高 许 多, 因 为 一 个 系 往 往 只 有 一 两 个 正 教 授 Prof. Liedtke 已 于 2001 年 过 世, 但 他 创 建 的 L4 正 在 发 展 壮 大 中 近 年 来, 多 个 运 行 于 不 同 硬 件 平 台 的 L4 系 统 已 被 几 个 不 同 研 究 机 构 设 计 出 来 [SAG03, Tew01] 本 文 以 后 的 部 分 将 分 析 微 内 核 系 统 的 performance bottleneck 所 在, 以 及 L4 如 何 试 图 克 服 这 一 困 难 微 内 核 系 统 到 底 有 没 有 固 有 的 障 碍, 先 天 的 缺 陷? 以 L4 为 代 表 的 新 一 代 微 内 核 系 统 的 前 景 如 何? 请 看 下 文

2. 微 内 核 系 统 的 性 能 为 什 么 会 这 麽 差? 基 于 消 息 传 递 (Message Passing)IPC 机 制 是 微 内 核 系 统 的 基 本 特 点 之 一 这 一 设 计 理 念 有 助 于 提 高 系 统 的 灵 活 性, 模 块 化, 安 全 性, 以 及 可 扩 展 性 IPC 的 性 能 表 现 是 决 定 微 内 核 系 统 性 能 的 关 键 因 素, 因 为 绝 大 多 数 系 统 调 用 和 很 多 应 用 程 序 的 服 务 都 需 要 两 个 IPC, 一 个 服 务 请 求, 一 个 结 果 返 回 消 息 传 递 IPC 机 制 现 在 已 经 大 量 用 于 多 种 计 算 机 系 统 中, 但 是 很 多 IPC 实 现 的 性 能 并 不 太 好 根 据 CPU 性 能 和 消 息 长 短 不 同, 一 个 IPC 大 概 需 要 50 到 500 µs 经 过 许 多 研 究 人 员 多 年 的 努 力, 也 没 有 实 现 IPC 性 能 的 突 破, 所 以 直 至 最 近, 消 息 传 递 IPC 被 公 认 为 使 一 个 很 好 的 设 计 理 念, 但 对 其 适 用 范 围 学 术 界 还 存 在 很 大 争 议 Linux Kernel 创 始 人 Linus Torvalds 在 2000 年 的 一 段 话 说 得 生 动 (Sorry, 是 极 端 ), 也 代 表 了 当 时 很 多 人 的 观 点 为 了 在 有 些 读 者 受 到 冒 犯 时 摆 脱 干 系, 作 者 决 定 不 翻 译 以 下 这 段 话 如 果 您 看 不 懂,good for you. Message passing as the fundamental operation of the operating system is just an exercise in computer science masturbation. It may feel good, but you don't actually get anything DONE. Nobody has ever shown that it made sense in the real world. 由 于 IPC 对 微 内 核 系 统 的 重 要 性, 其 设 计 人 员 们 也 花 费 了 大 量 时 间 在 改 善 它 的 性 能 上 面 微 内 核 系 统 中 IPC 性 能 不 断 提 高, 但 到 90 年 代 初 似 乎 达 到 了 顶 峰 Mach 3 的 IPC 最 好 性 能 大 约 是 115 µs ( 在 486-DX 50 机 器 上 ), 其 它 微 内 核 系 统 也 大 致 如 此 当 时 许 多 研 究 人 员 认 为, 有 100 µs 左 右 的 时 间 是 IPC 的 固 有 消 耗, 这 一 时 间 已 无 法 缩 短 但 是 与 之 相 比, 在 同 样 硬 件 平 台 上, 一 个 UNIX 系 统 调 用 只 需 要 20 µs, 好 过 微 内 核 系 统 10 倍 第 一 代 微 内 核 系 统 一 直 未 在 IPC 性 能 上 有 重 大 突 破, 这 是 导 致 他 们 失 败 的 根 本 原 因 对 第 一 代 微 内 核 系 统 的 性 能 分 析 表 明, 他 的 耗 时 巨 大 的 操 作 包 括 用 户 - 内 核 模 式 转 换, 地 址 空 间 转 换, 和 内 存 访 问 表 面 上 看 起 来 这 一 结 果 似 乎 合 理, 但 进 一 步 分 析 发 现 它 们 并 非 真 正 问 题 所 在 [Lie96] 中 给 出 Figure 1, 显 示 这 些 操 作 的 硬 件 固 Figure 1. IPC 耗 时 分 析

有 的 时 间 消 耗 只 占 IPC 总 耗 时 的 3% - 7% ( 图 中 深 色 为 硬 件 固 有 时 间 消 耗 ) 这 些 证 据 表 明 早 期 微 内 核 的 性 能 差 距 其 实 来 自 于 它 们 的 基 本 构 造 早 期 的 微 内 核 系 统 大 多 是 由 Monolithic Kernel 一 步 步 逐 渐 改 进 而 来 其 很 多 设 计 并 未 发 生 重 大 改 变 他 们 虽 然 被 称 为 微 内 核, 但 其 代 码 量 还 是 Figure 2. 两 次 拷 贝 的 信 息 传 递 过 程 很 大 例 如,Mach 3 内 核 支 持 140 个 系 统 调 用, 代 码 量 为 300K 字 节 这 种 情 况 不 改 变, 微 内 核 系 统 的 性 能 恐 难 提 高 第 二 代 微 内 核 系 统 设 计 者 认 识 到 这 一 问 题, 他 们 对 系 统 内 核 的 基 本 构 造 做 出 重 大 精 简, 从 而 使 其 性 能 大 步 提 高 L4 只 支 持 7 个 系 统 调 用, 代 码 量 只 有 12K 字 节 本 文 下 一 部 分 将 简 单 介 绍 L4 的 一 些 基 本 设 计, 有 兴 趣 的 读 者 可 在 [Lie95] 中 找 到 对 L4 的 详 细 介 绍 3. L4 基 本 结 构 L4 是 由 GMD 于 1995 年 设 计, 它 的 两 个 基 本 设 计 原 则 是 :1) 高 性 能 和 灵 活 性 的 要 求 决 定 微 内 核 必 须 尽 可 能 缩 到 最 小,2) 微 内 核 实 现 本 身 取 决 于 硬 件 结 构, 它 是 不 可 移 植 的 虽 然 微 内 核 可 以 改 善 整 个 系 统 的 移 植 性, 但 它 本 身 是 不 可 移 植 的, 因 为 要 达 到 高 性 能, 它 的 实 现 必 须 紧 密 联 系 于 硬 件 结 构 L4 内 核 支 持 三 种 抽 象 概 念 : 地 址 空 间, 线 程, 和 IPC 他 只 提 供 7 个 系 统 调 用, 只 有 12K 字 节 代 码 在 486-DX50 机 器 上, 一 个 地 址 空 间 切 换 IPC, 8 字 节 参 数 传 递, 只 需 要 5 µs 如 果 参 数 量 为 512 字 节, 只 需 要 18 µs Mach 3 相 应 的 时 间 消 耗 为 115 µs (8 字 节 ) 和 172 µs (512 字 节 ) 下 面 我 们 来 看 L4 时 如 何 实 现 高 性 能 IPC 的 进 程 间 通 信 的 一 个 基 本 问 题 是 数 据 需 要 跨 越 不 同 的 地 址 空 间 大 多 数 操 作 系 统 的 解 决 办 法 是 用 两 次 数 据 拷 贝 : 用 户 地 址 空 间 A -> 内 核 地 址 空 间 -> 用 户 地 址 空 间 B 用 户 数 据 被 拷 贝 两 次, 因 为 大 多 数 操 作 系 统 的 地 址 空 间 分 配 模 型 是 用 户 可 防 问 的 地 址 空 间 加 上 内 核 地 址 空 间, 内 核 空 间 为 所 有 用 户 共 享 因 为 用 户 的 地 址 空 间 各 个 不 同 用 户 是 不 同 的, 所 以 数 据 拷 贝 必 须 通 告 内 核 空 间 进 行, 如 Figure 2 所 示 这 两 次 数 据 拷 贝 可 能 耗 时 很 大, 如 果 引 起 TLB 和 Cache miss 耗 时 会 更 大 如 果 数 据 可 以 由 用 户 空 间 A 直 接 转 移 到 用 户 空 间 B, 这 将 大 大 提 高 IPC 性 能 但 两 个 用 户 直 接 共 享 逻 辑 地 址 空 间 会 带 来 一 系 列 的 安 全 问 题 L4 的 解 决 办 法 是 通 过 暂 时 地 址 映 射 : 内 核 把 数 据 的 目 的 地 址 暂 时 映 射 到 一 个 通 讯 窗 口 (Communication Window), 这 一 窗 口 存 在 于 内 核 地 址 空 间 然 后 内 核 把 数 据 从 用 户 A 地 址 空 间 拷 贝 到 通 讯 窗 口 供 用 户 B 使 用 如 Figure 3 所 示, 这 一 窗 口 属 于 内 核 所 有, 但 用 户 B, 只 有 用 户 B, 可 以 访 问

除 以 上 讨 论 的 方 法 之 外,L4 还 采 用 了 许 多 新 颖 的 技 术 来 提 高 内 核 性 能, 例 如, 直 接 地 址 转 换, 懒 惰 调 度 (Lazy Scheduling), 使 用 寄 存 器 传 送 短 消 息, 减 少 缓 存 及 TLB Miss 等 等 本 文 不 再 详 述, 请 参 见 [Lie95] Figure 3. L4 的 信 息 传 递 过 程 4. Conclusion 微 内 核 操 作 系 统 已 有 二 三 十 年 的 发 展 历 史, 但 早 期 系 统 的 性 能 不 够 理 想 所 以 尽 管 微 内 核 的 概 念 有 许 多 可 取 之 处, 但 它 并 未 广 泛 应 用 于 工 业 界 近 年 来, 新 一 代 的 微 内 核 系 统, 如 L4,Exokernel, 在 性 能 上 取 得 了 巨 大 突 破, 所 以 学 术 界, 工 业 界 对 微 内 核 的 兴 趣 又 出 现 了 复 苏 对 微 内 核 被 广 泛 应 用, 取 代 传 统 Monolithic Kernel 操 作 系 统, 的 前 景 作 出 预 测 还 为 时 尚 早 但 是, 至 少 在 一 些 应 用 场 合, 例 如, 嵌 入 式 系 统, 实 时 系 统, 作 者 对 微 内 核 系 统 的 前 景 持 乐 观 态 度 References [Bar03] Xen and the Art of Virtualization, Barham, Paul, etc, ACM Symposium on Operating Systems, Oct, 2003, Bolton Landing, New York. [Eng95] Exokernel, an operating system architecture of application-level resource management, Engler, Dl, Kaashock, M.F., and O Toole, J., 15 th ACM Symposium on Operating Systems, Dec. 1995, Coper Mountain, Colorado. [Han70] The mucleus of a multiprogramming system, Hansen, Brinch, Communication of ACM 13, April, 1970, 238-241. [Kar05] http://i30www.ira.uka.de/aboutus/people/personal/liedtke?lid=en&publ=y, Prof. Liedtke memorial page, Univ. of Karlsruhe, 2005. [Lie93A] A persistent System in Real Use Experiences of the First 13 years, Liedtke, Jochen, German National Research Center for Computer Science, 1993. [Lie94B] Improving IPC by Kernel Design, Liedtke, Jochen, 14 th ACM Symposium on Operating Systems, Dec. 1993, Asheville, North Carolina. [Lie95] On u-kernel Construction, Liedtke, Jochen, 15 th ACM Symposium on Operating Systems, Dec. 1995, Coper Mountain, Colorado. [Lie96] Toward Real Microkernels, Liedtke, Jochen, Communications of the ACM, Sep., 1996. [Mac85] http://www.cs.cmu.edu/afs/cs/project/mach/public/www/mach.html, the mach project, CMU, 1985-1994. [SAG03] The L4Ka:: Pistachio Microkernel, System Architecture Group, University of Karlsruhe, white paper, May, 2003.

[Tew01] VFiasco - Towards a Provably Correct Microkernel, Hendrik Tews, Hermann Härtig, Michael Hohmuth, TU Dresden Technical Report TUD-FI01-1,Jan. 2001. [Wul74] Hydram: The kernel of a multiprocessing operating system, Wulf, W., Cohen, E., Corwin, W., Jones, A., Levin, R., Pierson, C. and Pollack, F., 1974, Communication of ACM 17, July, 1974, 337-345.

微 内 核 与 Unix 实 时 扩 充 的 分 析 :Neutrino vs. RTCore QNX/Neutrino vs. FSMLab/RTCore Comparison Microkernel vs. Real-time Extension Huailin Chen, November, 2004 中 文 前 言 : 这 是 笔 者 2004 年 10,11 月 左 右 写 的 一 个 关 于 Neutrino 微 内 核 与 RTCore 等 技 术 的 比 较 现 在 整 理 并 发 表 于 此 由 于 时 间 的 关 系, 不 能 将 其 翻 译 成 中 文 了 请 读 者 见 谅 文 章 主 要 从 体 系 结 构, 系 统 性 能, 编 程 模 型, 内 存 管 理 与 保 护 和 可 移 植 性 等 方 面 来 阐 述 四 年 过 去 了,QNX,FSMLAB 也 经 历 了 许 多 变 化 都 被 别 的 公 司 收 购 了 总 体 而 言, 我 个 人 比 较 喜 欢 微 内 核 技 术 当 然 微 内 核 有 其 自 己 的 局 限 性 这 需 要 在 实 际 的 工 作 中, 按 照 系 统 的 要 求, 去 对 微 内 核 进 行 修 改, 裁 剪 和 调 试 任 何 一 个 操 作 系 统 都 是 为 应 用 服 务 的 所 以 设 计 系 统 的 关 键 还 是 应 用 决 定 下 面 的 需 求 0. Architecture Neutrino ( www.qnx.com ) is a micro-kernel. It can exist alone without any dependent packages. For being a micro-kernel, like CMU s Mach, Andrew T. s Amoeba as well as Minix and L4, these following components must be provided: Process/Thread Management; Memory Management; Exception Handling; Message-Passing Interface. RTCore (www.fsmlabs.com ) is designed to provide better real-time services for traditional time-sharing based monolithic operating system, alleviating the pains of kernel non-preemption and non-deterministic interrupt latency. RTAI/Adeos ( www.rtai.org ) provides similar technology as RTLinux does. RTAI supports x86, PPC, ARM and MIPS RTAI is FREE and Open Source With latest Linux 2.6 addition, the kernel preemption patchis officially on. Linux can support better performance towards hard real-time requirements. However, Linux is yet able to be claimed as a real real-time operating system. With RTCore or RTAI, it does provide less interrupt latency, for instance, 5us per RTCore technology claims. RTCore is a real-time extension/patch for Linux initially and is ported to BSD community recent years. It is not a micro-kernel from both conceptual and technical viewpoint. RTCore is a loadable kernel module(lkm) for Linux kernel. It s a part of Linux kernel codes/package after being installed. RTCore itself is not able to exist if without the Secondary OS. RTCore itself does NOT provide enough, if not at all, memory management, a message-passing interface. It relies on the BSD/Linux kernel to provide

so. In other words, from system architecture viewpoint, RTCore/RTAI technology is tightly coupled with BSD/Linux kernel. 1. Performance Neutrino claims the support of real-time computing with micro-kernel preemption, flexible share memory mechanism and high performance message passing. From benchmark data released from QNX Inc, neutrino s context switch and interrupt latency all range within micro-seconds. Note that, usually we believe message-passing model is very time-cost when compared to system call interface with a tradtional monolithic OS model, for example, Linux/BSD Neutrino provides system scope real-time scheduling based on process/ thread priorities. A system could provide fine-granularity real-time services to a wide range of real-time computing applications RTCore, adding codes into Linux/BSD kernel scheduler as well as interrupt handler parts, can provide very good real-time response to both interrupt handing and real-time task processing applications. RTCore does not provide real-time services to the Liux/BSD normal applications. Iff (If and ONLY if) there exists real-time RTCore threads, RTCore scheduler will never transfers the CPU to Linux/BSD user level processes/threads. This coarse granularity real-time computing model does introduce starvations into a realtime system. For example, a real-time application(bgp Daemon) may have to reside in Linux/BSD user level side. 2. Programming Model Neutrino supports full POSIX 1, POSIX 1.B, POSIX 1.C and a native message-passing mechanism/interface. It provides a very good and consistent programming model. Neutrino does not seamlessly support gcc tool-chain programming environment, but qcc, which is built on top of gcc. Applications on top of Neutrino are exactly same as what we did when under a UNIX machine. Unix developers should be very easy to migrate into QNX/Neutrino world. However, writing device drivers for Neutrino is an exception. The Resource Manager Concepts and mechanisms are new to lots of people from Linux/BSD side.) RTCore support POSIX PE51, only providing a very basic set of real-time primitives, compared to Neutrino. Please note that RTCore programming API is not POSIX API compatible; its API is more POSIX-like. RTCore threads MUST not able to call a BSD/Linux part block mode primitives or system calls (when RTCore threads run in user mode.). Therefore, any POSIX library Linux/BSD provides are not able to be used directly by RTCore real-time applications. RTCore, as a LKM module within Linux/BSD, supports gcc tool-chain seamlessly. Applications of RTCore either need developers able to have Linux/BSD kernel-programming (when write in-kernel RTCore threads) skills. Also,

developers should be very clearly aware of the limitations of PSDD-based RTCore threads, for example, no block based Unix system calls. 3. Memory Management/Protection Neutrino provides process-based memory management protection. RTCore, if without PSDD support, does not provide any memory management/protection. Please note that RTCore, from its nature, actually is not designed to provide any memory protection. The reason is that RTCore is not an RTOS or a Micro-Kernel. It is a patch for BSD and Linux scheduler and interrupts handler to achieve better scheduling performance. RTCore itself is not able to sustain to support any applications/threads, but must rely on BSD/Linux memory management/protection. RTCore, with PSDD support, is able to support having an RTCore threads running in user level privileged mode and moreover under a BSD/Linux process context. This does provide good memory protection for RTCore threads, even though not naturally. RTCore, with PSDD support, does provide memory protection while still without any memory management. The reason is: RTCore threads could not be viewed by BSD/Linux side schedulert. Or we say, RTCore threads should not call any block mode Unix system call interfaces including memory management part, for instance, malloc/brk. Any page fault will bring RTCore threads halt. This strict requirement makes RTCore PSDD threads programming sort of tricky. For instance, Any PSDD RTCore threads/applications will HAVE TO pre-allocate all physical memory in advance, not able to take advantage of the Linux/BSD Paging based memory management. This behavior of RTCore, under some cases, may introduce system resources/memory allocation unfair or system starving. 4. Portability and Legacy Support Neutrino POSIX based codes have good portability. QNX, the operating system built on top of Neutrino is lack of third party application/codes support, compared to Linux/BSD even though QNX claims that most of BSD and Linux codes are able to be ported on top of it very easily. One of the big reasons is: QNX is not open source based. This is a hurt to the adoption of Neutrino micro-kernel compared to the L4 and Mach micro-kernels. RTCore based applications provide normal portability. RTCore applications have some good advantages over QNX/Neutrino even though QNX claims that its full POSIX based. BSD and Linux communities have huge of third party applications, while QNX side is lack of open source community support. 5. Summary This section is left blank intentionally

MIPS CPU 体 系 结 构 概 述,Linux/MIPS 内 核 ( 上 ) 陈 怀 临, 张 福 新 弯 曲 评 论 中 国 科 学 院 计 算 所 前 言 www.tektalk.cn www.ict.ac.cn 2002 年, 科 学 院 计 算 所 推 出 基 于 MIPS 指 令 集 的 龙 芯 CPU 为 了 推 广 MIPS 技 术 在 中 国 的 普 及, 笔 者 与 计 算 所 龙 芯 研 发 组 的 张 福 新 博 士 撰 写 了 一 系 列 的 关 于 MIPS 的 技 术 文 章, 并 被 笔 者 整 理 发 表 于 笔 者 的 非 营 利 性 网 站 www.xtrj.org 上 六 年 过 去, 时 光 匆 匆 笔 者 这 次 将 其 修 订 并 发 表 于 弯 曲 评 论 以 饷 读 者 希 望 对 读 者 有 所 帮 助 第 一 部 分 MIPS CPU 体 系 结 构 概 述 1. MIPS 概 述 本 文 介 绍 MIPS 体 系 结 构, 着 重 于 其 寄 存 器 约 定,MMU 及 存 储 管 理, 异 常 和 中 断 处 理 等 等 通 过 本 文, 希 望 能 提 供 一 个 基 本 的 轮 廓 概 念 给 对 MIPS CPU 及 之 上 操 作 系 统 有 兴 趣 的 读 者, 并 能 开 始 阅 读 更 详 细 的 归 约 (SPECIFICATION) 资 料 MIPS 是 最 早 的, 最 成 功 的 RISC(Reduced Instruction Set Computer) 处 理 器 之 一, 起 源 于 斯 坦 福 的 电 机 系. 其 创 始 人 John L. Hennessy 在 1984 年 在 硅 谷 创 立 了 MIPS INC. 公

司 (www.mips.com) John L. Hennessy 目 前 是 Stanford Univ. 的 校 长 在 此 之 前, 他 是 Stanford 电 子 工 程 学 院 的 院 长 计 算 机 专 业 的 学 生 都 知 道 两 本 著 名 的 书 : Computer Organization and Design : The Hardware/Software Interface 和 Computer Architecture : A Quantitative Approach 其 作 者 之 一 就 是 Hennessy MIPS 的 名 字 为 Microcomputer without interlocked pipeline stages 的 缩 写 另 外 一 个 通 常 的 非 正 式 的 说 法 是 Millions of instructions per second 2. 指 令 集 详 细 的 资 料 请 参 阅 MIPS 归 约 一 般 而 言,MIPS 指 令 系 统 有 :MIPS I;MIPS II;MIPS III 和 MIPS IV 可 想 而 知, 指 令 系 统 是 向 后 兼 容 的 例 如, 基 于 MIPS II 的 代 码 可 以 在 MIP III 和 MIPS IV 的 处 理 器 上 运 行 下 面 是 当 我 们 用 gcc 编 译 器 时, 如 何 指 定 指 令 和 CPU 的 选 项 -mcpu=cpu type Assume the defaults for the machine type cpu type when scheduling instructions. The choices for cpu type are `r2000', `r3000', `r4000', `r4400', `r4600', and `r6000'. While picking a specific cpu type will schedule things appropriately for that particular chip, the compiler will not generate any code that does not meet level 1 of the MIPS ISA (instruction set architecture) without the `-mips2' or `-mips3' switches being used. -mips1 Issue instructions from level 1 of the MIPS ISA. This is the default. `r3000' is the default cpu type at this ISA level. -mips2 Issue instructions from level 2 of the MIPS ISA (branch likely, square root instructions). `r6000' is the default cpu type at this ISA level. -mips3 Issue instructions from level 3 of the MIPS ISA (64 bit instructions). `r4000' is the default cpu type at this ISA level. This option does not change the sizes of any of the C data types. 读 者 可 能 发 现, 对 于 大 多 数 而 言, 我 们 应 该 是 用 MIPS III 或 -mips3 要 提 醒 的 是 R5000 和 R10000 也 都 是 R4000 的 延 伸 产 品 下 面 是 几 点 补 充 : *MIPS 指 令 是 32 位 长, 即 使 在 64 位 的 CPU 上 这 对 于 局 部 跳 转 指 令 的 理 解 很 有 帮 助 比 如 :J (TARGET);JAL (TARGET) J 和 JAL 的 OPERCODE 是 6 位, 剩 下 的 26 为 存 放 跳 转

偏 移 量 由 于 任 何 一 个 指 令 都 是 32 位 ( 或 4 字 节 ) 对 齐 (ALIGN) 的, 所 以 J 和 JAL 最 大 的 伸 缩 空 间 是 2^28=256M 如 果 你 的 程 序 要 作 超 过 256M 的 跳 转, 你 就 必 须 用 JALR 或 JR, 通 过 一 个 GPR 寄 存 器 来 存 放 你 的 跳 转 地 址 由 于 一 个 寄 存 器 是 32 或 64 位 的, 你 就 没 有 任 何 限 制 了 *MIPS CPU 的 SR(STATUS REGISTER) 中 有 几 位 是 很 重 要 的 设 置, 例 如, 选 择 指 令 系 统 或 要 把 64 位 的 MIPS 的 CPU CORE 运 行 在 32 模 式 下 SR[XX]: 1:MIPS IV INSTRUCTION SET USABLE 0:MIPS IV INSTRUCTION SET UNUSABLE SR[KX] SR[SX] SR[UX]: 0:CPU 工 作 在 32 位 模 式 下 1:CPU 工 作 在 64 位 模 式 下 一 般 而 言, 如 果 你 要 从 头 写 一 个 MIPS 核 心 为 32 位 程 序, 需 要 把 上 述 位 值 设 为 0 * 在 以 后 我 们 会 单 独 的 一 章 讲 将 流 水 线 和 指 令 系 统, 特 别 是 跳 转 指 令 的 关 系 在 这 里, 我 们 只 简 单 提 一 下 对 任 何 一 个 跳 传 指 令 后 面, 要 加 上 一 个 空 转 指 令 (NOP) 从 而 使 得 CPU 的 流 水 线 不 会 错 误 的 执 行 一 个 预 取 (PRE_FETCH) 得 指 令 当 然 这 个 NOP 可 以 替 换 为 别 的 放 一 个 NOP 是 最 简 单 和 安 全 的 有 兴 趣 的 读 者 可 以 用 mips64-elf-objdump -d 来 反 汇 编 一 个 OBJECT 文 件 就 会 一 目 了 然 了 * 一 定 要 记 住 :MIPS I,II, III 和 IV 指 令 系 统 不 包 含 特 权 指 令 换 句 话 说, 都 是 那 些 在 用 户 态 (USER MODE) 下 可 以 用 的 指 令 ( 当 然 KERNEL 下 也 能 用 ) 对 于 CP0 的 操 作 不 属 于 指 令 系 统 * 有 一 点 在 MIPS CPU 下, 要 特 别 注 意 : 对 齐 (ALIGN) MIPS 对 指 令 对 齐 的 要 求 是 严 厉 的 这 一 点 与 POWERPC 是 天 壤 之 别 指 令 必 须 是 32 位 对 齐 数 据 类 型 必 须 与 她 们 的 大 小 边 界 对 齐 * 建 议 读 者 阅 读 MIPS 规 约 是 要 花 时 间 看 一 看 指 令 系 统 的 定 义 3. 寄 存 器 约 定 对 于 在 一 个 CPU 上 进 行 开 发, 掌 握 其 CPU 的 寄 存 器 约 定 是 非 常 重 要 的

MIPS 体 系 结 构 提 供 了 32 个 GPR(GENERAL PURPOSE REGISTER) 这 32 个 寄 存 器 的 用 法 大 致 如 下 : REGISTER NAME USAGE $0 $zero 常 量 0(constant value 0) $2-$3 $v0-$v1 函 数 调 用 返 回 值 (values for results and expression evaluation) $4-$7 $a0-$a3 函 数 调 用 参 数 (arguments) $8-$15 $t0-$t7 暂 时 的 ( 或 随 便 用 的 ) $16-$23 $s0-$s7 保 存 的 ( 或 如 果 用, 需 要 SAVE/RESTORE 的 )(saved) $24-$25 $t8-$t9 暂 时 的 ( 或 随 便 用 的 ) $28 $gp 全 局 指 针 (Global Pointer) $29 $sp 堆 栈 指 针 (Stack Pointer) $30 $fp 帧 指 针 (Frame Pointer) (fp 在 现 代 编 译 器 中 基 本 上 不 用 了, 而 是 作 为 一 个 $t8 来 使 用 ) $31 $ra 返 回 地 址 (Return address) 对 一 个 CPU 的 寄 存 器 约 定 的 正 确 用 法 是 非 常 重 要 的 当 然 对 C 语 言 开 发 者 不 需 要 关 心, 因 为 编 译 器 会 处 理 但 对 于 操 作 系 统 核 心 或 驱 动 程 序 开 发 人 员 就 必 须 清 楚 一 般 来 讲, 你 通 过 objdump -d 可 以 清 醒 的 看 到 寄 存 器 的 用 法 下 面 通 过 笔 者 写 的 一 个 简 单 例 子 来 讲 解 : ~/ vi Hello.c "Hello.c" [New file] /* Example to illustrate mips register convention * -Author: Huailin Chen * 11/29/2001 */ int addfunc(int,int); int subfunc(int); void main() {

int x,y,z; x= 1; y=2; z = addfunc(x,y); } int addfunc(int x,int y) { int value1 = 5; int value2; value2 = subfunc(value1); return (x+y+value2); } int subfunc(int value) { return value--; } 上 面 是 一 个 C 程 序,main() 函 数 调 用 一 个 加 法 的 子 函 数 让 我 们 来 看 看 编 译 器 是 如 何 产 生 代 码 的 ~/huailinchen:74> /bin/mips-elf-gcc -c Hello.o Hello.c -mips3 -mcpu=r4000 -mgp32 -mfp32 -O1 ~/huailinchen:75> /bin/mips64-elf-objdump -d Hello.o Hello.o: file format elf32-bigmips Disassembly of section.text: /* main Function */ 0000000000000000 : /*create a stack frame by moving the stack pointer 8 *bytes down and meantime update the sp value */ 0: 27bdfff8 addiu $sp,$sp,-8 /* Save the return address to the current sp position.*/ 4: afbf0000 sw $ra,0($sp)

8: 0c000000 jal 0 /* nop is for the delay slot */ c: 00000000 nop /* Fill the argument a0 with the value 1 */ 10: 24040001 li $a0,1 /* Jump the addfunc */ 14: 0c00000a jal 28 /* NOTE HERE: Why we fill the second argument *behind the addfunc function call? * This is all about the "-O1" compilation optimization. * With mips architecture, the instruction after jump * will also be fetched into the pipline and get * executed. Therefore, we can promise that the * second argument will be filled with the value of * integer 2. */ 18: 24050002 li $a1,2 /*Load the return address from the stack pointer * Note here that the result v0 contains the result of * addfunc function call */ 1c: 8fbf0000 lw $ra,0($sp) /* Return */ 20: 03e00008 jr $ra /* Restore the stack frame */ 24: 27bd0008 addiu $sp,$sp,8 /* addfunc Function */ 0000000000000028 : /* Create a stack frame by allocating 16 bytes or 4 * words size */ 28: 27bdfff0 addiu $sp,$sp,-16 /* Save the return address into the stack with 8 bytes * offset. Please note that compiler does not save the * ra to 0($sp). *Think of why, in contrast of the previous PowerPC * EABI convention */

2c: afbf0008 sw $ra,8($sp) /* We save the s1 reg. value into the stack * because we will use s1 in this function * Note that the 4,5,6,7($sp) positions will then * be occupied by this 32 bits size register */ 30: afb10004 sw $s1,4($sp) /* Withe same reason, save s0 reg. */ 34: afb00000 sw $s0,0($sp) /* Retrieve the argument 0 into s0 reg. */ 38: 0080802d move $s0,$a0 /* Retrieve the argument 1 into s1 reg. */ 3c: 00a0882d move $s1,$a1 /* Call the subfunc with a0 with 5 */ 40: 0c000019 jal 64 /* In the delay slot, we load the 5 into argument a0 reg *for subfunc call. */ 44: 24040005 li $a0,5 /* s0 = s0+s1; note that s0 and s1 holds the values of * x,y, respectively */ 48: 02118021 addu $s0,$s0,$s1 /* v0 = s0+v0; v0 holds the return results of subfunc *call; And we let v0 hold the final results */ 4c: 02021021 addu $v0,$s0,$v0 /*Retrieve the ra value from stack */ 50: 8fbf0008 lw $ra,8($sp) /*!!!!restore the s1 reg. value */ 54: 8fb10004 lw $s1,4($sp) /*!!!! restore the s0 reg. value */ 58: 8fb00000 lw $s0,0($sp) /* Return back to main func */ 5c: 03e00008 jr $ra /* Update/restore the stack pointer/frame */ 60: 27bd0010 addiu $sp,$sp,16 /* subfunc Function */

0000000000000064 : /* return back to addfunc function */ 64: 03e00008 jr $ra /* Taking advantage of the mips delay slot, filling the * result reg v0 by simply assigning the v0 as the value *of a0. This is a bug from my c source * codes--"value--". I should write my codes * like "--value", instead. 68: 0080102d move $v0,$a0 希 望 读 者 静 下 心 来 把 上 面 的 代 码 看 懂 一 定 要 注 意 编 译 器 为 什 么 在 使 用 s0 和 s1 之 前 要 先 把 她 们 保 存 起 来, 然 后 再 恢 复, 虽 然 在 这 个 例 子 中 虽 然 main 函 数 没 用 s0 和 s1 另 外 的 一 点 是 : 由 于 我 们 加 了 -O1 优 化, 编 译 器 利 用 了 delay slot" 来 执 行 那 些 必 须 执 行 的 指 令, 而 不 是 简 单 的 塞 一 个 nop 指 令 在 那 里 非 常 的 漂 亮 为 了 使 得 读 者 更 加 理 解 寄 存 器 的 用 法, 下 面 笔 者 特 意 提 出 的 一 个 问 题 * 在 写 一 个 核 心 调 度 context switch() 例 程 时, 我 们 需 要 SAVE/RESTORE$t0-$t7 吗? 如 果 不, 为 什 么? * 在 写 一 个 时 钟 中 断 处 理 例 程 时, 我 们 需 要 SAVE/RESTORE$t0-$t7 吗? 如 果 是, 为 什 么? 4. MMU 和 内 存 管 理 对 于 MIPS 的 MMU 和 相 应 的 内 存 管 理, 读 者 需 要 注 意 的 是 : 不 存 在 x86 或 PowerPC 的 实 模 式 这 一 点 是 MIPS CPU 的 一 个 很 重 要 的 特 点 ( 或 缺 点 ) * MIPS 存 储 体 系 结 构 这 里 笔 者 不 讨 论 MIPS64 的 存 储 结 构, 而 只 是 关 注 32 位 机 器 MIPS 将 存 储 空 间 划 分 为 4 大 块 --kuseg, kseg0,kseg1 and kseg2. ------------------------------------------------------------------ 0xFFFF FFFF

mapped kseg2 0xC000 0000 unmapped uncached kseg1 0xA000 0000 unmapped cached kseg0 0x8000 0000 2G kuseg 0x0000 0000 ------------------------------------------------------------------ 对 于 上 述 结 构, 读 者 要 记 住 以 下 几 点 : * 当 开 电 (Power On) 的 时 候, 只 有 kseg0 and kseg1 是 可 以 存 取 的 *kseg0 512M(From 0x8000 0000 to 0xA000 0000) 直 接 被 缺 省 映 射 到 物 理 内 存 0x0000 0000 to 0x2000 0000, 并 且 是 缓 存 被 开 启 的 (cache-enabled) *kseg1 512M(From 0xA000 0000 to 0xC000 0000) 直 接 被 缺 省 映 射 到 物 理 内 存 0x0000 0000 t0 0x2000 0000, 并 且 是 没 有 缓 存 的 (non cachable) 以 上 两 点 对 于 理 解 基 于 MIPS 的 驱 动 程 序 或 操 作 系 统 的 启 动 是 至 关 重 要 的 细 心 的 读 者 会 发 现 :kseg1 有 点 象 其 他 CPU 的 实 模 式 方 式 * 在 加 电 时 (POWER ON)!( 虚 拟 ) 地 址 from 0x0000 0000 to 0x8000 0000 是 不 可 以 存 取 的, 必 须 等 到 MMU TLB 初 始 化 之 后 才 可 以 * 同 理 对 从 0xC000 0000 到 0xFFFF 0000 的 地 址 是 不 可 存 取 的 *MIPS 的 CPU 运 行 有 3 个 态 --User Mode( 用 户 态 ); Supervisor Mode( 管 理 态 ) 和 Kernel Mode( 核 心 态 ) 简 单 而 言, 读 者 只 需 要 了 解 用 户 态 和 核 心 态 操 作 系 统 一 般 而 言 也 只 利 用 这 个 CPU 的 状 态 下 面 是 读 者 必 须 非 常 清 楚 的 : 在 用 户 态 下,CPU 能 而 且 只 能 存 取 kuseg 的 地 址 CPU 必 须 运 行 在 管 理 态 或 核 心 态 下 去 存 取 kseg0,kseg1 和 kseg2 的 地 址 空 间 与 其 他 CPU 一 样,MIPS CPU 是 通 过 TLB 来 将 虚 拟 地 址 转 换 成 物 理 地 址 下 面 谈 谈 MIPS 的 ASID(Address Space Identifier). 简 单 而 言,ASID 与 虚 拟 地 址 一 起 构 成 一 个 定 位 一 个 TLB 的 钥 匙 (KEY) 换 句 话 说, 虚 拟 地 址 本 身 是 不 能 唯 一 确 定 一 个 TLB 的 一 般 而 言, 在 大 多 数 操 作 系 统 中, 一 个 ASID 的 值 其 实 就 是 一 个 相 应 的 进 程 标 识 ID

对 于 一 个 多 任 务 操 作 系 统 来 讲, 每 个 任 务 都 有 自 己 的 4G 虚 拟 空 间, 但 是 有 自 己 的 ASID 通 过 ASID,CPU 可 以 区 分 两 个 具 有 同 样 虚 拟 地 址 的 TLB 其 实 是 分 别 属 于 不 同 的 操 作 系 统 的 进 程 或 任 务 对 MMU 的 处 理 主 要 是 通 过 MMU 的 一 些 控 制 寄 存 器 来 完 成 的 MIPS 体 系 结 构 中 集 成 了 一 个 叫 做 System Control Coprocessor (CP0) 的 部 件 CP0 就 是 我 们 常 说 的 MMU 控 制 器 在 CP0 中, 除 了 TLB 条 目 ( 例 如, 对 RM5200, 有 48 对,96 个 TLB 条 目 ), 还 提 供 一 系 列 寄 存 器 提 供 给 操 作 系 统 来 控 制 MMU 的 行 为 每 个 CP0 控 制 寄 存 器 都 对 应 一 个 唯 一 的 寄 存 器 号 MIPS 提 供 特 殊 的 指 令 来 对 CP0 进 行 操 作 mfc0 reg. CP0_REG mtc0 reg. CP0_REG 通 过 上 述 的 两 条 指 令 来 把 一 个 GPR 寄 存 器 的 值 赋 值 给 一 个 CP0 寄 存 器, 从 而 达 到 控 制 MMU 的 目 的 下 面 简 单 介 绍 几 个 与 TLB 相 关 的 CP0 控 制 寄 存 器 Index Register 这 个 寄 存 器 是 用 来 指 定 TLB 条 目 的, 当 进 行 TLB 读 写 的 时 候 例 如,MIPS R5000 提 供 了 48 个 TLB 对, 所 以 index 寄 存 器 的 值 是 从 0 到 47 换 句 话 说, 每 次 TLB 写 的 行 为 是 对 一 对 发 生 的 这 一 点 是 与 其 他 的 CPU MMU TLB 读 写 不 同 的 EntryLo0, EntryLo1 这 两 个 寄 存 器 是 用 来 指 定 一 个 TLB 对 的 偶 (even) 和 奇 (odd) 物 理 (Physical) 页 面 地 址 一 定 要 注 意 的 是 :EntryLo0 是 给 偶 数 TLB 页 面, EntryLo1 是 给 奇 数 TLB 页 面 使 用 的 否 则 MMU 会 报 异 常 错 误 通 常 是 系 统 不 能 启 动 Entry Hi Entry Hi 寄 存 器 存 放 VPN2, 或 一 个 TLB 的 虚 拟 地 址 部 分 注 意 的 是 :ASID 的 值 也 是 在 这

里 被 填 写 Page Mask MIPS TLB 提 供 可 变 大 小 的 TLB 地 址 映 射 一 个 页 面 可 以 是 4K,16K,64K,256K,1M,4M 或 16M 这 种 可 变 页 大 小 (PAGE SIZE) 提 供 了 很 好 的 灵 活 性, 特 别 是 对 嵌 入 式 系 统 软 件 对 于 嵌 入 式 应 用, 一 个 很 大 的 区 别 就 是 : 不 允 许 大 量 的 页 面 错 处 理 否 则 系 统 性 能 将 会 非 常 的 差 这 一 点 是 传 统 意 义 上 的 操 作 系 统 是 不 一 样 的 也 是 为 什 么 POSIX 1.b 的 目 的 所 在 传 统 OS 存 储 管 理 的 一 个 原 则 就 是 :Page On Demand 这 对 大 多 嵌 入 式 系 统 是 不 允 许 的 嵌 入 式 系 统 往 往 是 需 要 在 系 统 初 始 化 的 时 刻 就 对 所 有 的 存 储 进 行 配 置, 以 确 保 在 系 统 运 行 时 不 会 有 页 面 错 异 常 上 述 几 个 寄 存 器 除 了 映 射 一 个 虚 拟 页 面 之 外, 还 包 括 设 置 一 个 页 面 的 属 性 其 中 包 括 : 可 写 性, 合 法 性, 缓 存 属 性 等 下 面 简 单 谈 谈 MIPS 的 JTLB 在 MIPS 中, 如 R5000,JTLB 的 意 思 是 Joint TLB. 什 么 意 思 呢? 就 是 TLB 条 目 中 TLB 是 指 令 和 数 据 TLB 混 合 的 有 的 CPU 的 指 令 TLB 和 数 TLB 条 目 是 分 开 的 当 然 MIPS(R5000) 确 实 还 有 两 个 小 的, 分 开 的 指 令 TLB 和 数 据 TLB 但 其 大 小 很 小 主 要 是 为 了 提 高 性 能, 而 且 是 对 系 统 软 件 透 明 的 下 面 讨 论 MMU TLB 和 CPU 缓 存 (Cache) 的 关 系 读 者 知 道,MIPS, 或 大 多 数 CPU, 的 Level 1 Cache 都 是 采 用 Virtually Indexed and Physically Tagged. 通 过 这 个 机 制,OS 不 需 要 在 每 次 进 程 切 换 的 时 候 去 清 除 缓 存 为 什 么 呢? 举 一 个 例 子 : 进 程 A 的 一 个 虚 拟 地 址 Addr1, 其 对 应 的 物 理 地 址 是 addre1; 进 程 B 的 一 个 虚 拟 地 址 Addr1, 其 对 应 的 物 理 地 址 是 addre2; 在 某 个 时 刻, 进 程 A 在 运 行 中, 并 且 Addr1 在 Level 1 CACHE 中 这 时 候,OS 进 行 一 个 上 下 文 切 换, 运 行 进 程 B, 进 程 A 进 入 睡 眠 状 态 现 在, 假 设 进 程 B 的 第 一 个 指 令 是 虚 拟 地 址 Addr1 进 行 一 个 存 取 这 时 候 CPU 会 错 误 的 把 进 程 A 在 缓 存 中 的 Addr1 的 addr1 返 回 给 CPU 吗? 正 确 的 答 案 是 : 不 会 的

原 因 是 : 当 进 程 切 换 时,OS 会 将 进 程 B 的 ASID 或 PID 填 入 ASID 寄 存 器 中 请 记 住 : 对 TLB 的 访 问,(ASID + VPN) 才 是 唯 一 确 定 TLB 条 目 的 逻 辑 由 于 MIPS 的 缓 存 属 性 是 Virtually Indexed, Physically tagged. 所 以, 任 何 地 址 的 访 问,CPU 都 会 多 MMU 的 TLB 进 行 查 询, 试 图 找 到 相 应 的 物 理 地 址 这 个 物 理 地 址 要 被 用 来 对 CPU 缓 存 的 条 目 查 找 中. 与 此 同 时,CPU 会 把 虚 拟 地 址 信 号 传 给 缓 存 控 制 器 然 后, 我 们 必 须 等 待 上 述 MMU 传 送 过 来 的 物 理 地 址 信 息 只 有 物 理 地 址 TAG 也 匹 配 上 了, 我 们 才 能 说 一 个 :Cache Hit( 缓 存 命 中 ) 所 以, 不 需 要 担 心 不 同 的 进 程 有 相 同 的 虚 拟 地 址 的 事 情 5. MIPS 异 常 和 中 断 处 理 任 何 一 个 CPU 都 要 提 供 一 个 完 善 的 异 常 和 中 断 处 理 机 制 一 个 软 件 系 统, 如 操 作 系 统, 就 是 一 个 时 序 逻 辑 系 统, 通 过 时 钟, 外 部 事 件 来 驱 动 整 个 预 先 定 义 好 的 逻 辑 行 为 这 也 是 为 什 么 当 写 一 个 操 作 系 统 时 如 何 定 义 时 间 的 计 算 是 非 常 重 要 的 原 因 读 者 都 非 常 清 楚 UNIX 提 供 了 一 整 套 系 统 调 用 (System Call) 系 统 调 用 其 实 就 是 一 段 异 常 处 理 程 序 读 者 可 能 要 问 : 为 什 么 CPU 要 提 供 异 常 和 中 断 处 理 呢? 其 目 的 是 : 处 理 非 法 操 作 例 如,TLB Fault,Cache Error 等 等 提 供 一 个 通 道 使 得 程 序 可 以 使 用 被 保 护 的 高 级 资 源, 例 如 CP0 寄 存 器 在 用 户 态 下 的 进 程 不 能 访 问 CP0 CPU 通 过 陷 入 核 心 态 的 异 常 处 理 方 式 使 得 一 个 进 程 可 以 安 全 的 进 行 一 些 CPU 的 高 级 设 置 处 理 外 部 和 内 部 中 断, 例 如, 时 钟, 看 门 狗 (WatchDog) 等 等 下 面 来 讨 论 MIPS 是 如 何 处 理 异 常 和 中 断 各 种 MIPS 的 变 种 都 有 些 细 微 的 差 别 下 面 是 基 于 MIPS R7000 的 结 构 理 解 MIPS 异 常 处 理 最 重 要 的 概 念 是 :MIPS 体 系 结 构 采 用 的 是 精 确 异 常 处 理 模 式 这 是 什 么 意 思 呢? 下 面 来 看 从 See MIPS Run 一 书 中 的 摘 录 : In a precise-exception CPU, on any exception we get pointed at one instruction(the exception victim). All instructions preceding the

exception victim in execution sequence are complete; any work done on the victim and on any subsequent instructions (BNN NOTE: pipeline effects) has no side effects that the software need worry about. The software that handles exceptions can ignore all the timing effects of the CPU's implementations 上 面 的 意 思 其 实 很 简 单 : 在 发 生 这 个 异 常 之 前 的 一 切 计 算 行 为 会 完 整 的 结 束 并 体 现 效 果 在 发 生 这 个 异 常 之 后 的 一 切 计 算 行 为 ( 包 含 当 前 这 条 指 令 ) 将 不 会 产 生 任 何 效 果 对 绝 大 多 数 情 况 而 言, 如 果 读 者 要 写 一 个 系 统 调 用 (System Call), 只 需 要 记 住 : MIPS 已 经 把 syscall 这 条 指 令 的 地 址 压 在 了 EPC 寄 存 器 里 换 句 话 说, 在 MIPS 里, 你 需 要 在 异 常 返 回 之 前 显 示 的 给 EPC 寄 存 器 赋 值 EPC<-----EPC+4 只 有 这 样, 你 才 能 从 系 统 调 用 中 正 确 返 回 下 面 讨 论 一 下 MIPS 的 异 常 / 中 断 向 量 表 (Exception/Interrupt Vector) MIPS 的 异 常 / 中 断 向 量 表 ( 假 定 将 MIPS 运 行 在 32 为 模 式 下 ) Reset, NMI: 0x8000 0000 TLB Refill: 0x8000 0000 Cache Error 0xA000 00100 其 他 的 异 常 都 指 向 :0x8000 0180 那 么 MIPS 如 何 来 区 分 和 处 理 一 个 异 常 呢? 其 时 序 逻 辑 可 以 简 单 的 归 纳 如 下 : 1. 将 EPC 赋 值 为 要 重 新 执 行 ( 被 中 断 的 ) 指 令 的 地 址 2. CPU 变 为 核 心 态, 并 且 禁 止 中 断 ( 通 过 SR[EXL] 的 位 ) 3. 对 Cause 寄 存 器 赋 值, 从 而 程 序 可 以 判 断 是 一 个 具 体 的 什 么 异 常 中 断 如 果 是 一 个 TLB Miss 方 面 的 异 常,BadVaddre 寄 存 器 也 会 被 同 时 赋 值, 从 而 提 高 更 多 的 异 常 信 息 4. CPU 开 始 从 异 常 处 理 向 量 的 入 口 存 取 指 令, 从 而 CPU 逻 辑 进 入 异 常 处 理 5. 从 异 常 返 回 从 MIPS III 指 令 集 开 始, 从 中 断 返 回 用 的 是 指 令 eret 该 指 令 的 功 能 其 实 就 是 iangsr[exl] 位 清 零 ( 开 中 断 ), 并 把 CPU 的 控 制 转 向 将 EPC 寄 存 器 指 向 的 地 址 在 理 解 MIPS 中 断 处 理 结 构 时, 需 要 对 SR 状 态 寄 存 器 的 IE 和 EXL 位 充 分 了 解 SR[IE]: 用 来 开 启 和 关 闭 中 断, 其 中 也 包 括 时 钟 中 断 当 然, 如 果 SR[EXL] 位 被 置 位 时,IE 位 不 起 作 用 EXL 和 ERL 在 CPU 异 常 中 断 处 理 时 会 被 硬 件 自 动 置 为, 从 而 关 闭 所 有 中 断, 从 而 系 统 可 以 安 全 的 进 行 中 断 异 常 的 处 理 ( 前 期 ) 工 作

K0 and K1 寄 存 器 这 个 两 个 寄 存 器 是 被 操 作 系 统 核 心 使 用 的 暂 时 变 量, 从 而 不 需 要 使 用 一 些 内 存 变 量 读 者 如 果 有 兴 趣 的 话, 可 以 发 现 gcc 编 译 器 的 ABI 不 会 使 用 这 两 个 寄 存 器 换 句 话 说,K0 和 K1 是 系 统 保 留 的 在 使 用 这 两 个 寄 存 器 的 时 候, 要 非 常 小 心 例 如, 当 在 异 常 中 断 处 理 的 中 后 期, 系 统 软 件 通 常 会 开 启 中 断, 从 而 系 统 可 以 支 持 嵌 套 中 断 处 理 这 个 时 候, 软 件 要 注 意 K0 和 K1 的 保 存 和 恢 复 工 作 笔 者 不 鼓 励 读 者 使 用 MIPS 的 AT 寄 存 器 应 该 使 用.set noat 宏 来 关 闭 编 译 器 的 优 化 流 水 线 (Pipeline) 和 中 断 读 者 知 道,MIPS 是 一 个 RISC 技 术 处 理 器 在 某 一 个 时 刻, 在 流 水 线 上, 同 时 有 若 干 个 指 令 被 处 理 在 不 同 的 阶 段 (stage) 上. MIPS 处 理 器 一 般 采 用 5 级 流 水 结 构 IF RD ALU MEM WB 那 么 读 者 要 问 : 当 一 个 中 断 异 常 发 生 时,CPU 到 底 该 如 何 handle? 答 案 是 这 样 的 : On an interrupt in a typical MIPS CPU, the last instruction to be completed before interrupt processing starts will be the one that has just finished its MEM stage when the interrupt is detected. The exception victim will be the one that has just finished its ALU stage... 对 上 述 的 理 解 是 这 样 的 :CPU 会 保 证 完 成 那 条 已 通 过 MEM 流 水 级 的 指 令 然 后 将 中 断 牺 牲 者 (exception victim) 定 位 在 后 面 那 条 (following) 指 令 上 要 注 意 的 是 : 我 们 是 在 谈 中 断 (Interrupt), 而 不 是 异 常 (Exception). 在 MIPS 中, 这 是 有 细 微 区 别 的 下 面 介 绍 几 个 重 要 的 SR(Status Register, 状 态 寄 存 器 ) 与 异 常 和 中 断 有 关 的 位 * SR[EXL] Exception Level; set by the processor when any exception other than Reset, Soft Reset, NMI, or Cache Error exception are taken. 0: normal 1: exception 当 EXL 被 置 位 时, - 中 断 是 被 禁 止 的 换 句 话 说, 这 时 SR[IE] 位 是 不 管 用 了, 相 当 于 所 有 的 中 断 都 被 屏 蔽 了

- TLB Refill 异 常 将 会 使 用 General Exception Vector 而 不 是 缺 省 的 TLB Refill Vector. - 如 果 再 次 发 生 异 常,EPC 将 不 会 被 自 动 更 新 这 一 点 要 非 常 注 意 如 果 想 支 持 嵌 套 异 常, 要 在 异 常 处 理 例 程 中 清 EXL 位 当 然 要 先 保 存 EPC 的 值 另 外 要 注 意 的 :MIPS 当 陷 入 Exception/Interrupt 时, 并 不 改 变 SR[UX],SR[KX] 或 SR[SX] 的 值 SR[EXL] 为 1 自 动 的 将 CPU mode 运 行 在 核 心 模 式 下 这 一 点 要 注 意 * SR[ERL] Error Level; set by the processor when Reset, Soft Reset, NMI, or Cache Error exception are taken. 0: normal 1: error 当 ERL 被 置 位 时, - 中 断 被 禁 止 - 中 断 返 回 ERET 使 用 的 是 ErrorEPC 而 不 是 EPC 需 要 非 常 注 意 这 个 区 别 - Kuseg 和 xkuseg 被 认 为 是 没 有 映 射 (Mapped) 的 和 没 有 缓 存 (Un-Cached) 可 以 这 样 理 解,MIPS CPU 只 有 在 这 个 时 刻 才 是 一 种 ** 实 模 式 (real mode)**, 可 以 不 需 要 TLB 的 映 射, 就 直 接 使 用 kuseg 的 地 址 空 间 * SR[IE] Interrupt Enable 0: disable interrupts 1: enable interrupts 请 记 住 : 当 SR[EXL] 或 SR[ERL] 被 SET 时, SR[IE] 是 无 效 的 * Exception/Interrupt 优 先 级 Reset (highest priority) Soft Reset Nonmaskable Interrupt (NMI) Address error --Instruction fetch TLB refill--instruction fetch TLB invalid--instruction fetch Cache error --Instruction fetch Bus error --Instruction fetch Watch - Instruction Fetch Integer overflow, Trap, System Call, Breakpoint, Reserved Instruction, Coprocessor Unus-able, or Floating-Point Exception Address error--data access TLB refill --Data access TLB invalid --Data access TLB modified--data write Cache error --Data access Watch - Data access

Virtual Coherency - Data access Bus error -- Data access Interrupt (lowest priority) 读 者 请 注 意, 所 谓 的 优 先 级 是 指 : 当 在 某 个 时 刻, 同 时 多 个 异 常 或 中 断 出 现 时,CPU 将 会 按 照 上 述 的 优 先 级 来 处 理 如 果 CPU 目 前 已 经 在 TLB refill 处 理 的 例 程 中, 这 时, 出 现 了 总 线 错 (Bus Error) 的 信 号,CPU 不 会 拒 绝 当 然, 在 这 次 的 处 理 中,EPC 的 值 不 会 被 更 新, 如 果 EXL 还 是 处 于 被 置 位 的 状 态 异 常 的 嵌 套 在 有 的 情 况 下, 希 望 在 异 常 或 中 断 中, 系 统 可 以 继 续 处 理 其 他 的 异 常 或 中 断 这 需 要 系 统 软 件 处 理 如 下 事 情 : * 进 入 处 理 程 序 后, 我 们 要 设 置 CPU 模 式 为 核 心 态, 然 后 清 除 SR[EXL], 从 而 支 持 EPC 会 被 更 新, 从 而 支 持 嵌 套 处 理 * EPC 和 SR 的 值 EPC 和 SR 寄 存 器 是 两 个 全 局 的 任 何 一 个 异 常 和 中 断 发 生 时,CPU 硬 件 都 会 将 更 新 上 述 寄 存 器 的 当 前 值 所 以, 对 于 支 持 异 常 嵌 套 的 系 统, 要 妥 善 保 存 EPC 和 SR 寄 存 器 的 值 *SR[IE] 是 一 个 很 重 要 的 位 来 处 理 嵌 套 异 常 值 得 注 意 的, 或 容 易 犯 错 的 一 点 是 : 在 做 恢 复 上 下 文 时, 要 避 免 重 入 问 题 比 如, 要 用 eret 返 回 时, 要 建 立 EPC 的 值 在 此 之 前, 一 定 要 先 关 闭 中 断 disable interrupt. 否 则,EPC 可 能 被 冲 掉 下 面 是 一 段 异 常 中 断 返 回 的 例 子 代 码 : /* 读 取 SR 的 当 前 值 */ mfc0 t0,c0[sr] /* 加 一 个 delay slot 指 令 */ nop /* 清 楚 SR[IE], 关 闭 中 断 */ li t1,~sr[ie] and t0,t0,t1 mtc0 t0,c0[sr]

nop /* 可 以 安 全 的 恢 复 EPC 的 值 */ ld t1,r_epc(sp) mtc0 t1,c0[epc] nop lhu k1, /* 恢 复 老 的 中 断 屏 蔽 码, 被 暂 时 保 留 在 k1 里 */ or t0,t0,k1 /* 从 新 对 SR[EXL] 置 位 ERET 会 自 动 将 其 清 除 一 定 要 理 解, 为 什 么 中 断 例 程 要 在 前 面 要 清 除 EXL 如 果 不 的 话 就 不 能 支 持 嵌 套 异 常 为 什 么, 希 望 读 者 能 思 考 并 回 答 并 且, 在 清 EXL 之 前, 我 们 一 定 要 先 把 CPU 模 式 变 为 核 心 模 式 */ ori t0,t0,sr[exl] /* 一 切 就 绪, 恢 复 中 断 屏 蔽 码 和 对 EXL 置 位 */ mtc0 t0,c0[sr] nop ori t0,t0,sr[ie] /* 置 为 IE */ ori t0,t0,sr[imask7 ] mtc0 t0,c0[sr ] nop /* 恢 复 CPU 模 式 */ ori t0, t0,sr[usermode] mtc0, t0, C0[SR ] eret /*eret 将 对 EXL 清 零 所 以 要 注 意, 如 果 你 在 处 理 程 序 中 改 变 了 CPU 的 模 式, 一 定 要 确 保, 在 重 新 设 置 EXL 位 后, 恢 复 CPU 的 原 来 模 式, 否 则 用 户 进 程 将 会 在 核 心 态 下 运 行

MIPS CPU 体 系 结 构 概 述,Linux/MIPS 内 核 ( 下 ) 陈 怀 临, 张 福 新 弯 曲 评 论 中 国 科 学 院 计 算 所 www.tektalk.cn www.ict.ac.cn 第 二 部 分 Linux/MIPS 核 心 剖 析 1. 硬 件 知 识 * CPU 手 册 : http://www.mips.com * 主 板 资 料 : 相 应 的 厂 商. * 背 景 知 识 : 如 PCI 协 议, 中 断 概 念 等. 2. 软 件 资 源 * http://oss.sgi.com/linux, ftp://oss.sgi.com * http://www.mips.com * mailing lists: linux-mips@oss.sgi.com debian-mips@oss.sgi.com * kernel cvs

sgi: cvs -d :pserver:cvs@oss.sgi.com:/cvs login (Only needed the first time you use anonymous CVS, the password is "cvs") cvs -d :pserver:cvs@oss.sgi.com:/cvs co linux 另 外 sourceforge.net 也 有 另 一 个 内 核 树, 似 乎 不 如 sgi 的 版 本 有 影 响. * 经 典 书 籍 : * "Mips R4000 Microprocessor User's Manual",by Joe Heinrich * "See Mips Run",by Dominic Sweetman * "See Mips Run"( 中 文 版 )www.xtrj.org/smr.htm * Jun Sun's mips porting guide: http://linux.junsun.net/porting-howto/ * 交 叉 编 译 指 南 : http://www.ltc.com/~brad/mips/mips-cross-toolchain.html * Debian Mips port: http://www.debian.org/ports/mips * 系 统 计 算 研 究 所 网 站 : http://www.xtrj.org 3. mips kernel 的 一 般 介 绍 ( 下 面 一 些 具 体 代 码 基 于 2.4.8 的 内 核 ) 我 们 来 跟 随 内 核 启 动 运 行 的 过 程 看 看 mips 内 核 有 什 么 特 别 之 处. 加 电 后,mips kernel 从 系 统 固 件 程 序 ( 类 似 bios, 可 能 烧 在 eprom,flash 中 ) 得 到 控 制 之 后 (head.s), 初 始 化 内 核 栈, 调 用 init_arch 初 始 化 硬 件 平 台 相 关 的 代 码. init_arch(setup.c) 首 先 监 测 使 用 的 CPU( 通 过 MIPS CPU 的 CP0 控 制 寄 存 器 PRID) 确 定 使 用 的 指 令 集 和 一 些 CPU 参 数, 如 TLB 大 小 等. 然 后 调 用 prom_init 做 一 些 底 层 参 数 初 始 化. prom_init 是 和 具 体 的 硬 件 相 关 的. 使 用 MIPS CPU 的 平 台 多 如 牛 毛, 所 以 大 家 在 arch/mips 下 面 可 以 看 到 很 多 的 子 目 录, 每 个 子 目 录 是 一 个 或 者 一 系 列 相 似 的 平 台. 这 里 的 平 台 差 不 多 可 以 理 解 成 一 块 主 板 加 上 它 的 系 统 固 件, 其 中 很 多 还 包 括 一 些 专 用 的 显 卡 什 么 的 硬 件 ( 比 如 一 些 工 作 站 ). 这 些 目 录 的 主 要 任 务 是 : 1. 提 供 底 层 板 子 上 的 一 些 重 要 信 息, 包 括 系 统 固 件 传 递 的 参 数,io 的 映 射 基 地 址, 内 存 的 大 小 的 分 布 等. 多 数 还 包 括 提 供 早 期 的 信 息 输 入 输 出 接 口 ( 通 常 是 一 个 简 单 的 串 口 驱 动 ) 以 方 便 调 试, 因 为 pmon 往 往 不 提 供 键 盘 和 显 示 卡 的 支 持.? 2. 底 层 中 断 代 码, 包 括 中 断 控 制 器 编 程 和 中 断 的 分 派, 应 答 等 3. pci 子 系 统 底 层 代 码. 实 现 pci 配 置 空 间 的 读 写, 以 及 pci 设 备 的 中 断,IO/Mem

空 间 的 分 配 4. 其 它, 特 定 的 硬 件. 常 见 的 有 实 时 时 钟 等 这 里 关 键 是 要 理 解 这 些 硬 件 平 台 和 熟 悉 的 x86 不 同 之 处. 笔 者 印 象 较 深 的 有 几 个 : * item MIPS 不 象 X86 有 很 标 准 的 硬 件 软 件 接 口, 而 是 五 花 八 门, 每 个 厂 家 有 一 套, 因 为 它 们 很 多 是 嵌 入 式 系 统 或 者 专 门 的 工 作 站. 不 象 PC 中, 有 了 BIOS 后 用 同 一 套 的 程 序, 就 可 以 使 用 很 多 不 同 的 主 板 和 CPU. MIPS 中 的 'bios' 常 用 的 有 pmon 和 yamon, 都 是 开 放 源 代 码 的 软 件 很 多 开 发 板 带 的 固 件 功 能 和 PC BIOS 很 不 一 样, 它 们 多 数 支 持 串 口 显 示, 或 者 网 络 下 载 和 启 动, 以 及 类 DEBUG 的 调 试 界 面, 但 可 能 根 本 不 支 持 显 卡 和 硬 盘, 没 有 一 般 的 基 本 ' 输 入 输 出 ' 功 能. * PCI 系 统 和 地 址 空 间, 总 线 等 问 题. 在 x86 中,IO 空 间 用 专 门 的 指 令 访 问, 而 PCI 设 备 的 内 存 空 间 和 物 理 内 存 空 间 是 相 同 的, 也 就 是 说, 在 CPU 看 来 物 理 内 存 从 地 址 0 开 始 的 话, 在 PCI 设 备 看 来 也 是 一 样 的. 反 之,PCI 设 备 的 基 地 址 寄 存 器 设 定 的 PCI 存 储 地 址,CPU 用 相 同 的 物 理 地 址 访 问 就 行 了. 而 在 MIPS 中 就 很 不 一 样 了,IO 一 般 是 memory map 的,map 到 哪 里 就 倚 赖 具 体 平 台 了. 而 PCI 设 备 的 地 址 空 间 和 CPU 所 见 的 物 理 内 存 地 址 空 间 往 往 也 不 一 样 (bus address & physical address). 所 以 mips kernel 的 iob/outb, 以 及 bus_to_virt/virt_to_bus,phys_to_virt/virt_to_phys,ioremap 等 就 要 小 心 考 虑. 这 些 问 题 有 时 间 笔 者 会 对 这 些 问 题 做 专 门 的 说 明. PCI 配 置 空 间 的 读 写 和 地 址 空 间 映 射 的 处 理 通 常 都 是 每 个 平 台 不 一 样 的. 因 为 缺 乏 统 一 接 口 的 BIOS, 内 核 经 常 要 自 己 做 PCI 设 备 的 枚 举, 空 间 分 配, 中 断 分 配. * 中 断 系 统. PC 中 中 断 控 制 器 先 是 有 8259, 后 来 是 apic, 而 cpu 的 中 断 处 理 386 之 后 好 像 也 变 化 不 大, 相 对 统 一. mips CPU 的 中 断 处 理 方 式 倒 是 比 较 一 致, 但 是 主 板 上 的 控 制 器 就 乱 七 八 糟 了 怎 么 鉴 别 中 断 源, 怎 么 编 程 控 制 器 等 任 务 就 得 各 自 实 现 了.

总 的 说 来,MIPS CPU 的 中 断 处 理 方 式 体 现 了 RISC 的 特 点 : 软 件 做 事 多, 硬 件 尽 量 精 简. 编 程 控 制 器, 提 供 中 断 控 制 接 口,dispatch 中 系? 这 一 部 分 原 来 很 混 乱, 大 家 各 写 各 的, 现 在 有 人 试 图 写 一 些 比 较 统 一 的 代 码 ( 实 际 上 就 是 原 来 x86 上 用 的 controller/handler 抽 象 ). * 存 储 管 理. MIPS 是 典 型 的 RISC 结 构, 它 的 存 储 管 理 单 元 做 的 事 情 比 象 x86 这 种 机 器 少 得 多. 例 如, 它 的 tlb 是 软 件 管 理 的,cache 常 常 是 需 要 系 统 程 序 干 预 的. 而 且, 过 多 的 CPU 和 主 板 变 种 使 得 这 一 部 分 非 常 复 杂, 容 易 出 错. 存 储 管 理 的 代 码 主 要 在 include/ asm-mips 和 arch/mips/mm/ 目 录 下. * 其 它. 如 时 间 处 理,r4k 以 上 的 MIPS CPU 提 供 count/compare 寄 存 器, 每 隔 几 拍 count 增 加, 到 和 compare 相 等 时 发 生 时 钟 中 断, 这 可 以 用 来 提 供 系 统 的 时 钟 中 断. 但 很 多 板 子 自 己 也 提 供 其 它 的 可 编 程 时 钟 源. 具 体 用 什 么 就 取 决 于 开 发 者 了. init_arch 后 是 loadmmu, 初 始 化 cache/tlb. 代 码 在 arch/mips/mm 里. 有 人 可 能 会 问, 在 cache 和 tlb 之 前 CPU 怎 么 工 作 的? 在 x86 里 有 实 模 式, 而 MIPS 没 有, 但 它 的 地 址 空 间 是 特 殊 的, 分 成 几 个 不 同 的 区 域, 每 个 区 域 中 的 地 址 在 CPU 里 的 待 遇 是 不 一 样 的, 系 统 刚 上 电 时 CPU 从 地 址 bfc00000 开 始, 那 里 的 地 址 既 不 用 tlb 也 不 用 cache, 所 以 CPU 能 工 作 而 不 管 cache 和 tlb 是 什 么 样 子. 当 然, 这 样 子 效 率 是 很 低 的, 所 以 CPU 很 快 就 开 始 进 行 loadmmu. 因 为 MIPS CPU 变 种 繁 多, 所 以 代 码 又 臭 又 长. 主 要 不 外 是 检 测 cache 大 小, 选 择 相 应 的 cache/tlb flush 过 程, 还 有 一 些 memcpy/memset 等 的 高 效 实 现. 这 里 还 很 容 易 出 微 妙 的 错 误, 软 件 管 理 tlb 或 者 cache 都 不 简 单, 要 保 证 效 率 又 要 保 证 正 确. 在 开 发 初 期 常 常 先 关 掉 CPU 的 cache 以 便 排 除 cache 问 题. MMU 初 始 化 后, 系 统 就 直 接 跳 转 到 init/main.c 中 的 start_kernel, 很 快 吧? 不 过 别 高 兴,start_kernel 虚 晃 一 枪, 又 回 到 arch/mips/kernel/setup.c, 调 用 setup_arch, 这 回 就 是 完 成 上 面 说 的 各 平 台 相 关 的 初 始 化 了. 平 台 相 关 的 初 始 化 完 成 之 后,mips 内 核 和 其 它 平 台 的 内 核 区 别 就 不 大 了, 但 也 还 有 不 少 问 题 需 要 关 注. 如 许 多 驱 动 程 序 可 能 因 为 倚 赖 x86 的 特 殊 属 性 ( 如 IO 端 口, 自 动 的 cache 一 致 性 维 护, 显 卡 初 始 化 等 ) 而 不 能 直 接 在 MIPS 下 工 作. 例 如, 能 直 接 ( 用 现 有 的 内 核 驱 动 ) 在 MIPS 下 工 作 的 网 卡 不 是 很 多, 笔 者 知 道 的 有 intel