linux內核導遊記

進程的內核視角


一個進程就是進程表中的一個表項,所以進程表是系統中最重要的數據結構,地位類似內存管理表和buffer cache。進程表中的每一項是一個struct task_struct數據結構,定義在文件include/linux/sched.h文件中。進程表是既是數組也是一個雙鏈表,物理上實現爲靜態指針數組,數組長度由定義在include/linux/tasks.h文件中的NR_TASKS常量指定,每個task_struct駐留在預留的內存頁中,通過 next_task和prev_task指針訪問元素數據。全局變量current指向當前正在運行的進程,current只被調度器修改。一個進程只能處於內核模式和用戶模式中之一種模式。用戶進程打主體運行在用戶模式,而系統調用運行在內核模式。進程使用的棧在用戶模式和內核模式也是存在很大區別的,內核模式的棧是固定大小,而用戶模式的棧是可以伸縮的。

 

創建和銷燬進程


UNIX系統通過fork系統調用創建一個進程,調用exit()或者接收一個信號結束一個進程。在Linux中,它們分別在kernel/fork.c和kernel/exit.c文件中被實現。Forking過程比較簡單,主要步驟如下

  • 獲取空白page保存task_struct
  • 查詢一個空的進程插槽
  • 獲取另一個空白page爲kernel_stack_page使用
  • 拷貝父進程的LDT到子進程中
  • 複製父進程的mmap信息
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章