从整理上理解进程创建、可执行文件的加载和进程执行进程切换,重点理解分析fork、execve和进程切换

原创作品转载请注明出处 + https://github.com/mengning/linuxkernel/
学号 358
本次实验从整体上理解进程创建、可执行文件的加载和进程执行进程切换,重点理解分析fork、execve和进程切换

  • 阅读理解task_struct数据结构http://codelab.shiyanlou.com/xref/linux-3.18.6/include/linux/sched.h#1235;
  • 分析fork函数对应的内核处理过程do_fork,理解创建一个新进程如何创建和修改task_struct数据结构;
  • 使用gdb跟踪分析一个fork系统调用内核处理函数do_fork ,验证您对Linux系统创建一个新进程的理解,特别关注新进程是从哪里开始执行的?为什么从那里能顺利执行下去?即执行起点与内核堆栈如何保证一致。
  • 理解编译链接的过程和ELF可执行文件格式;
  • 编程使用exec*库函数加载一个可执行文件,动态链接分为可执行程序装载时动态链接和运行时动态链接;
  • 使用gdb跟踪分析一个execve系统调用内核处理函数do_execve ,验证您对Linux系统加载可执行程序所需处理过程的理解;
  • 特别关注新的可执行程序是从哪里开始执行的?为什么execve系统调用返回后新的可执行程序能顺利执行?对于静态链接的可执行程序和动态链接的可执行程序execve系统调用返回时会有什么不同?
  • 理解Linux系统中进程调度的时机,可以在内核代码中搜索schedule()函数,看都是哪里调用了schedule(),判断我们课程内容中的总结是否准确;
  • 使用gdb跟踪分析一个schedule()函数 ,验证您对Linux系统进程调度与进程切换过程的理解;
  • 特别关注并仔细分析switch_to中的汇编代码,理解进程上下文的切换机制,以及与中断上下文切换的关系;

阅读理解task_struct数据结构

http://codelab.shiyanlou.com/xref/linux-3.18.6/include/linux/sched.h#1235;
操作系统的三大管理功能包括:进程管理、内存管理、文件系统。在Linux中,task_struct其实就是通常所说的PCB。该结构定义位于:/include/linux/sched.h。PCB task_struct中包含:进程状态、进程打开的文件、进程优先级信息
task_struct结构体分析:

    volatile long state;  //进程的状态unsigned long flags; //调用fork时候给出的进程号long nice; //进程的基本时间片unsigned long policy; //进程的调度策略struct mm_struct *mm; //进程内存管理信息struct list_head run_list; //指向运行队列的指针unsigned long sleep_time; //进程的睡眠时间struct task_struct *next_task, *prev_task; //用于将系统中所有的进程连接成一个双向循环链表pid_t pid;//进程标识符,用来代表一个进程pid_t pgrp;//进程组标识,表示进程所属的进程组pid_t tty_old_pgrp;//进程控制终端所在的组标识pid_t session;//进程的会话标识pid_t tgid;struct list_head thread_group; //线程链表struct task_struct *pidhash_next;//用于将进程链入HASH表pidhashstruct task_struct **pidhash_pprev;wait_queue_head_t wait_chldexit; //供wait4()使用struct completion *vfork_done; // 供vfork() 使用unsigned long rt_priority;//实时优先级struct fs_struct *fs; //文件系统信息struct files_struct *files; //打开文件信息

分析fork函数对应的内核处理过程do_fork

Linux中创建进程一共有三个函数:fork,经常使用到的,创建子进程。vfork,同样也是常见子进程,区别在于父子进程共享地址空间,而且子进程先于父进程运行。clone,主要用于创建线程。而这三个函数最终都是利用do_fork来实现。
分析分析do_fork的代码代码

long do_fork(unsigned long clone_flags,unsigned long stack_start,unsigned long stack_size,int __user *parent_tidptr,int __user *child_tidptr)
{struct task_struct *p;int trace = 0;long nr;// ...// 复制进程描述符,返回创建的task_struct的指针p = copy_process(clone_flags, stack_start, stack_size,child_tidptr, NULL, trace);if (!IS_ERR(p)) {struct completion vfork


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部