您的位置:首页 > 运维架构 > Linux

Linux内核分析(第六周)

2016-03-29 22:11 393 查看
进程的控制与创建

一、进程的描述

  1.操作系统内核的三大功能:进程管理(核心),内存管理,文件系统;

  2.状态:

      fork()                                         task_zombit(终止)

        task_running(就绪;但是没有运行)            task_running(正在运行)

                          task_Intertupt

                          task_Uninterrupt

  3.标识pid

  4.struct list_head 进程双向链表

   struct mm_struct 地址空间有关

二、进程的创建
1.概览
1. fork()用户态创建子进程
2. fork()在父进程和子进程中各返回一次
2.理解方法
1. fork()是一个系统调用
2. fork() vfork() clone()最终都可以在do_fork来实现进程的创建
3.复制当前进程实现创建新进程
3.浏览相关关键代码
1.复制、给新进程分配、修改PID、进程链表等;
2.sys_fork sys_clone sys_vfork 最终都return do_fork
3.alloc_thread_info_node 地址空间,分配实际内核空间
4.p=dup_init_task 复制进程
5.childregs= *current_pt_regs();复制内核堆栈
6.return_from_fork(返回用户态)
拷贝内核堆栈数据和指定新进程的第一条指令进程
4.gdb跟踪调试

三、实验

1.准备工作

  rm menu -fs

  clone xxxxxx

  cd menu

  mv test_fork.c

  make rootfs

2.目的

阅读理解task_struct数据结构;分析fork函数对应的内核处理过程sys_clone,理解创建一个新进程如何创建和修改task_struct数据结构;使用gdb跟踪分析一个fork系统调用内核处理函数sys_clone,验证对Linux系统创建的理解;进程是从哪里开始执行的;在 Linux 内核中,供用户创建进程的系统调用fork()函数的响应函数是 sys_fork()、sys_clone()、sys_vfork()。这三个函数都是通过调用内核函数 do_fork() 来实现的.

3.gdb跟踪调试

设置断点




b do_fork

b dup_task_struct

b copy_process

b copy_thread

b ret_from_fork

实验截图




task_struct数据库结构很庞大,Linux进程的状态与操作系统原理中描述的进程状态有所不同,比如就绪态和运行态都是TASK_RUNNING。简略的双向循环链表。程序创建的进程具有父子关系

系统调用内核处理函数sys_clone创建一个新进程,通过调用do_fork来实现进程的创建,Linux通过复制父进程的PCB来创建进程,再对其进行相应修改。

子进程在内核中fork返回,在内核中开始执行,当子进程开始运行的时候,其ret_from_fork将做一系列工作,然后返回到用户态。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: