zoukankan      html  css  js  c++  java
  • Linux内核创建一个新进程的过程

    Linux内核创建一个新进程的过程

    20135224陈实 + 原创作品转载请注明出处 + 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000

    简介:

    pcb定义:进程所需的各种执行与数据信息头

    task_struct:一种数据结构,大致为:

    State,Scheduling Information,Identifiers,IPC:Inter_Process Communication,SMP AND SO ON.

    第一部分

    分析内核处理过程:

    fork(),调用进程的通用函数。

    long do_fork(unsigned long clone_flags关键部分:
       { p = copy_process(clone_flags, stack_start, stack_size,
                 child_tidptr, NULL, trace);}

    copy_process(),各种资源的初始化。

    p = dup_task_struct(current):调用dup_task_struct()为新进程创建一个内核栈

    if (retval)语句群,复制共享进程的的各个部分

    dup_task_struct():

    tsk = alloc_task_struct_node(node)为task_struct开辟内存

    ti = alloc_thread_info_node(tsk, node)ti指向thread_info的首地址,同时也是系统为新进程分配的两个连续页面的首地址

    err = arch_dup_task_struct(tsk, orig)复制父进程的task_struct信息到新的task_struct里tsk->stack = ti;

    setup_thread_stack(tsk, orig)初始化thread info结构

    set_task_stack_end_magic(tsk)栈结束的地址设置数据为栈结束标示(for overflow detection)

    第二部分

    gdb跟踪sys_clone:

    利用GDB打开

    利用b设置断点

    断点分别设clone,fork,process,ret_from_fork等关键子函数

    thread中p值

     

    总结

    操作系统通过复制父进程来创建一个新进程,通过调用do_fork来实现----每个新创建的进程动态地分配一个task_struct结构

    为了把内核中的所有进程组织起来,Linux提供了几种组织方式,其中哈希表和双向循环链表方式是针对系统中的所有进程(包括内核线程),而运行队列和等待队列是把处于同一状态的进程组织起来

  • 相关阅读:
    你知道Synchronized底层实现原理嘛
    一篇搞定Java集合类原理
    lsp都要会的内存模型
    Sql Server 查询优化
    使用Windows的mstsc远程桌面连接到Ubuntu图形界面(AWS上安装的Ubuntu系统)
    AWS EC2实例Ubuntu系统设置root用户密码并使用root/ubuntu用户登录
    安装mysql.zip文件教程(包含常见问题修复)
    DevExpress GridControl小结
    C#开发必会
    C# 错误集锦
  • 原文地址:https://www.cnblogs.com/chuishi/p/5347436.html
Copyright © 2011-2022 走看看