exitCode = Join(kthread); Disable_Interrupts(); return exitCode; }
g. Sys_GetPID函数:
static int Sys_GetPID(struct Interrupt_State* state) {
//TODO(\ return g_currentThread->pid; }
h. Copy_User_String函数:
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; fail:
return rc; }
六、 系统编译运行的原理及结果
make是一个非常重要的编译工具,通过编写实现项目需要的功能代码,即可使用make工具对项目进行编译。然而使用make工具需要用到makefile工具做辅助,方便多个程序代码的编译。使用make和makefile可以大大提高工程的编译效率。Make的工作流程为:
1) 输入make命令,make会查找当前目录下名为makefile的文件。
2) 从makefile文件中找到第一个目标文件。如果该没标不存在或是它所依赖的文件的
修改时间比当前的修改时间要新,则执行makefile后面所定义的命令来生成目标文
件。
3) 如果所依赖的文件不存在或者其依赖的其他文件已经修改,则先去生成所依赖的文
件,如此渐进的执行。 编译项目过程为,先进入到项目的build目录,使用make depend生成depend.mak文件,在执行make命令。若编程无误,则编译会成功,否则,会提示错误。若有出错提示,则应该根据错误信息,到相应的代码源文件修改。
调试项目时,先编辑bochs的配置文件,如bochsrc.txt等等。例如,项目0的bochsrc.txt的内容为:
config_interface: textconfig
vgaromimage: file=$BXSHARE/VGABIOS-lgpl-latest
romimage: file=$BXSHARE/BIOS-bochs-latest, address=0xf0000 megs: 8 boot: a
floppya: 1_44=fd.img, status=inserted log: ./bochs.out
keyboard_serial_delay: 250 keyboard_paste_delay: 100000 floppy_command_delay: 500 vga_update_interval: 300000 ips: 1000000 mouse: enabled=0
private_colormap: enabled=0 i440fxsupport: enabled=0
编辑完成后保存到项目的build目录下,即可进入build目录,通过bochs –f bochsrc.txt命令进行运行bochs调试。
通过编译调试,本实验的运行如下所示。
图4 项目0的运行结果
图5 项目1的运行结果界面
图6 项目2的运行结果界面
七、 总结
通过此次实验,本人由原来对操作系统只有一个粗浅的概念的认识的水平上升到对操作系统有比较深刻印象和理解的程度。不仅概念得到了进一步的理解,更是对操作系统框架有一个整体的认识。包括深入体会操作系统是怎么使用硬件系统的,PC机的启动原理,进程的相关概念和具体实现。
本次试验对于本人来说,可谓困难重重,因为之前都没有对操作系统做详细的研究,但克服了相应困难,总是有收获的。在困难中,本人受益匪浅。 参考文献
[1] 黄廷辉,王宇英.计算机操作系统实践教程.北京:清华大学出版社,2007. [2] 于渊.自己动手写操作系统.北京:电子工业出版社,2005.
[3] 孙钟秀,费翔林等.操作系统教程[第4版].北京:高等教育出版社,2007.
[4] 汤小丹,梁红兵等.计算机操作系统[第三版].西安:西安电子科技大学出版社,2007.