- 1、本文档共15页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
linux内核的内核执行流程讲述
简析linux内核的执行流程
进程0:Linux引导中创建的第一个进程,完成加载系统后,演变为进程调度、交换及存储管理进程进程1:init 进程,由0进程创建,完成系统的初始化. 是系统中所有其它用户进程的祖先进程
时钟中断设置
系统调用服务程序挂接
初始化缓冲区管理结构(在main.c中133行, buffer_init(buffer_memory_end)定义 fs/buffer.c)
初始化硬、软盘(main.c中134、135行,hd_init与floppy_init定义于kernel/blk_drv/hd.c和kernel/blk_drv/floppy.c)
开中断 (main.c中136行,sti())
第二步:以进程0为母本创建进程1,使进程1不仅仅具备进程0所拥有的能力,而且还能以文件的形式与外设进行数据交互。
流程是:
操作系统为进程0创建进程1做准备 main.c中137行,move_to_
user_mode()定义在include/asm/system.h,实现从
内核态到用户态。进程0正式开始执行,而后
执行main.c的138行的“if(!fork())”,开始创建
在进程槽中为进程1申请一个空闲位置并获取进程号
进程1,此时将执行unisted.h中的syscall0宏函数
,得到一个编号,对于fork函数,其值是2,具体
在这个程序中的第62行有定义,然后执行软中断
复制进程0的信息之前,先将一些数据压栈
,进入系统调用阶段,跳到内核态,执行 kernel/system_call.s中的代码,将一些寄存器的 值压栈后,通过刚才在unisted.h中给eax赋值
初步设置进程1管理结构 的2偏移值在系统调用sys_call_table 中找到sys_fork函数,跳到该函数执行。进 入后首先申请一个空闲位置并获取进程号。
这同样在system_call.s函数中的sys_fork
进程0创建进程1的过程中发生时钟中断 中的_find_copy_
process,再跳到该函数的定义处kernel/
fork.c中,后返回到sys_fork中,在
从中断返回 复制进程信息前,再将一些数据压栈,
此时有一个寄存器的值和前面的不一样,
那就是eax,此时是1,它从task[64]中
得到的。之后执行copy_process,跳到
调整进程1的管理结构 定义处kernel/fork.c中,设置进程1的
管理结构。假如此时发生时钟中断,系统
会响应并执行kernel/system_call.s函数
中的timer_interrupt定义处,先压栈后
设置进程1的线性地址空间及物理页面 进入kernel/sched.c
的do_timer函数,别忘了此时仍在进程
0执行,然后便发现时间片还没完,所以
跳出,并返回到ret_from_sys_call。这是
继续调整进程1的管理结构 在kernel/system_call.s中定义的,
接着直接将刚才的压栈数据出栈,继续完成
刚才创建进程1的任务,即在fork.c中继续
调整进程1的管理结构,同时设置进程
进程0准备切换到进程1 1的线性地址空间及物理页面,直到
执行到这条语句“p-state=TASK_
RUNNING;return last_pid;”,标志着
系统切换到进程1执行 进程1创建完成。后跳出copy_process.c
函数,返回到system_call.s,将压栈的
进程1开始执行 的寄存器值出栈,此时eax是1。后中断返回
,进程由从内核态变为用户态,即到了 unisted.h的“if(_res=0)”这条指令中,
_res的值就是eax的值,一判断成立,就返
进程1开始以数据块的形式操作硬盘 回该值。最后回到了main.c
的“if(!fork())”中,一判断不成立,跳出执 行下一条指令“for(;;)pause();”,同理
Pause函数也和fork函数一样,这里就不
将找到的缓冲块与请求项挂接 讲了,进入sys_pause()后将进程0
置为可中断等待状态,并调用在kernel
/sched.c定义的schedule()函数切换进程。
进程切换中断返回后执行了第一条语句
将请求项与硬盘处理函数挂接 是“if(_res=0)”,一判断,
刚存的eax值为0,返回到“if(!fork())”
判断为真,执行init()函数,这在main.c
定义。进入init.c后其程序执行流程见附录,
进行硬盘读盘前的工
文档评论(0)