Linux 第六週實驗

姬夢馨node

原創博客linux

《Linux內核分析》MOOC課程http://mooc.study.163.com/course/USTC-1000029000c#

一.進程控制塊PCB——task_struct

    1.操做系統的三大管理功能包括:進程管理、內存管理、 文件系統。bash

    2.PCB task_struct中包含:進程狀態、進程打開的文件、進程優先級信息dom

    3: 進程的狀態不一樣於操做系統函數

    一個即在的進程調用fork建立一個新的進程。
    進程被高優先級搶佔。
    do_exit 進程退出。
    事件發生或資源可用,可被喚醒進入隊列。
    TASK_RUNNING具體是就緒仍是執行,要看系統當前的資源分配狀況

  

4.函數的分析與理解ui

        struct task_struct {          :運行狀態

volatile long state; /* -1 unrunnable, 0 runnable, >0 stopped */ void *stack; :內核堆棧;進程運行堆棧. atomic_t usage; unsigned int flags; :進程標識符 unsigned int ptrace; #ifdef CONFIG_SMP :條件編譯,多處理器 struct llist_node wake_entry; int on_cpu; struct task_struct *last_wakee; unsigned long wakee_flips; unsigned long wakee_flip_decay_ts; int wake_cpu; #endif
	struct list_head tasks;        雙向進程鏈表
         #ifdef CONFIG_SMP
	struct plist_node pushable_tasks;
	struct rb_node pushable_dl_tasks;
        #endif
	struct mm_struct *mm, *active_mm;  地址空間
        #ifdef CONFIG_COMPAT_BRK
	unsigned brk_randomized:1;
       #endif

  

        struct task_struct __rcu *parent; /* recipient of SIGCHLD, wait4() reports         
         /*    進程父子關係
	 * children/sibling forms the list of my natural children
	 */
	struct list_head children;	/* list of my children */
	struct list_head sibling;	/* linkage in my parent's children list */
	struct task_struct *group_leader;	/* threadgroup leader */

  

 

/* CPU-specific state of this task */    CPU相關狀態,進程切換
	struct thread_struct thread
/* filesystem information */             文件相關,打開描述列表
	struct fs_struct *fs; 
/* open file information */
	struct files_struct *files;
/* namespaces */                         調用                    
	struct nsproxy *nsproxy;
/* signal handlers */                    信號處理
    struct signal_struct *signal;
    struct sighand_struct *sighand;

二:進程的建立

1. forkthis

fork系統調用在父進程和子進程各返回一次
子進程中返回的是0,父進程中返回值是子進程的pid。

2. 建立一個新進程在內核中的執行過程atom

fork、vfork和clone三個系統調用均可以建立一個新進程,並且都是經過調用do_fork來實現進程的建立。
建立新進程是經過複製當前進程實現的。
do_fork主要是複製了父進程的task_struct,獲得子進程.
do_fork()
  • 調用copy_process,將當前進程複製一份出來給子進程,而且爲子進程設置相應地上下文信息。
  • 調用wake_up_new_task,將子進程放入調度器的隊列中,此時的子進程就能夠被調度進程選中運行。
要修改複製過來的進程數據,好比pid、進程鏈表等。

3. 子進程系統調用處理過程spa

   fork出來的子進程是從ret_from_fork開始執行的,而後跳轉到syscall_exit,從系統調用中返回。

 

三:實踐    使用gdb跟蹤分析一個fork系統調用內核處理函數sys_clone

1. 啓動MenuOS

2.gdb調試fork命令 : qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S

 

3.編譯內核,能夠看到fork命令

 

 

4.設置斷點

 

5.  調試結果

 

停在了父進程

 

 

總結:

Linux經過複製父進程來建立一個新進程,經過調用do_ fork來實現併爲每一個新建立的進程動態地分配一個task_ struct結構。

子進程是從ret_ from_ fork開始執行的。

相關文章
相關標籤/搜索