操作系统课设报告 桂林电子科技大学(5)

2019-04-14 15:56

桂林电子科技大学综合设计说明书用纸 第 19 页

bool Copy_To_User(ulong_t destInUser, void* srcInKernel, ulong_t bufSize) { //TODO(\

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(\

ushort_t ldtSelector= userContext->ldtSelector;/* Switch to the LDT of the new user context */ __asm__ __volatile__ (\

}

================= kthread.c =============== 添加头文件 #include ---------------------------------- //创建一个用户进程

/*static*/ void Setup_User_Thread(struct Kernel_Thread* kthread, struct User_Context* userContext) { //TODO(\ 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); //文本选择子

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 */

桂林电子科技大学综合设计说明书用纸 第 20 页

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(\

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; goto fail; }

//从用户空间中复制数据

if (!Copy_From_User(str, uaddr, len)){ rc = EINVALID; Free(str); goto fail; }

str[len] = '\\0'; //成功 *pStr = str;

桂林电子科技大学综合设计说明书用纸 第 21 页

fail:

return rc; }

-----------------------------------------

static int Sys_Exit(struct Interrupt_State* state) { //TODO(\ Exit(state->ebx); }

-----------------------------------------

static int Sys_PrintString(struct Interrupt_State* state) { //TODO(\ 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**) &buf)) != 0) goto done;

/* Write to console. 将字符串打印到屏幕 */

Put_Buf(buf, length); } done:

if (buf != 0) Free(buf); return rc; }

----------------------------------------------

static int Sys_GetKey(struct Interrupt_State* state) { //TODO(\

return Wait_For_Key(); //返回按键码keyboard.c/Wait_For_Key() }

---------------------------------------------

static int Sys_SetAttr(struct Interrupt_State* state)

{ //TODO(\

Set_Current_Attr((uchar_t) state->ebx); return 0; }

---------------------------------------------

static int Sys_GetCursor(struct Interrupt_State* state) { //TODO(\ int row, col;

Get_Cursor(&row, &col);

if (!Copy_To_User(state->ebx, &row, sizeof(int)) ||!Copy_To_User(state->ecx, &col, sizeof(int))) return -1; return 0; }

桂林电子科技大学综合设计说明书用纸 第 22 页

-----------------------------------------------

static int Sys_PutCursor(struct Interrupt_State* state) { //TODO(\

return Put_Cursor(state->ebx, state->ecx) ? 0 : -1; }

-----------------------------------------------

static int Sys_Spawn(struct Interrupt_State* state) { //TODO(\ int rc; //函数返回值 char *program = 0; //进程名称 char *command = 0; //用户命令

struct Kernel_Thread *process;

/* Copy program name and command from user space. */

if ((rc = Copy_User_String(state->ebx, state->ecx, VFS_MAX_PATH_LEN, &program)) != 0) {//从用户空间复制进程名称 goto fail; }

if(rc = Copy_User_String(state->edx, state->esi, 1023, &command)) != 0) {//从用户空间复制用户命令

goto fail; }

Enable_Interrupts(); //开中断

rc = Spawn(program, command, &process);//得到进程名称和用户命令后便可生成一个新进程 if (rc == 0) {//若成功则返回新进程ID号 KASSERT(process != 0); rc = process->pid; }

Disable_Interrupts();//关中断 fail://返回小于0的错误代码 if (program != 0) Free(program); if (command != 0) Free(command);

return rc; }

-----------------------------------------

static int Sys_Wait(struct Interrupt_State* state) { //TODO(\ int exitCode;

struct Kernel_Thread *kthread = Lookup_Thread(state->ebx); if (kthread == 0) return -12;

Enable_Interrupts();

exitCode = Join(kthread); Disable_Interrupts();

桂林电子科技大学综合设计说明书用纸 第 23 页

return exitCode;

}

---------------------------------------

static int Sys_GetPID(struct Interrupt_State* state) { //TODO(\ return g_currentThread->pid; }

================= main.c ================== static void Spawn_Init_Process(void) { //TODO(\ struct Kernel_Thread *pThread;

Spawn(\}

2.编译GeekOS项目project2

操作步骤同前,此处略。

5.5运行结果

操作步骤同前,此处略。 结果:

图 5.5 项目2运行结果

6 遇到问题及解决方法

虚拟系统在做计算机网络课设已经安装配置好,而在本次课设的各个软件安装上遇到了一些麻烦,安装顺序好像有讲究,如果没有首先安装NASM汇编器则安装其他软件时提示缺少系统包。Bochs安装过程也出现缺少很多系统包,通过挂载系统盘查询缺少的包,没有

桂林电子科技大学综合设计说明书用纸 第 24 页

的则去网上下,最后居然出现循环缺少的三个包,在网上找到一条命令同时安装三个包,具体过程由于没有截图和原网页已经不记得了。

在项目的操作过程,对代码的修改也比较容易出错,老师给的文档里具体有修改的方法。

7 课程设计总结

其实这次课设收获并不大,上学期的操作系统实验课要求并不高,我们在课后也没有太多的实践,以至于在实际操作上很欠缺,涉及到的具体操作步骤网上都有详细的介绍,代码也都有提供,只要稍微修改就可以用了。

不过通过这次课设还是对操作系统的进程调度,文件管理有了直观上的理解。项目2中涉及到进程,做的过程中也对进程有了一定了解。

在操作过程中思维一定要广,此路行不通要及时在网上查资料或者和同学交流,否则很容易浪费大把的时间在无用的琢磨。


操作系统课设报告 桂林电子科技大学(5).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:山东省高级人民法院民事审判工作会议纪要--房地产纠纷案件

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: