Linux中有多種棧,很容易弄暈,簡單說明一下:
1、用戶態棧:在進程用戶態地址空間底部,跟平時我們簡單和理解的一樣,就是虛擬地址空間中的一段,不多說~
2、內核棧:
跟用戶態棧是獨立的,在用戶態和內核態切換時,需要進行切換。
默認8k,可以通過內核配置項修改
跟thread_info結構放在一起,公用一個union:thread_union,
點擊(此處)折疊或打開
1. union thread_union {
2. struct thread_info thread_info;
3. unsigned long stack[THREAD_SIZE/sizeof(long)];
4. };
放在特殊的段中:__(".data.init_task")))
點擊(此處)折疊或打開
1. union thread_union init_thread_union
2. __attribute__((__section__(".data.init_task"))) =
3. { INIT_THREAD_INFO(init_task) };
點擊(此處)折疊或打開
1. ENTRY(stack_start)
2. .long init_thread_union+THREAD_SIZE
3. .long __BOOT_DS
默認跟中斷棧共享,可以通過內核配置項修改
屬於進程,即每個進程都有自己的內核棧
3、中斷棧:
默認跟內核棧共享
與內核棧中的內容獨立,相互不可見
中斷、異常、軟中斷使用此棧
使用被打斷的進程的內核棧