zoukankan      html  css  js  c++  java
  • Linux内核分析06

    进程的描述和进程的创建

    一,进程的描述

    进程控制块PCB——task_struct (进程描述符),为了管理进程,内核必须对每个进程进行清晰的描述,进程描述符提供了内核所需了解的进程信息。

    struct task_struct数据结构很庞大,进程的标示pid。

    Linux进程的状态与操作系统原理中的描述的进程状态有所不同,task_running代表就绪和运行两种状态,取决于它是否获得CPU的控制权

    在这个庞大的数据结构里,所有进程链表struct list_head tasks,一个双向链表

    程序创建的进程具有父子关系,在进程调度中会用到,进程描述符中会有几个域用来表示这样的关系。

    Linux为每个进程分配一个8KB大小的内存区域,用于存放该进程两个不同的数据结构:Thread_info和进程的内核堆栈。

    二,进程的创建

    fork、vfork和clone三个系统调用都可以创建一个新进程,而且都是通过调用do_fork来实现进程的创建。    

    fork在父进程和子进程之间各返回一次。

    fork出的子进程从哪里开始执行? fork的进程给了一个系统调用,和传统系统调用创建进程过程时不同。ret_from_fork

    p指向的是ret_from_fork,所以是从这里开始执行的。
    复制内核堆栈的时候是复制的pt_regs,即只复制了SAVE_ALL相关的那一部分,即系统调用压栈的那一部分。
    pt_regs里面内容有:
    Entry(ret_from_fork):
    最终会跳转到syscall_exit,这之前的内核堆栈状态和syscall_call的一致,然后返回用户态,变成子进程的用户态。

    创建新进程通过复制已有进程来实现,子进程的许多数据结构需要修改,需要一个新的内核堆栈,该内核堆栈一部分也是从父进程复制过来的,以为需要返回进程。

    子进程的fork返回0,因为“childregs->ax = 0; ”。

    系统调用内核处理函数:sys_fork,sys_clone,sys_vfork

    复制的内核堆栈时只复制了内核堆栈最栈底的部分,例如:SAVE_ALL,int指令等。

    使用gdb跟踪创建新进程的过程

    各种函数:

     

    进程创建的分析

    1. 复制一个PCB——task_struct
    2. 要给新进程分配一个新的内核堆栈

      3.要修改复制过来的进程数据,比如pid、进程链表等,见copy_process内部。

    系统调用内核处理函数sys_fork,sys_vfrok,sys_clone,其实最终执行的都是do_fork

    do_fork里有:

    三,心得

    在Linux内核的分析里,线程被视作一种特殊的进程,和一般的操作系统里不同,进程的创建和调度都是关键的动作。

  • 相关阅读:
    div自适应高度
    jquery的几种ajax提交方式
    分页后获取的数据怎么横向显示
    ssh项目将搜索条件进行联动
    某平台反war3明图原理分析
    Kali 安装8812au网卡驱动
    eXeScope 注册机制破解
    数据结构稀疏矩阵
    PEcompact 3.X 脱壳
    数据结构算数表达式求值
  • 原文地址:https://www.cnblogs.com/KG35/p/5329850.html
Copyright © 2011-2022 走看看