国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

Linux 對進程的描述

系統 Linux
進程是操作系統種調度的實體,對進程擁有資源的描述稱為進程控制塊(PCB, Process Contrl Block)。

[[406262]]

進程是操作系統種調度的實體,對進程擁有資源的描述稱為進程控制塊(PCB, Process Contrl Block)。

通過 task_struct 描述進程

內核里,通過 task_struct 結構體來描述一個進程,稱為進程描述符 (process descriptor),它保存著支撐一個進程正常運行的所有信息。task_struct 結構體內容太多,這里只列出部分成員變量,感興趣的讀者可以去源碼 include/linux/sched.h頭文件查看。

  1. struct task_struct { 
  2.  
  3. #ifdef CONFIG_THREAD_INFO_IN_TASK 
  4.   /* 
  5.    * For reasons of header soup (see current_thread_info()), this 
  6.    * must be the first element of task_struct. 
  7.    */ 
  8.   struct thread_info        thread_info; 
  9. #endif 
  10.   volatile long state; 
  11.   void *stack; 
  12.   ...... 
  13.   struct mm_struct *mm; 
  14.   ...... 
  15.   pid_t pid; 
  16.   ...... 
  17.   struct task_struct *parent; 
  18.   ...... 
  19.   char comm[TASK_COMM_LEN]; 
  20.   ...... 
  21.   struct files_struct *files; 
  22.   ...... 
  23.   struct signal_struct *signal; 

task_struct 中的主要信息分類:

1.標示符:描述本進程的唯一標識符 pid,用來區別其他進程。

2.狀態:任務狀態,退出代碼,退出信號等

3.優先級:相對于其他進程的優先級

4.程序計數器:程序中即將被執行的下一條指令的地址

5.內存指針:包括程序代碼和進程相關數據的指針,還有和其他進程共享的內存塊的指針

6.上下文數據:進程執行時處理器的寄存器中的數據

7.I/O狀態信息:包括顯示的I/O請求,分配的進程I/O設備和進程使用的文件列表

8.記賬信息:可能包括處理器時間總和,使用的時鐘總和,時間限制,記帳號等

  • struct thread_info thread_info: 進程被調度執行的信息
  • volatile long state:-1是不運行的,=0是運行狀態,>0是停止狀態。下面是幾個比較重要的進程狀態以及它們之間的轉換流程。

  1. void *stack:指向內核棧的指針,內核通過 dup_task_struct 為每個進程都分配內核棧空間,并記錄在此。
  2. struct mm_struct *mm: 與進程地址空間相關的信息。

  • pid_t pid: 進程標識符
  • char comm[TASK_COMM_LEN]: 進程的名稱
  • struct files_struct *files: 打開的文件表
  • struct signal_struct *signal: 信號處理相關

task_struct, thread_info 和內核棧 sp 的關系

接著看下 thread_info 結構:

  1. struct thread_info { 
  2.         unsigned long           flags;          /* low level flags */ 
  3.         mm_segment_t            addr_limit;     /* address limit */ 
  4. #ifdef CONFIG_ARM64_SW_TTBR0_PAN 
  5.         u64                     ttbr0;          /* saved TTBR0_EL1 */ 
  6. #endif 
  7.         union { 
  8.                 u64             preempt_count;  /* 0 => preemptible, <0 => bug */ 
  9.                 struct { 
  10. #ifdef CONFIG_CPU_BIG_ENDIAN 
  11.                         u32     need_resched; 
  12.                         u32     count
  13. #else 
  14.                         u32     count
  15.                         u32     need_resched; 
  16. #endif 
  17.                 } preempt; 
  18.         }; 
  19. #ifdef CONFIG_SHADOW_CALL_STACK 
  20.         void                    *scs_base; 
  21.         void                    *scs_sp; 
  22. #endif 
  23. }; 

接著再來看下內核棧的定義:

  1. union thread_union { 
  2. #ifndef CONFIG_ARCH_TASK_STRUCT_ON_STACK 
  3.         struct task_struct task; 
  4. #endif 
  5. #ifndef CONFIG_THREAD_INFO_IN_TASK 
  6.         struct thread_info thread_info; 
  7. #endif 
  8.         unsigned long stack[THREAD_SIZE/sizeof(long)]; 
  9. }; 

當 CONFIG_THREAD_INFO_IN_TASK 這個配置打開的時候,則 thread_union 結構中只存在 stask 成員了。

內核在啟動的時候會在 head.S 里通過 __primary_switched 來做內核棧的初始化:

  1. SYM_FUNC_START_LOCAL(__primary_switched) 
  2.         adrp    x4, init_thread_union 
  3.         add     sp, x4, #THREAD_SIZE 
  4.         adr_l   x5, init_task 
  5.         msr     sp_el0, x5                      // Save thread_info 

將 init_thread_union 的地址保存到 x4,然后偏移 THREAD_SIZE 棧大小,用于初始化 sp。將 init_task 進程描述符地址賦值給 x5,并保存到 sp_el0。

下面再看下 init_thread_union 和 init_task 的定義:

  1. #include/linux/sched/task.h 
  2. extern union thread_union init_thread_union; 
  3.  
  4. #init/init_task.c 
  5. struct task_struct init_task 
  6.         __aligned(L1_CACHE_BYTES) 
  7. = { 
  8. #ifdef CONFIG_THREAD_INFO_IN_TASK 
  9.         .thread_info    = INIT_THREAD_INFO(init_task), 
  10.         .stack_refcount = REFCOUNT_INIT(1), 
  11. #endif 
  12. ..... 
  13.  }; 

故這三者的關系可以通過下圖描述:

如何獲取當前進程

內核中經常通過 current 宏來獲得當前進程對應的 struct task_sturct 結構,我們借助 current,結合上面介紹的內容,看下具體的實現。

  1. static __always_inline struct task_struct *get_current(void) 
  2.     unsigned long sp_el0; 
  3.   
  4.     asm ("mrs %0, sp_el0" : "=r" (sp_el0)); 
  5.   
  6.     return (struct task_struct *)sp_el0; 
  7.   
  8. #define current get_current() 

代碼比較簡單,可以看出通過讀取用戶空間棧指針寄存器 sp_el0 的值,然后將此值強轉成 task_struct 結構就可以獲得當前進程。(sp_el0 里存放的是 init_task,即 thread_info 地址,thread_info 又是在 task_sturct 的開始處,從而找到當前進程。)

 

責任編輯:武曉燕 來源: 人人都是極客
相關推薦

2009-12-17 14:43:47

紅旗Linux

2023-04-06 15:22:15

Linux進程系統

2020-02-07 18:16:01

進程線程底層原理

2010-05-26 15:03:51

2010-09-15 09:58:20

2010-07-19 18:04:23

SQL Server鎖

2009-11-13 09:28:35

2009-08-06 15:52:11

C#調用外部進程

2010-09-30 16:17:13

2010-05-28 11:14:39

MySQL全文索引限制

2010-09-08 13:31:24

2010-09-08 15:10:48

2010-04-27 16:18:26

Oracle數據字典

2010-05-26 13:50:15

MySQL備份

2010-07-19 16:17:41

SQL Server聚

2010-09-29 12:52:14

2011-03-30 11:28:31

SQL Server聚集索引

2010-09-26 16:25:17

網絡釣魚成功

2010-03-29 13:55:26

Oracle Mult

2010-05-12 16:47:54

MySQL 中文亂碼
點贊
收藏

51CTO技術棧公眾號

亚洲欧美另类久久久精品| 欧美黄色视屏| 日本中文字幕在线看| 天堂中文最新版在线中文| 国产电影一区在线| 91看片淫黄大片91| 国产福利电影一区二区三区| 日韩a在线播放| 国产欧美久久久精品影院| 一级片在线播放| 日韩av中文字幕在线| 久久成人福利| 狠狠色噜噜狠狠色综合久| 成人在线电影在线观看视频| 精品国产福利| 日本一区二区三区高清不卡| 欧美少妇另类| 美日韩丰满少妇在线观看| 欧美人妖视频| 亚洲一区二区三区欧美| 国产精品热久久久久夜色精品三区 | 爱啪视频在线观看视频免费| 日本久久91av| 秋霞成人午夜伦在线观看| 亚洲性图一区二区| 亚洲精品小视频| 激情婷婷亚洲| 男人天堂av片| 久久久精品国产免大香伊| 91高清在线观看视频| 成人精品福利视频| 蜜臀av一区二区在线观看 | 欧美日韩在线播放三区四区| 老司机在线精品视频| 国产精品美女诱惑| 精品国产老师黑色丝袜高跟鞋| 性欧美hd调教| 一本一本a久久| 欧美一区二区三区在线观看 | www.亚洲成人网| 亚洲人成在线观看网站高清| 精品一区在线| 日韩免费视频线观看| 欧美亚洲日本| 国产91在线视频| 国产偷v国产偷v亚洲高清| 成人免费黄色| www黄色日本| 欧美成人免费小视频| eeuss鲁片一区二区三区在线观看| 成人性生交大片免费看网站| 自拍偷拍99| 欧美极品在线播放| 国产三级欧美三级日产三级99 | 免费成人av在线播放| 日韩在线免费视频观看| 日韩精品一区二区三区中文字幕| 亚洲自拍另类欧美丝袜| 欧美日韩综合| 婷婷激情在线| 99久久精品费精品国产一区二区 | 亚洲欧美综合另类在线卡通| 久久亚洲资源中文字| 自拍偷拍一区二区三区| 亚洲欧美日韩国产成人精品影院| 国产亚洲人成a在线v网站| jizz欧美性11| 国产精选久久久久久| 成人免费黄色在线| 日韩美脚连裤袜丝袜在线| 日夜干在线视频| 日韩精品在线中文字幕| 97av在线影院| 欧美性xxxxx极品少妇| 高清视频一区二区| 老牛精品亚洲成av人片| 国产一二三区在线视频| www.激情网| 久久久精品一区二区三区| 动漫精品一区二区| 好看不卡的中文字幕| 99热这里有精品| 1stkiss在线漫画| 影音先锋成人资源网站| 日本免费一区二区三区视频观看| 日韩免费性生活视频播放| 亚洲一区二区三区四区中文字幕 | 亚洲自拍小视频| 色黄久久久久久| 欧美一级精品在线| 都市激情亚洲色图| 久久影院午夜论| 99亚洲伊人久久精品影院红桃| 91欧美极品| 欧美亚洲二区| 国产h片在线观看| 国产系列在线观看| 欧美亚洲日本| 精品视频在线观看一区二区| 久久96国产精品久久99软件| 最近2019免费中文字幕视频三 | 福利一区二区| 中文字幕在线直播| 超碰在线97国产| 麻豆蜜桃在线观看| 污视频网站在线免费| 日本在线人成| 激情在线小视频| 国产美女性感在线观看懂色av | 亚洲免费视频一区二区| 欧美成人vps| 欧美精品一区二区三区蜜桃| 欧美一级日韩一级| 国产亚洲va综合人人澡精品| 久久99精品视频| 国产不卡视频在线观看| 成人免费观看男女羞羞视频| 久久精品999| 26uuu色噜噜精品一区| 99精品久久只有精品| 久久久久久久久久久电影| 国产盗摄精品一区二区三区在线| 国产综合成人久久大片91| 国产激情精品久久久第一区二区| 国产精品一二三区| 亚洲色图清纯唯美| 在线观看亚洲精品视频| 精品日韩欧美一区二区| 久久夜色精品国产欧美乱| 欧美一区二区色| 美女黄毛**国产精品啪啪| 欧美a级黄色大片| 亚洲视频第二页| caoporn免费在线| 校园春色亚洲| 久久综合色占| 琪琪一区二区三区| 国产日韩欧美精品一区| 制服视频三区第一页精品| 精品国产一区二区三区四区在线观看 | 97在线观看免费高清视频| 欧美老女人性开放| 国产91精品在线| 欧洲亚洲精品久久久久| 欧美亚洲激情| 99在线观看免费视频精品观看| 久久久久久久久伊人| 欧美情侣在线播放| 久久久噜噜噜久久| 亚洲欧美日韩不卡| 少妇**av毛片在线看| 91在线导航| 免费成人高清在线视频theav| 日韩电影在线免费观看| 污片在线观看一区二区| 欧美激情二区三区| 久久精品欧美| 能在线观看av网站| 日本精品国产| 国产高清亚洲一区| 亚洲第一免费网站| 国产精成人品localhost| 丁香六月激情网| 国产在线xxx| 免费在线成人| 欧美成人三级在线| 欧美怡红院视频一区二区三区 | 青青草久久爱| 影音先锋在线一区| 亚洲一区二区三区自拍| 一区二区三区国产视频| 婷婷四房综合激情五月| 免费黄网站在线观看| 精品国产91| 午夜精品久久久久久久99樱桃| 欧美黑人又粗大| 在线免费视频一区| 猫咪成人在线观看| 中文字幕在线不卡一区| 欧美日韩国产va另类| 免费毛片网站在线观看| 四虎地址8848精品| 国产农村妇女精品| 3344国产精品免费看| 四虎4hutv紧急入口| 日产精品一区二区| 欧美日韩另类一区| 99电影在线观看| www.综合网.com| 国产精品白丝jk白祙喷水网站| 伊人久久久久久久久久久| 免费av手机在线观看| 在线视频婷婷| 狠狠色丁香婷婷综合| 色综合久久天天综线观看| eeuss鲁片一区| 视频精品一区二区三区| 91免费视频网址| 伊人伊成久久人综合网站| 欧美日韩日本网|