linux核心 程序棧執行緒棧

2021-10-21 20:18:03 字數 1173 閱讀 8931

程序使用者空間的管理在task_struct 的mm_struct *mm成員中體現, mm中的成員定義了使用者空間的布局情況如圖一。 使用者空間的棧起始於stack_top, 如果設定了pf_randomize,則起始點會減少乙個小的隨機量,每個體系結構都必須定義stack_top, 大多數都設定為task_size, 在32位機上該值為0xc0000000。經過隨機處理後,程序棧的起始位址將存放在mm->start_stack中,可以通過cat /proc/***/stat 檢視。

如圖,棧從上而下擴充套件,而用於記憶體對映的區域起始於mm->mmap_base,mm->mmap_base通過呼叫mmap_base函式來初始化,為了確保棧不與mmap區域不發生衝突,兩者之間設定了乙個安全間隙。

執行緒包含了表示程序內執行環境必需的資訊,其中包括程序中標示執行緒的執行緒id,一組暫存器值,棧,排程優先順序和策略,訊號遮蔽字,errno變數以及執行緒私有資料。程序的所有資訊對該程序的所有執行緒都是共享的,包括可執行的程式文字,程式的全域性記憶體和堆記憶體,棧以及檔案描述符,所以執行緒的mm_struct *mm指標變數和所屬程序的mm指標變數相同。

在建立執行緒的時候,可以通過pthread_attr_t來初始化執行緒的屬性,包括執行緒的棧布局資訊,如棧起始位址stackaddr,棧大小stacksize。可以通過pthread_attr_setguardsize初始化執行緒棧末尾之後用以避免棧溢位的緩衝區的大小,如果應用程式溢位到此緩衝區中,這個錯誤可能會導致 sigse** 訊號被傳送給該執行緒, 從而造成段錯誤,緩衝區預設設定為pagesize個位元組。因為執行緒的mm->start_stack和所屬程序相同,所以執行緒棧的起始位址並沒有存放在task_struct中,應該只是使用attr中的stackaddr,來初始化task_struct->thread-> sp(sp指向struct pt_regs物件,該結構體用於儲存使用者程序或者執行緒的暫存器現場)。

執行緒棧的空間開闢在所屬程序的堆區,執行緒與其所屬的程序共享程序的使用者空間,所以執行緒棧之間可以互訪。執行緒棧的起始位址和大小存放在pthread_attr_t 中,棧的大小並不是用來判斷棧是否越界,而是用來初始化避免棧溢位的緩衝區的大小(或者說安全間隙的大小)

ulimit -s可以檢視執行緒棧大小;程序棧一般要比執行緒棧大2m左右,不是固定值

程序核心棧 使用者棧

1.程序的堆疊 核心在建立程序的時候,在建立task struct的同事,會為程序建立相應的堆疊。每個程序會有兩個棧,乙個使用者棧,存在於使用者空間,乙個核心棧,存在於核心空間。當程序在使用者空間執行時,cpu堆疊指標暫存器裡面的內容是使用者堆疊位址,使用使用者棧 當程序在核心空間時,cpu堆疊指標...

程序核心棧 使用者棧

1.程序的堆疊 核心在建立程序的時候,在建立task struct的同事,會為程序建立相應的堆疊。每個程序會有兩個棧,乙個使用者棧,存在於使用者空間,乙個核心棧,存在於核心空間。當程序在使用者空間執行時,cpu堆疊指標暫存器裡面的內容是使用者堆疊位址,使用使用者棧 當程序在核心空間時,cpu堆疊指標...

執行緒棧和程序棧

pthread create 建立執行緒時,若不指定分配堆疊大小,系統會分配預設值,通過命令檢視方法如下 上面的單位為 kb,所以,執行緒預設堆疊大小為 8m。也可以在終端下通過 ulimit s value 用來重新設定 stack 大小。一般來說,預設堆疊大小為 8388608,堆疊最小為 16...