操作系统课设报告 桂林电子科技大学.doc_第1页
操作系统课设报告 桂林电子科技大学.doc_第2页
操作系统课设报告 桂林电子科技大学.doc_第3页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

桂林电子科技大学综合设计说明书用纸 GeekOS GeekOS 操作系统操作系统 课程设计说明书课程设计说明书 题题 目 目 GeekOSGeekOS 操作系统的研究与实验操作系统的研究与实验 学学 院 院 计算机科学与工程学院计算机科学与工程学院 专专 业业 信息安全信息安全 姓姓 名名 学 号 指导教师 指导教师 2015 年年 06 月月 12 日日 桂林电子科技大学综合设计说明书用纸 目 录 1 GEEKOS 简介简介 1 1 1 GEEKOS 系统源代码结构 1 2 课程设计环境课程设计环境 2 3 项目项目 0 的设计实现的设计实现 3 3 1 项目设计目的 3 3 2 项目设计要求 3 3 3 项目实现原理 3 3 4 项目实现过程 3 3 5 运行结果 5 4 项目项目 1 的设计实现的设计实现 6 4 1 项目设计目的 6 4 2 项目设计要求 6 4 3 项目实现原理 6 4 4 项目实现过程 8 4 5 运行结果 9 5 项目项目 2 的设计实现的设计实现 10 5 1 项目设计目的 10 5 2 项目设计目的 10 5 3 项目实现原理 11 5 4 项目实现过程 13 5 5 运行结果 23 6 遇到问题及解决方法遇到问题及解决方法 23 7 课程设计总结课程设计总结 24 桂林电子科技大学综合设计说明书用纸 第 1 页 1 GeekOS 简介 GeekOS 是一个基于 X86 架构的 PC 上运行的微操作系统内核 由美国马理兰大学的教 师开发 主要用于操作系统课程设计 目的是使学生能够实际动手参与到一个操作系统的 开发工作中 出于教学目的 这个系统内核设计简单 却又兼备实用性 它可以运行在真 正的 X86 PC 硬件平台 作为一个课程设计平台 GeekOS 由一个基本的操作系统内核作为基 础 提供了操作系统与硬件之间的所有必备接口 实现了系统引导 实模式到保护模式的转换 中 断调用及异常处理 基于段式的内存管理 FIFO 进程调度算法以及内核进程 基本的输入输 出 键盘作为输入设备 显示器作为输出设备 以及一个用于存放用户程序的只读文件系统 PFAT 学生可以在 Linux 或 Unix 环境下对其进行功能扩充 且其针对进程 文件系统 存 储管理等操作系统核心内容分别设计了 7 个难度逐渐增加的项目供学生选择 1 1 GeekOS 系统源代码结构 GeekOS 操作系统源文件 geekos 0 3 0 zip 可以从 下载 图 1 1 GeekOS 系统主目录 在 doc 目录里的文件 hacking pdf 和 index htm 是 GeekOS 系统的参考文档 Scripts 目录下有 startProject 和 removeEmptyConflicts 两个脚本文件 GeekOS 系统的源文件在 src 目录下 分为 7 个项目 Project0 到 Project7 在 build 文件夹中 包含系统编译后 的可执行文件的文件 软盘镜像或是硬盘镜像 makefile 项目管理文件 在 include 文件 夹中有 GeekOS 和 libc 两个子目录 在 GeekOS 子目录中有 kthread h keyboard h 等文件 桂林电子科技大学综合设计说明书用纸 第 2 页 图 1 2 项目文件结构图 2 课程设计环境 1 虚拟机软件 VMware Workstation 10 0 2 虚拟系统 linux 系统 CentOS 6 0 3 NASM 汇编器 4 GNU gcc 编译器 5 GNU gdb 调试器 6 Sourse Insight 程序编辑器和代码浏览器 7 Bochs GeekOS 运行于 Windows 或 Linux 下的 Bochs PC 模拟器 Bochs 是用 C 开发的可移植的 IA 32 x86 PC 模拟器 它包括对 Intel x86 CPU 通用 I O 设备和可定 制的 BIOS 的模拟 几乎可以运行在所有流行的平台上 在本次课设中使用的是 bochs 2 6 图 2 1 课设环境 桂林电子科技大学综合设计说明书用纸 第 3 页 3 项目 0 的设计实现 3 1 项目设计目的 熟悉 GeekOS 的项目编译 调试和运行环境 掌握 GeekOS 运行工作过程 3 2 项目设计要求 1 搭建 GeekOS 的编译和调试平台 掌握 GeekOS 的内核进程工作原理 2 熟悉键盘操作函数 编程实现一个内核进程 该进程的功能是 接收键盘输入的字符并 显示到屏幕上 当输入 ctrl d 时 结束进程的运行 3 3 项目实现原理 项目 0 主要要求设计一个函数对键盘的中断进行响应 这主要通过使用 GeekOS 提供 的键盘响应函数 Wait Kernel Thread 进行键盘中断的响应和返回键值 该函数首先检查键 盘缓冲区是否有按键 如果有 就读取一个键码 如果此时键盘缓冲区没有键值 就将线 程放入键盘事件等待队列 于是可分为两步完成 1 编写函数 EchoCount 函输功能是 接受键盘输入的按键 并将键值显示在显示器 当输入 Ctrl D 退出 2 在 Main 函数体内调用 Start Kernel Thread 函数 将编写的函数地址传递给 startFunc 建立一个内核进程 3 4 项目实现过程 1 添加代码 1 在 Main 函数中编写一个函数 函数功能是 接收键盘输入的按键 并将键值显示 到显示器的函数 当输入 Ctrl D 就退出 void project0 Print To Exit hit Ctrl d n Keycode keycode while 1 if Read Key 低 8 位为 Ascii 码 if keycode Exit 1 else Print c asciiCode r n keycode 桂林电子科技大学综合设计说明书用纸 第 4 页 放在 main 函数之前 2 在 Main 函数体内调用 Start Kernel Thread 函数 将步骤 1 编写的函数地址传递给 参数 startFunc 建立一个内核级进程 void Main struct Boot Info bootInfo TODO Start a kernel thread to echo pressed keys and print counts struct Kernel Thread thread thread Start Kernel Thread 2 编译 GeekOS 项目 project0 1 shell cd geekos 0 3 0 src project0 build 2 shell make depend 生成 depend mak 文件 图 3 1 make depend 执行过程 3 shell make 成功之后在 build 目录下生成 fd img 文件 桂林电子科技大学综合设计说明书用纸 第 5 页 图 3 2 make 执行过程 3 配置启动 Bochs 1 创建 bochs 配置文件 shell gedit bochsrc 2 在编辑器中输入一下配置内容 gdbstub enabled 1 port 1234 text base 0 data base 0 bss base 0 romimage file BXSHARE BIOS bochs latest megs 8 boot a floppya 1 44 fd img status inserted log bochs out 3 保存 直接退出 gedit 3 5 运行结果 1 启动 bochs shell bochs bochsrc 2 选择 begin simulation 3 结果 桂林电子科技大学综合设计说明书用纸 第 6 页 图 3 3 项目 0 运行结果 4 项目 1 的设计实现 4 1 项目设计目的 熟悉 ELF 文件格式 了解 GeekOS 系统如何将 ELF 格式的可执行程序装入到内存 建立内核进程 并运行的实现技术 4 2 项目设计要求 1 修改 geekos elf c 文件 在函数 Parse ELF Executable 中添加代码 分析 ELF 格式 的可执行文件 包括分析得出 ELF 文件头 程序头 获取可执行文件长度 代码段 数据 段等信息 并填充 Exe Format 数据结构中的域值 2 在 Linux 环境下编译系统得到 GeekOS 镜像文件 3 编写一个相应的 bochs 配置文件 4 在 bochs 中运行 GeekOS 系统显示结果 4 3 项目实现原理 1 ELF 文件格式 连接程序视图 执行程序视图 ELF 头部ELF 头部 程序头部表 可选 程序头部表 节区 1 段 1 桂林电子科技大学综合设计说明书用纸 第 7 页 节区 n 段 2 节区头部表 节区头部表 可选 表 4 1 ELF 目标文件格式 2 内存中的可执行文件镜像 GeekOS 中的用户进程全部在系统的编译阶段完成编译和链接 形成可执行文件 用 户可执行文件保存在 PFAT 文件系统中 项目 1 要完成的事系统启动后 从 PFAT 文件系 统将可执行文件装入内存 建立进程并运行得到相应的输出 如下图 图 4 1 文件镜像 3 内核线程的建立流程 该过程主要由 Spawner 函数实现 其主要经过 调用 Read Fully 函数将文件读入内存 后调用 Parse ELF Executable 函数分析 ELF 文件 最后调用 Spawn Program 函数将可执行 程序的代码段和数据段等装入内存 此后便可以开始运行一个内核级进程了 如下图 桂林电子科技大学综合设计说明书用纸 第 8 页 图 4 2 建立流程 4 4 项目实现过程 1 添加代码 修改 geekos elf c 文件 在函数 Parse ELF Executalbe 中添加代码 分析 ELF 格式的可执行文件 包括分析得出 ELF 文件头 程序头 获取可执行文件长度 代码段 数据段等信息 并填充 Exe Format 数据结构中的域值 int Parse ELF Executable char exeFileData ulong t exeFileLength struct Exe Format exeFormat TODO Parse an ELF executable image int i elfHeader head elfHeader exeFileData programHeader proHeader programHeader exeFileData head phoff KASSERT exeFileData NULL KASSERT exeFileLength head ehsize head phentsize head phnum KASSERT head entry 4 0 桂林电子科技大学综合设计说明书用纸 第 9 页 exeFormat numSegments head phnum exeFormat entryAddr head entry for i 0 iphnum i exeFormat segmentList i offsetInFile proHeader offset exeFormat segmentList i lengthInFile proHeader fileSize exeFormat segmentList i startAddress proHeader vaddr exeFormat segmentList i sizeInMemory proHeader memSize exeFormat segmentList i protFlags proHeader flags proHeader return 0 2 编译 GeekOS 项目 project0 1 执行 make depend shell make depend 生成 depend mak 文件 2 执行 make shell make 成功之后再 build 目录下生成 fd img 和 disk img 文件 3 配置启动 Bochs 1 创建 bochs 配置文件 shell gedit bochsrc 2 在编辑器输入一下配置内容 romimage file BXSHARE BIOS bochs latest megs 8 boot a floppya 1 44 fd img status inserted ata0 master type disk mode flat path diskc img cylinders 0 log bochs out 桂林电子科技大学综合设计说明书用纸 第 10 页 3 保存 直接退出 gedit 4 5 运行结果 1 启动 bochs shell bochs f bochsrc 2 选择 begin simulation 3 结果 图 4 3 项目 1 运行结果 5 项目 2 的设计实现 5 1 项目设计目的 扩充 GeekOS 操作系统内核 使得系统能够支持用户级进程的动态创建和执行 5 2 项目设计目的 1 src GeekOS user c 文件中的函数 Spawn 其功能是生成一个新的用户级进程 2 src GeekOS user c 文件中的函数 Switch To User Context 调度程序在执行一 个新的进程前调用该函数以切换用户地址空间 3 src GeekOS elf c 文件中的函数 Parse ELF Executable 该函数的实现要求和 项目 1 相同 4 src GeekOS userseg c 文件中主要是实现一些为实现对 src GeekOS user c 中高 层操作支持的函数 Destroy User Context 函数的功能是释放用户态进程占用的内存资源 Load User Program 函数的功能通过加载可执行文件镜像创建新进程的 桂林电子科技大学综合设计说明书用纸 第 11 页 User Context 结构 Copy From User 和 Copy To User 函数的功能是在用户地址空间和内核地址空 间之间复制数据 在分段存储器管理模式下 只要段有效 调用 memcpy 函数就可以实现这 两个函数的功能 Switch To Address Space 函数的功能是通过将进程的 LDT 装入到 LDT 寄存器来激 活用户的地址空间 5 src GeekOS kthread c 文件中的 Start User Thread 函数和 Setup User Thread 函 数 Setup User Thread 函数的功能是为进程初始化内核堆栈 堆栈中是为进程首次进 入用户态运行时设置处理器状态要使用的数据 Start User Thread 是一个高层操作 该函数使用 User Context 对象开始一个新进 程 6 src GeekOS kthread c 文件中主要是实现用户程序要求内核进行服务的一些系统调 用函数定义 要求用户实现的有 Sys Exit 函数 Sys PrintString 函数 Sys GetKey Sys SetAttr Sys GetCursor Sys PutCursor Sys Spawn 函数 Sys Wait 函数和 Sys GetPID 函数 7 在 main c 文件中改写生成第一个用户态进程的函数调用 Spawn Init Process void 5 3 项目实现原理 1 GeekOS 进程状态及转换 图 5 1 GeekOS 进程转换 GeekOS 系统最早创建的内核进程有 Idle Reaper 和 Main 三个进程 它们由 Init Scheduler 函数创建 最先初始化一个核态进程 mainThread 并将该进程作为当前运 行进程 函数最后还调用 Start Kernel Thread 函数创建了两个系统进程 Idle 和 桂林电子科技大学综合设计说明书用纸 第 12 页 Reaper 所以 Idle Reaper 和 Main 三个进程是系统中最早存在的进程 2 GeekOS 的用户态进程 在 GeekOS 中为了区分用户态进程和内核进程 在 Kernel Thread 结构体中设置了一 个字段 userContext 指向用户态进程上下文 对于内核进程来说 这个指针为空 而用 户态进程都拥有自己的用户上下文 User Context 因此 在 GeekOS 中要判断一个进程 是内核进程还是用户态进程 只要通过 userContext 字段是否为空来判断就可以了 图 5 2 用户进程 3 用户进程空间 每个用户态进程都拥有属于自己的内存段空间 如 代码段 数据段 堆栈段等 每 个段有一个段描述符 segment descriptor 并且每个进程有一个段描述符表 Local Descriptor Table 用于保存该进程的所有段描述符 操作系统中还设置一个全局描述符 表 GDT Global Descriptor Table 用于记录了系统中所有进程的 ldt 描述符 图 5 3 用户进程空间 4 用户态进程创建 LDT 的步骤 1 调用函数 Allocate Segment Descriptor 新建一个 LDT 描述符 桂林电子科技大学综合设计说明书用纸 第 13 页 2 调用函数 Selector 新建一个 LDT 选择子 3 调用函数 Init Code Segment Descriptor 新建一个文本段描述符 4 调用函数 Init Data Segment Descriptor 新建一个数据段 5 调用函数 Selector 新建一个数据段选择子 6 调用函数 Selector 新建一个文本 可执行代码 段选择子 图 5 4 用户进程创建流程 5 4 项目实现过程 1 添加代码 1 修改 src GeekOS user c 文件中的函数 Spawn 其功能是生成一个用户级进程 2 src GeekOS user c 文件中的函数 Switch To User Contex 调度程序在执行一个新的进程前 调用该函数以切换用户地址空间 3 src GeekOS elf c 文件中的函数 Prase ELF Executable 该函数的实现要求和项目 1 相同 4 src GeekOS userseg c 文件主要是实现一些为实现对 src GeekOS user c 中高层操作支持的函 数 Destroy User Context 函数的功能是释放用户态进程占用的内存资源 桂林电子科技大学综合设计说明书用纸 第 14 页 Load User Program 函数的功能通过加载可执行文件镜像创建新进程的 User Context 结构 Copy From User 和 Copy To User 函数的功能是在用户地址空间和内核地址空间之间复制数 据 在分段存储器管理模式下 只要段有效 调用 memcpy 函数就可以实现这两个函数的功能 Switch To Address Space 函数的功能是通过将进程的 LDT 装入到 LDT 寄存器来激活用户的地址 空间 5 src GeekOS kthread c 文件中 Start User Thread 函数和 Setup User Thread 函数 Setup User Thread 函数的功能是为进程初始化内核堆栈 堆栈中是为进程首次进入用户态运行时 设置处理器状态要使用的数据 Start User Thread 是一个高层操作 该函数使用 User Context 对象开始一个新进程 6 src GeekOS kthread c 相关函数的修改 7 src GeekOS syscall c 文件中主要是实现用户程序要求内核进行服务的一些系统调用函数定义 要求用户实现的有 Sys Exit 函数 Sys PrintString 函数 Sys GetKey Sys SetAttr Sys GetCursor Sys PutCursor Sys Spawn 函数 Sys Wait 函数和 Sys GetPID 函 数 8 在 main c 文件中改写生成第一个用户态进程的函数调用 Spawn Init Process void user c 产生一个进程 用户态 int Spawn const char program const char command struct Kernel Thread pThread TODO Spawn a process by reading an executable from a filesystem int rc 标记各函数的返回值 为 0 则表示成功 否则失败 char exeFileData 0 保存在内存缓冲中的用户程序可执行文件 ulong t exeFileLength 可执行文件的长度 struct User Context userContext 0 指向 User Conetxt 的指针 struct Kernel Thread process 0 指向 Kernel Thread pThread 的指针 struct Exe Format exeFormat 调用 Parse ELF Executable 函数得到的可执行文件信息 if rc Read Fully program void goto fail if rc Parse ELF Executable exeFileData exeFileLength goto fail if rc Load User Program exeFileData exeFileLength goto fail 在堆分配方式下释放内存并再次初始化 exeFileData Free exeFileData exeFileData 0 开始用户进程 调用 Start User Thread 函数创建一个进程并使其进入准备运行队列 process Start User Thread userContext false if process 0 不是核心级进程 即为用户级进程 KASSERT process refCount 2 返回核心进程的指针 pThread process rc process pid 记录当前进程的 ID else 超出内存 project2 include geekos errno h rc ENOMEM return rc fail 如果新进程创建失败则注销 User Context 对象 if exeFileData 0 Free exeFileData 释放内存 if userContext 0 Destroy User Context userContext 销毁进程对象 return rc 切换至用户上下文 void Switch To User Context struct Kernel Thread kthread struct Interrupt State state TODO Switch to a new user address space if necessary static struct User Context s currentUserContext last user context used extern int userDebug struct User Context userContext kthread userContext 指向 User Conetxt 的指针 并初始化为 准备切换的进程 KASSERT Interrupts Enabled if userContext 0 userContext 为 0 表示此进程为核心态进程就不用切换地址空间 return if userContext s currentUserContext ulong t esp0 if userDebug Print A p n kthread Switch To Address Space userContext 为用户态进程时则切换地址空间 esp0 ulong t kthread stackPage PAGE SIZE if userDebug Print S lx n esp0 新进程的核心栈 桂林电子科技大学综合设计说明书用纸 第 16 页 Set Kernel Stack Pointer esp0 设置内核堆栈指针 New user context is active s currentUserContext userContext elf c copy project1 userseg c 需在此文件各函数前增加一个函数 此函数的功能是按给定的大小创建一个用户级进程上下文 具体 实现如下 函数功能 按给定的大小创建一个用户级进程上下文 static struct User Context Create User Context ulong t size struct User Context UserContext size Round Up To Page size UserContext struct User Context Malloc sizeof struct User Context 为用户态进程 if UserContext 0 UserContext memory Malloc size 为核心态进程 else goto fail 内存为空 if 0 UserContext memory goto fail memset UserContext memory 0 size UserContext size size 以下为用户态进程创建 LDT 段描述符表 新建一个 LDT 描述符 UserContext ldtDescriptor Allocate Segment Descriptor if 0 UserContext ldtDescriptor goto fail 初始化段描述符 Init LDT Descriptor UserContext ldtDescriptor UserContext ldt NUM USER LDT ENTRIES 新建一个 LDT 选择子 UserContext ldtSelector Selector KERNEL PRIVILEGE true Get Descriptor Index UserContext ldtDescriptor 新建一个文本段描述符 Init Code Segment Descriptor 桂林电子科技大学综合设计说明书用纸 第 17 页 新建一个数据段 Init Data Segment Descriptor 新建数据段和文本段选择子 UserContext csSelector Selector USER PRIVILEGE false 0 UserContext dsSelector Selector USER PRIVILEGE false 1 将引用数清 0 UserContext refCount 0 return UserContext fail if UserContext 0 if UserContext memory 0 Free UserContext memory Free UserContext return 0 摧毁用户上下文 void Destroy User Context struct User Context userContext TODO Destroy a User Context KASSERT userContext refCount 0 Free the context s LDT descriptor Free Segment Descriptor userContext ldtDescriptor Free the context s memory Disable Interrupts Free userContext memory Free userContext Enable Interrupts 释放占用的 LDT Free Segment Descriptor userContext ldtDescriptor userContext ldtDescriptor 0 释放内存空间 Free userContext memory userContext memory 0 释放 userContext 本身占用的内存 Free userContext userContext 0 桂林电子科技大学综合设计说明书用纸 第 18 页 int Load User Program char exeFileData ulong t exeFileLength struct Exe Format exeFormat const char command struct User Context pUserContext TODO Load a user executable into a user memory space using segmentation int i ulong t maxva 0 要分配的最大内存空间 unsigned numArgs 进程数目 ulong t argBlockSize 参数块的大小 ulong t size argBlockAddr 参数块地址 struct User Context userContext 0 计算用户态进程所需的最大内存空间 for i 0 i numSegments i elf h struct Exe Segment segment ulong t topva segment startAddress segment sizeInMemory FIXME range check if topva maxva maxva topva Get Argument Block Size command 获取参数块信息 size Round Up To Page maxva DEFAULT USER STACK SIZE 用户进程大小 参数块总大小 进程堆栈大小 8192 argBlockAddr size size argBlockSize userContext Create User Context size 按相应大小创建一个进程 if userContext 0 如果为核心态进程 return 1 for i 0 i numSegments i struct Exe Segment segment 根据段信息将用户程序中的各段内容复制到分配的用户内存空间 memcpy userContext memory segment startAddress exeFileData segment offsetInFile segment lengthInFile 格式化参数块 Format Argument Block userContext memory argBlockAddr numArgs argBlockAddr command 初始化数据段 堆栈段及代码段信息 userContext entryAddr exeFormat entryAddr userContext argBlockAddr argBlockAddr userContext stackPointerAddr argBlockAddr 将初始化完毕的 User Context 赋给 pUserContext pUserContext userContext return 0 成功 将用户态的进程复制到内核缓冲区 bool Copy From User void destInKernel ulong t srcInUser ulong t bufSize 桂林电子科技大学综合设计说明书用纸 第 19 页 TODO Copy memory from user buffer to kernel buffer struct User Context UserContext g currentThread userContext check if memory if validated if Validate User Memory UserContext srcInUser bufSize return false user kernel memcpy destInKernel UserContext memory srcInUser bufSize return true 将内核态的进程复制到用户态 bool Copy To User ulong t destInUser void srcInKernel ulong t bufSize TODO Copy memory from kernel buffer to user buffer struct User Context UserContext g currentThread userContext check if memory if validated if Validate User Memory UserContext destInUser bufSize return false kernel user memcpy UserContext memory destInUser srcInKernel bufSize return true 切换到用户地址空间 void Switch To Address Space struct User Context userContext TODO Switch to user address space using segmentation LDT ushort t ldtSelector userContext ldtSelector Switch to the LDT of the new user context asm volatile lldt 0 a ldtSelector kthread c 添加头文件 include 创建一个用户进程 static void Setup User Thread struct Kernel Thread kthread struct User Context userContext TODO Create a new thread to execute in user mode ulong t eflags EFLAGS IF unsigned csSelector userContext csSelector CS 选择子 unsigned dsSelector userContext dsSelector DS 选择子 Attach User Context kthread userContext 初始化用户态进程堆栈 使之看上去像刚被中断运行一样 分别调用 Push 函数将以下数据压入堆栈 Push kthread dsSelector 数据选择子 Push kthread userContext stackPointerAddr 堆栈指针 Push kthread eflags Eflags Push kthread csSelector 文本选择子 桂林电子科技大学综合设计说明书用纸 第 20 页 Push kthread userContext entryAddr 程序计数器 Push kthread 0 错误代码 0 Push kthread 0 中断号 0 初始化通用寄存单元 将 ESI 用户传递参数块地址 Push kthread 0 eax Push kthread 0 ebx Push kthread 0 edx Push kthread 0 edx Push kthread userContext argBlockAddr esi Push kthread 0 edi Push kthread 0 ebp 初始化数据段寄存单元 Push kthread dsSelector ds Push kthread dsSelector es Push kthread dsSelector fs Push kthread dsSelector gs 开始用户进程 struct Kernel Thread Start User Thread struct User Context userContext bool detached TODO Start user thread struct Kernel Thread kthread Create Thread PRIORITY USER detached 为用户态进程 if kthread 0 Setup User Thread kthread userContext Make Runnable Atomic kthread return kthread syscall c 需在此文件别的函数前增加一个函数 函数名为 Copy User String 它被函数 Sys PrintString 调用 具体实现如下 static int Copy User String ulong t uaddr ulong t len ulong t maxLen char pStr int rc 0 char str 超过最大长度 if len maxLen return EINVALID 为字符串分配空间 str char Malloc len 1 if 0 str rc ENOMEM 桂林电子科技大学综合设计说明书用纸 第 21 页 goto fail 从用户空间中复制数据 if Copy From User str uaddr len rc EINVALID Free str goto fail str len 0 成功 pStr str fail return rc static int Sys Exit struct Interrupt State state TODO Exit system call Exit state ebx static int Sys PrintString struct Interrupt State state TODO PrintString system call int rc 0 返回值 uint t length state ecx 字符串长度 uchar t buf 0 if length 0 Copy string into kernel 将字符串复制到内核 if rc Copy User String state ebx length 1023 char Write to console 将字符串打印到屏幕 Put Buf buf length done if buf 0 Free buf return rc static int Sys GetKey struct Interrupt State state TODO GetKey system call return Wait For Key 返回按键码 keyboard c Wait For Key static int Sys SetAttr struct Interrupt State state TODO SetAttr system call 桂林电子科技大学综合设计说明书用纸 第 22 页 Set Current Attr uchar t state ebx return 0 stat

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论