Linux如何知道當前進程的ID

在應用程序中可以通過getpid這個系統調用來獲得當前進程的pid,在內核中可以通過current來獲取當前進程的相關信息。而getpid這個系統調用實際上在內核中也是通過current來獲取進程pid的,那麼current是怎麼來的呢?


其實,current是根據當前的棧指針計算得來的(具體計算方法這裏不詳細描述了)。棧指針是在進入內核時設置的,例如,應用程序調用getpid系統調用,進入內核後需要設置棧指針等,但是棧指針的值需要依據當前進程來獲得,而棧未設置便不能使用current,怎麼獲得當前進程的內核棧地址呢?


原來,在GDT中有一個任務狀態段,這個段的esp字段存儲了當前進程的棧指針,因爲每次進程切換時內核都把當前進程的內核棧指針保存到esp字段,所以讀取esp字段就可以獲得當前進程的內核棧地址了。


PS:在Intel的設計中,每一個進程都有自己的TSS段,但是Linux內核卻只是爲每個CPU核心建立了TSS段,這樣做簡單有效。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章