网站大量收购闲置独家精品文档,联系QQ:2885784924

基于Linux源码分析.doc

  1. 1、本文档共4页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
基于Linux源码分析

Linux 源码分析 1. Linux进程概述 进程简单的说就是一个程序一次执行的过程,它是一个动态的概念。按照教科书上的定义,进程是程序执行的实例,是linux的基本调度单位。? 对于程序员来说,最重要的就是要区分进程和程序的区别,程序是指一段完成功能的代码,或者说是一个工具,它是一个静态的概念,而进程,它是动态的,比如,linux的vi编辑器,它就是一段在linux下用于文本编辑的工具,那么它是一个程序,而我们在linux终端中,可以分别开启两个vi编辑器的进程。一旦提到进程,我们的脑子里就应该产生——程序从代码的第一句动态的执行到最后一句这样的一个思路。? 一个进程由如下元素组成:? 1. 进程的当前上下文,即进程的当前执行状态;? 2. 进程的当前执行目录? 3. 进程访问的文件和目录? 4. 进程的访问权限,比如它的文件模式和所有权? 5. 内存和其他分配给进程的系统资源? 在linux系统中,内核使用进程来控制对CPU和其他系统资源的访问,并且使用进程来决定在CPU上运行哪个程序,运行多久以及采用什么特性运行它。内核的调度器负责在所有的进程间分配CPU执行时间,称为时间片(time slice),它轮流在每个进程分得的时间片用完后从进程那里抢回控制权。? OS会为每个进程分配一个唯一的整型ID,做为进程的标识号(pid)。进程除了自身的ID外,还有父进程ID(ppid),所有进程的祖先进程是同一个进程,它叫做init进程,ID为1,init进程是内核自检后的一个启动的进程。init进程负责引导系统、启动守护(后台)进程并且运行必要的程序。? 2.Linux进程源码分析 Linux 中有3 个系统调用fork、vfork 和clone 用来产生进程,在核心中分别对应sys_fork、sys_vfork 和sys_cloen,进一步都调用内部函数do_fork()完成,区别仅是调用do_fork()的参数不同。 do_fork 参数: unsigned long clone_flags: 特征参数 unsigned long stack_start: 子进程堆栈起始地址 struct pt_regs* regs: 寄存器结构指针 unsigned long stack_size: 堆栈容量,该参数未使用 int __user * parent_tidptr:父进程tid 指针 int __user * child_tidptr: 子进程tid 指针 sys_fork 参数: struct pt_regs* regs 调用do_fork 时格式: clone_flags = SIGCHLD:子进程结束(terminate)或停止(stop)时向父进程发送该信号 stack_start = regs-rsp:共用父进程堆栈,使用COW 机制进行复制 regs = regs stack_size = 0 parent_tidptr = NULL child_tidptr = NULL sys_vfork 参数: struct pt_regs* regs 调用do_fork 时格式: clone_flags = CLONE_VFORK | CLONE_VM | SIGCHLD:与父进程共用一个地址空间; 并且使父进程挂起进入等待状态,直至子进程释放地址空间,即结束或执行一个新程序; 其他与sys_fork 相同 sys_clone 参数: unsigned long clone_flags unsigned long newsp void __user* parent_tid void __user* child_tid struct pt_regs* regs 调用do_fork 时格式: stack_start = newsp ? : regs-rsp stack_start = 0 其它参数对应使用 下面分析do_fork()过程 1 pid = alloc_pidmap():分配一个空闲的pid 号 2 检测current-ptrace 标记,如果需要跟踪子进程,则在clone_flags 加入CLONE_PTRACE 标记 3 p = copy_process():创建进程描述字 I 如果clone_flags 同时带有CLONE_NEWNS 和CLONE_FS 标记则出错。CLONE_NEWNS 表 示使用新的命名空间(namespace);CLONE_FS 表示与父进程共享current-fs 结构,即fs_struct II 如果clone_flags 带有CLONE_THREAD 标记但没有CLONE_SIGHAND 标记则出错。 CLONE_THREAD:将子进程加入到父进程的线程组中,强制子进程共享父进程

文档评论(0)

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

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

版权声明书
用户编号:8130065136000003

1亿VIP精品文档

相关文档