minix代码解读.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
minix代码解读

Minix源码解读报告 学号:5100309002姓名:邢佳楠 以下是我这学期主要阅读过的minix源码内容,主要从几个比较重点的系统调用的实现入手,阅读的足迹涉及KERNEL、PM、VM、VFS和一点PFS: 系统的初始化进程:系统启动后,系统将提示选择多个image中一个进行处理。选择映像后,系统进入pre_init() (kernel/arch/i386/pre_init.c) ,做一些开机准备,之后,完成一些参数的设置,读入相应选择的映像。pre_init() 完成后,进入 mpx.S 中的 kernel_init 下的汇编代码。之后进入main() (kernel/main.c) 函数。在main中: (1) 初始化进程表,标记为空。进程结构 proc 在 kernel/proc.h 中定义。 (2) 初始化特权表。亦标记为空。特权表记录了进程对应的能够执行的命令,如能够使用的内存范围,能够使用的 I/O 地址,所使用的信号管理器,能够使用 Kernel_call 的权限等等。关于特权的配置,可以看 include/minix/priv.h 其中的常量 (3)初始化boot image所提供的一些默认的进程。按照先后次序一一进行初始化,将他们放进进程表中(复制数据),如果进程是IDLE, CLOCK, SYSTEM,或者根系统进程(即再生服务器),那么他们当前可被调度,否则,初始不应该被调度。对于再生服务器进程,作为系统进程且可以被抢占(这是所有系统服务的共性),另外,设置允许陷入等等。对于其它进程,暂时不允许运行。 (4)之后设置堆栈,内存映像,将 proc_ptr 指向当前进程,清除标记,入队,设置为可调度状态,开始调度。 (5)初始化中断、System Call数组等等 IPC的实现:在上一层,由库函数产生中断进入到kernel 中 (lib/libc/arch/ui386/rts/_ipc.S),具体没看,相关头文件主要是include/minix/ipc.h定义,在这个头文件里定义了 9 种消息类型以及 IPC 函数原型。 IPC具体由 do_ipc 函数完成 (kernel/proc.c)。同步的 IPC 由 do_sync_ipc 函数完成,接收的参数有发送者、发送的 flag、接受者、消息内容的指针,异步的IPC由mini_senda 完成(这部分没仔细看)。其中只有RECEIVE 接收 ANY 参数;对于其它如 SEND, SENDREC, NOTIFY 来说,必须指定一个 endpoint 作为对象。使用 isokendpt 检查该 endpoint 是否有效,并将其转换为 process number,如果有效返回 true。检查进程是否有权限执行相应的 call。对于 Kernel Call,只允许 SENDREC。然后执行相应的任务,如 mini_send(), mini_receive(), mini_notify()。 mini_send() 首先检查目的进程是否正在处于 block 状态等待这条消息,如果是,则向它复制信息 (caller-p_delivermsg),解锁这个进程;否则,则将发来信息的进程出队,block 它(置 RTS_SENDING 位)同时将这个进程放到目的进程的等待列表中。 mini_receive() 首先检查是否消息队列是否为空且是它想获取的消息,如果是则获取他,解锁caller;否则,再检查是否有异步消息发送(检查 MF_ASYNMSG),否则,block它(置RTS_RECEIVING位)。 mini_notify() 首先检查目的进程是否在等待消息,一个进程在执行 SENDREC 系统调用时可同时处于发送和接收状态。如果是则copy该消息,否则,加入到消息位图中(priv结构的s_notify_pending) 在block之前要调用deadlock函数检测是否会产生死锁。如果产生死锁,则返回该死锁长度。 完成 do_ipc 后,执行 switch_to_user 回到原来部分。 Fork()的实现 对于系统调用 fork(),用户进程执行 fork() 调用,将会进入到 lib/libc/posix/_fork.c 中定义的 fork(),执行系统调用 _syscall(PM_PROC_NR, FORK, m),向进程管理器(PM)发送一个消息创建一个新进程,以 sendrec 方式发送。消息传递到 PM 后,PM 执行了 do_fork() 函数 (servers/pm/forkexit.c)。do_fork() 函数检查进程表是否还有空间,接着,查看是否有 mproc 子进程的 slot,如果没有返回错误。接下来,执行 vm_fork(),向

文档评论(0)

qiwqpu54 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档