李治军操作系统实验二——系统调用总结

李治军操作系统实验二——系统调用总结

0、项目情况简介

本人大三,这学期开始学习操作系统,校内的课程目前仅涉及理论所以就在网上找了哈工大李志军老师的操作系统课自学。本文是个人对本次实验的一些总结。

1、实验内容

  • 在linux-0.11内核中添加两个系统调用,iam()whoami(),并编写简单的测试程序测试这两个接口
  • 两个接口要实现用户态和内核态的数据传输工作
  • 此为简述,详细的实验目的及内容见实验楼

2、实验步骤

  1. 新增API接口,iam.cwhoami.c
  2. unistd.h中增加两个接口对应的系统调用编号,ertern int __NR_iam 72和ertern int __NR_whoami 73
  3. 更改sys_call.s中的系统调用总数,nr_systerm_calls=74
  4. 将两个系统调用对应的sys_iam()sys_whoami() 添加到位于sys.h里的sys_call_table
  5. 在kernel文件夹下创建一个who.c文件,在里面实现sys_iam()和sys_whoami()
  6. 修改Makefile
  7. 使用make all命令编译linux-0.11编译内核
  8. 打开Bochs编译运行iam.cwhoami.c
  9. 在Bochs中运行***testlab.sh和testlab2.c***程序(程序在实验楼中已给出),得到分数
  10. 总结

3 、注意事项

  • 注意修改的unistd.h文件所在位置——oslab/hdc/usr/include/unistd.c
  • 进入hdc需要在oslab下使用命令——sudo ./mount-hdc
  • 注意iam.c和whoami.c需要添加到oslab/hdc/usr/root目录下,否则在bochs中编译会找不到文件
  • iam.c和whoami.c文件的编译运行都需要在Bochs中,即要在linux-0.11下使用**./run**命令打开Bochs虚拟机
  • 注意iam.c和whoami.c程序里添加__LIBRARY__时LIBRARY前后都是两个下划线,如果只有一个在Bochs中编译会报错

4、知识锦集

linux内核进行系统调用的过程

  1. 内核初始化时运行main.c,在main.c中调用了sched_init() 函数
  2. sched_init.c 中调用了set_system_gate()
  3. set_system_gate 是定义在system.h中的一个宏
#define set_system_gate(n,addr) \
    _set_gate(&idt[n],15,3,addr)
  1. set_system_gate_set_gate 将填写IDT(中段描述符表),其中就将system_call 写到0X80对应的中段描述符中,即中断0X80发生后,系统将自动调用函数system_call,进入系统内核
  2. system_call 定义在system_call.s 中,在这个纯汇编函数里有一句语句:call sys_call_table(, %eax, 4)
  3. sys_call_table 是一个函数指针数组,通过这个数组找到对应的系统调用(eax存放的就是对应的系统调用号)
  4. 出发真正的系统调用sys_XXXX()

本实验中的系统调用过程(以iam.c为例)

  1. iam.c 中的main.c 调用了iam()
  2. iam() 将系统调用号存入eax中,将iam() 中使用的参数放入其他寄存器并触发0X80断点,进入系统内核
  3. 由IDT可知触发0X80断点系统会自动调用system_call
  4. 通过system_call 中的* call sys_call_table(, %eax, 4)* 语句找到对应的系统调用——sys_iam()
  5. sys_iam() 中实现真正的系统调用

内核态和用户态的数据传输

李治军操作系统实验二——系统调用总结_第1张图片
本实验要在*sys_iam()和sys_whoami()中实现用户态和内核态的数据传输。如图,API函数(iam.c和whoami.c)属于用户态,而sys_whoami()和sys_iam()属于内核态,两者之间实现数据传输需要用到get_fs_byte()和put_fs_byte()*函数。
李治军操作系统实验二——系统调用总结_第2张图片
李治军操作系统实验二——系统调用总结_第3张图片

5、收获感想

这次实验总共完成费时九个小时,主要是两个地方的错误。一是iam.cwhoami.c的编译,在实验楼做实验时没有意识到要在Bochs中进行编译(充分证实了小白属性),花了很久各种找资料才找到;二是两个c文件中的__LIBRARY__前后下划线都少写了一个,导致_syscall1(int,iam,const char*,name)无法展开,在Bochs中编译怎么都通不过。想到这两个错误,我真是……
越是无法解决的错误越是出在小地方,以后还是要细心细心再细心。

你可能感兴趣的:(李治军操作系统,操作系统)