《minix代码解读》word版

ID:25889682

大小:57.37 KB

页数:3页

时间:2018-11-23

《minix代码解读》word版_第1页
《minix代码解读》word版_第2页
《minix代码解读》word版_第3页
资源描述:

《《minix代码解读》word版》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、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)函

2、数。在main中:(1)初始化进程表,标记为空。进程结构proc在kernel/proc.h中定义。(2)初始化特权表。亦标记为空。特权表记录了进程对应的能够执行的命令,如能够使用的内存范围,能够使用的I/O地址,所使用的信号管理器,能够使用Kernel_call的权限等等。关于特权的配置,可以看include/minix/priv.h其中的常量(3)初始化bootimage所提供的一些默认的进程。按照先后次序一一进行初始化,将他们放进进程表中(复制数据),如果进程是IDLE,CLOCK,SYSTEM,或者根系统进程(即再生服务器),那么他们当前可被调度,否则,初始不应该被

3、调度。对于再生服务器进程,作为系统进程且可以被抢占(这是所有系统服务的共性),另外,设置允许陷入等等。对于其它进程,暂时不允许运行。(4)之后设置堆栈,内存映像,将proc_ptr指向当前进程,清除标记,入队,设置为可调度状态,开始调度。(5)初始化中断、SystemCall数组等等二、IPC的实现:在上一层,由库函数产生中断进入到kernel中(lib/libc/arch/ui386/rts/_ipc.S),具体没看,相关头文件主要是include/minix/ipc.h定义,在这个头文件里定义了9种消息类型以及IPC函数原型。IPC具体由do_ipc函数完成(kerne

4、l/proc.c)。同步的IPC由do_sync_ipc函数完成,接收的参数有发送者、发送的flag、接受者、消息内容的指针,异步的IPC由mini_senda完成(这部分没仔细看)。其中只有RECEIVE接收ANY参数;对于其它如SEND,SENDREC,NOTIFY来说,必须指定一个endpoint作为对象。使用isokendpt检查该endpoint是否有效,并将其转换为processnumber,如果有效返回true。检查进程是否有权限执行相应的call。对于KernelCall,只允许SENDREC。然后执行相应的任务,如mini_send(),mini_rece

5、ive(),mini_notify()。mini_send()首先检查目的进程是否正在处于block状态等待这条消息,如果是,则向它复制信息(caller->p_delivermsg),解锁这个进程;否则,则将发来信息的进程出队,block它(置RTS_SENDING位)同时将这个进程放到目的进程的等待列表中。mini_receive()首先检查是否消息队列是否为空且是它想获取的消息,如果是则获取他,解锁caller;否则,再检查是否有异步消息发送(检查MF_ASYNMSG),否则,block它(置RTS_RECEIVING位)。mini_notify()首先检查目的进程是

6、否在等待消息,一个进程在执行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)发

7、送一个消息创建一个新进程,以sendrec方式发送。消息传递到PM后,PM执行了do_fork()函数(servers/pm/forkexit.c)。do_fork()函数检查进程表是否还有空间,接着,查看是否有mproc子进程的slot,如果没有返回错误。接下来,执行vm_fork(),向VM发出消息。转到Servers/vm/fork.c中,VM拷贝一份父进程的vmproc信息到子进程的vmproc中,分配页表和相应的虚拟地址空间。Minix默认使用的是独立的I和D空间,即只需为进程分配其数据段和堆栈段的所需内

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
正文描述:

《《minix代码解读》word版》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、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)函

2、数。在main中:(1)初始化进程表,标记为空。进程结构proc在kernel/proc.h中定义。(2)初始化特权表。亦标记为空。特权表记录了进程对应的能够执行的命令,如能够使用的内存范围,能够使用的I/O地址,所使用的信号管理器,能够使用Kernel_call的权限等等。关于特权的配置,可以看include/minix/priv.h其中的常量(3)初始化bootimage所提供的一些默认的进程。按照先后次序一一进行初始化,将他们放进进程表中(复制数据),如果进程是IDLE,CLOCK,SYSTEM,或者根系统进程(即再生服务器),那么他们当前可被调度,否则,初始不应该被

3、调度。对于再生服务器进程,作为系统进程且可以被抢占(这是所有系统服务的共性),另外,设置允许陷入等等。对于其它进程,暂时不允许运行。(4)之后设置堆栈,内存映像,将proc_ptr指向当前进程,清除标记,入队,设置为可调度状态,开始调度。(5)初始化中断、SystemCall数组等等二、IPC的实现:在上一层,由库函数产生中断进入到kernel中(lib/libc/arch/ui386/rts/_ipc.S),具体没看,相关头文件主要是include/minix/ipc.h定义,在这个头文件里定义了9种消息类型以及IPC函数原型。IPC具体由do_ipc函数完成(kerne

4、l/proc.c)。同步的IPC由do_sync_ipc函数完成,接收的参数有发送者、发送的flag、接受者、消息内容的指针,异步的IPC由mini_senda完成(这部分没仔细看)。其中只有RECEIVE接收ANY参数;对于其它如SEND,SENDREC,NOTIFY来说,必须指定一个endpoint作为对象。使用isokendpt检查该endpoint是否有效,并将其转换为processnumber,如果有效返回true。检查进程是否有权限执行相应的call。对于KernelCall,只允许SENDREC。然后执行相应的任务,如mini_send(),mini_rece

5、ive(),mini_notify()。mini_send()首先检查目的进程是否正在处于block状态等待这条消息,如果是,则向它复制信息(caller->p_delivermsg),解锁这个进程;否则,则将发来信息的进程出队,block它(置RTS_SENDING位)同时将这个进程放到目的进程的等待列表中。mini_receive()首先检查是否消息队列是否为空且是它想获取的消息,如果是则获取他,解锁caller;否则,再检查是否有异步消息发送(检查MF_ASYNMSG),否则,block它(置RTS_RECEIVING位)。mini_notify()首先检查目的进程是

6、否在等待消息,一个进程在执行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)发

7、送一个消息创建一个新进程,以sendrec方式发送。消息传递到PM后,PM执行了do_fork()函数(servers/pm/forkexit.c)。do_fork()函数检查进程表是否还有空间,接着,查看是否有mproc子进程的slot,如果没有返回错误。接下来,执行vm_fork(),向VM发出消息。转到Servers/vm/fork.c中,VM拷贝一份父进程的vmproc信息到子进程的vmproc中,分配页表和相应的虚拟地址空间。Minix默认使用的是独立的I和D空间,即只需为进程分配其数据段和堆栈段的所需内

显示全部收起
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。
关闭