linux内核的内核执行流程讲述.doc

  1. 1、本文档共15页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 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)

shuwkb + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档