0 00:00:00,000 --> 00:00:06,280 1 00:00:06,360 --> 00:00:10,880 接下来 我们看一下在实际代码当中 2 00:00:10,960 --> 00:00:15,560 一个系统调用的引用到最后的实现 3 00:00:15,600 --> 00:00:19,560 在这我们可以看到在我们ucore里头 4 00:00:19,600 --> 00:00:21,240 我这里演示的ucore 5 00:00:21,280 --> 00:00:23,720 实际上我们用的是ucore+代码 6 00:00:23,760 --> 00:00:28,440 和我们现在同学们做实验ucore会有一些区别 7 00:00:28,480 --> 00:00:32,640 为了有所区别 所以我在这演示的时候 8 00:00:32,680 --> 00:00:34,120 用的是ucore+ 9 00:00:34,160 --> 00:00:36,800 以便同学在里头做的时候需自己去找一遍 10 00:00:36,840 --> 00:00:40,560 在你那个系统里头他的函数的实现情况 11 00:00:40,600 --> 00:00:50,000 在这里一个例子 在这个例子就有一句去读文件 12 00:00:50,040 --> 00:00:54,320 在这里后面有参数 这是一个应用态的一个测试应例 13 00:00:54,360 --> 00:01:01,840 他在里面去访问的 我们看一下这read个函数 14 00:01:01,880 --> 00:01:04,080 他调用其他调用其他函数情况 15 00:01:04,120 --> 00:01:06,720 这有很多例子会调用read 16 00:01:06,760 --> 00:01:10,920 然后他会调sys read然后是sys call 17 00:01:10,960 --> 00:01:13,480 这两个函数在往下就没有了 18 00:01:13,520 --> 00:01:21,320 这个转过来到这sys read实际上就是转变成sys call 19 00:01:21,360 --> 00:01:25,520 然后这个时候你的函数功能变成这里一个参数 20 00:01:25,560 --> 00:01:31,000 后面内容都变 这是sys call函数 21 00:01:31,040 --> 00:01:33,920 然后sys call函数实现在哪 22 00:01:33,960 --> 00:01:37,960 实现在这 我们看到这是sys call实现 23 00:01:38,000 --> 00:01:42,560 前面有一些相应的参数获取 24 00:01:42,600 --> 00:01:44,280 然后对于我们来说 25 00:01:44,320 --> 00:01:49,800 我们需要关心代码是这段 26 00:01:49,840 --> 00:01:54,760 这是在X86情况下他的系统调用 27 00:01:54,800 --> 00:01:57,160 这是num是我们刚在PPT里看到的 28 00:01:57,200 --> 00:01:59,480 是他的系统调用的编号 29 00:01:59,520 --> 00:02:04,280 这是系统调用的中段号 这是系统调用 30 00:02:04,320 --> 00:02:07,240 到这我们从用户态的情况 31 00:02:07,280 --> 00:02:10,920 在往下就已经跟踪不到了 32 00:02:10,960 --> 00:02:14,120 我们转过身来在内核态 33 00:02:14,160 --> 00:02:15,960 内核态我们刚才在PPT里说 34 00:02:16,000 --> 00:02:22,600 他是从all trap到trap然后在我们这里我们先看trap 35 00:02:22,640 --> 00:02:26,320 这里头实际上就是从中段进来之后 36 00:02:26,360 --> 00:02:29,880 他填了一个数据结构叫trap free 37 00:02:29,920 --> 00:02:31,360 在这个数据结构当中 38 00:02:31,400 --> 00:02:36,000 是获取到了相应中段产生的一些信息 39 00:02:36,040 --> 00:02:41,120 他里面有我们说的中段号和相应寄存器的值 40 00:02:41,160 --> 00:02:50,960 到这就转到trap dispatch 这我们可以看到其中有一个sys call 41 00:02:51,000 --> 00:02:58,880 他会判断trap num是多少 42 00:02:58,920 --> 00:03:04,480 根据不同情况我们关心的是在这里的sys call 43 00:03:04,520 --> 00:03:07,520 如果说你是其他 比如说时钟终断 44 00:03:07,560 --> 00:03:10,600 那在这里他的时间代码在这 45 00:03:10,640 --> 00:03:15,360 我们关心到这 他到sys call这个函数 46 00:03:15,400 --> 00:03:21,360 这个函数我们看一下这是他函数调用图 47 00:03:21,400 --> 00:03:29,040 我们trap dispatch到这是sys call然后这个sys call实际下去之后 48 00:03:29,080 --> 00:03:32,840 在里面有很多内容 我们看直接代码 49 00:03:32,880 --> 00:03:45,760 这是sys call 到这来之后 他会转到sys read 50 00:03:45,800 --> 00:03:48,920 到这会去读取你的参数 51 00:03:48,960 --> 00:03:51,840 这实际上就是从系统调用进来之后 52 00:03:51,880 --> 00:03:55,000 获取他一二三 这三个参数 53 00:03:55,040 --> 00:03:59,840 然后这个时候转过之后变成sys write 54 00:03:59,880 --> 00:04:05,080 我们看到这来的时候 这是sys read到sys write 55 00:04:05,120 --> 00:04:10,040 然后再往下就是相应的实现了 56 00:04:10,080 --> 00:04:15,880 我们看在这sys write到这里最后下去之后 57 00:04:15,920 --> 00:04:22,760 我们带这里根据不同情况完成相应文件的读取工作 58 00:04:22,800 --> 00:04:26,480 在这里实际我在介绍中间还缺了一段 59 00:04:26,520 --> 00:04:33,480 就是从trap再往前那段 60 00:04:33,520 --> 00:04:40,680 和sys dispatch到sys read这段我在这没做展示 61 00:04:40,720 --> 00:04:43,280 希望大家下去之后能够把 62 00:04:43,320 --> 00:04:47,360 相应的整个从用户态到内核态 63 00:04:47,400 --> 00:04:49,400 然后到函数的实现 一直到返回 64 00:04:49,440 --> 00:04:51,520 把整个这条路分析明白 65 00:04:51,560 --> 00:04:55,480 那这样你就知道一个系统调用是如何实现的 66 00:04:55,520 --> 00:04:57,280 好今天的课就上到这里 下课