自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Linux系統(tǒng)堆棧講解

運(yùn)維 系統(tǒng)運(yùn)維
Linux系統(tǒng)經(jīng)過(guò)長(zhǎng)時(shí)間的發(fā)展,很多用戶都很了解Linux系統(tǒng)了,這里我發(fā)表一下Linux系統(tǒng)中共使用了四種堆棧個(gè)人理解,和大家討論討論。

Linux系統(tǒng)經(jīng)過(guò)長(zhǎng)時(shí)間的發(fā)展,很多用戶都很了解Linux系統(tǒng)了,這里我發(fā)表一下Linux系統(tǒng)中共使用了四種堆棧個(gè)人理解,和大家討論討論。

一    系統(tǒng)引導(dǎo)初始化臨時(shí)使用的堆棧

二    進(jìn)入保護(hù)模式后提供內(nèi)核程序始化使用的堆棧,該堆棧也是后來(lái)任務(wù)0使用的用戶態(tài)堆棧

三    每個(gè)任務(wù)通過(guò)系統(tǒng)調(diào)用,執(zhí)行內(nèi)核程序時(shí)使用的堆棧,稱之為任務(wù)的內(nèi)核態(tài)堆棧,每個(gè)任務(wù)都有自己獨(dú)立的內(nèi)核態(tài)堆棧

四    任務(wù)在用戶態(tài)執(zhí)行的堆棧,位于任務(wù)(進(jìn)程 )邏輯地址空間近末端處
使用多個(gè)?;蛟诓煌闆r下使用不同棧的主要原因

(一)由于從實(shí)模式進(jìn)入保護(hù)模式,使得CPU對(duì)內(nèi)存尋址訪問(wèn)方式發(fā)生了變化,因此需要重新設(shè)置堆棧區(qū)域

(二) 為了解決不同CPU特權(quán)級(jí)共享使用堆棧帶來(lái)的保護(hù)問(wèn)題,執(zhí)行0級(jí)的內(nèi)核代碼和執(zhí)行3級(jí)的用戶代碼需要使用不同的棧。當(dāng)一個(gè)任務(wù)進(jìn)入內(nèi)核態(tài)運(yùn)行時(shí),就會(huì)使用其TSS段中給出的特權(quán)級(jí)0的堆棧指針tss.ss0.tss.esp0,即內(nèi)核棧,原用戶棧指針會(huì)保存在內(nèi)核棧中,而當(dāng)從內(nèi)核態(tài)返回用戶態(tài)時(shí),就會(huì)恢復(fù)使用用戶態(tài)的堆棧
以下分別說(shuō)明。

開(kāi)機(jī)初始化時(shí)(bootsect.s,setup.s)
當(dāng)bootsect代碼被ROM BIOS引導(dǎo)加載到物理內(nèi)存0x7c00處時(shí),并沒(méi)有設(shè)置堆棧段,程序也沒(méi)有使用堆棧,直到bootsect被移動(dòng)到0x9000:0處時(shí),才把堆棧段寄存器SS設(shè)置為0x9000,堆棧指針esp寄存器設(shè)置為0xff00,所以堆棧堆棧在0x9000:0xff00處(boot/bootsect.s L61,62)setup.s也使用這個(gè)堆棧

進(jìn)入保護(hù)模式時(shí)候(head.s,L31)
此時(shí)堆棧段被設(shè)置為內(nèi)核數(shù)據(jù)段(0x10),堆棧指針esp設(shè)置成指向user_stack數(shù)組(sched.c L67~72)的頂端,保留了1頁(yè)內(nèi)存作為堆棧使用

初始化時(shí)(main.c)
在執(zhí)行move_to_user_mode()代碼把控制權(quán)移交給任務(wù)0之前,系統(tǒng)一直使用上述堆棧,而在執(zhí)行過(guò)move_to_user_mode()之后,main.c的代碼被“切換”成任務(wù)0中執(zhí)行。通過(guò)執(zhí)行fork()系統(tǒng)調(diào)用,main.c中的init()將在任務(wù)1中執(zhí)行,并使用任務(wù)1的堆棧,而main()本身則在被“切換”成為任務(wù)0后,仍熱繼續(xù)使用上述內(nèi)核程序自己的堆棧作為任務(wù)0的用戶態(tài)堆棧。

任務(wù)的堆棧
每個(gè)任務(wù)都有兩個(gè)堆棧,分別用于用戶態(tài)和內(nèi)核態(tài)程序的執(zhí)行,并且分別稱為用戶態(tài)堆棧和內(nèi)核態(tài)堆棧。
除了處于不同CPU特權(quán)級(jí)中,這兩個(gè)堆棧之間的主要區(qū)別在于任務(wù)的內(nèi)核態(tài)堆棧很小,所保存的數(shù)據(jù)最多不能超過(guò)4096個(gè)字節(jié),而任務(wù)的用戶態(tài)堆棧卻可以在用戶的64MB空間中延伸

在用戶態(tài)運(yùn)行時(shí)
每個(gè)任務(wù)(除了任務(wù)0和任務(wù)1)有自己的64MB地址空間,當(dāng)一個(gè)任務(wù)(進(jìn)程)剛被創(chuàng)建時(shí),它的用戶態(tài)堆棧指針被設(shè)置在其地址空間的靠近末端部分,應(yīng)用程序在用戶態(tài)下運(yùn)行時(shí)就一直使用這個(gè)堆棧,實(shí)際物理地址內(nèi)存則由CPU分頁(yè)機(jī)制確定。

在內(nèi)核態(tài)運(yùn)行時(shí)
每個(gè)任務(wù)有其自己的內(nèi)核態(tài)堆棧,用于任務(wù)在內(nèi)核代碼中執(zhí)行期間。其所在的線性地址中位置由該任務(wù)TSS段中ss0和esp0兩個(gè)字段指定,任務(wù)內(nèi)核態(tài)堆棧被設(shè)置在位于其任務(wù)數(shù)據(jù)結(jié)構(gòu)所在頁(yè)面的末端,即于任務(wù)的任務(wù)數(shù)據(jù)結(jié)構(gòu)(task_struct)放在同一頁(yè)面中,參見(jiàn)kernel/fork.c L93
p->tss.esp0 = PAGE_SIZE + (long)p;
p->tss.ss0 = 0x10

*為什么從主存區(qū)申請(qǐng)得來(lái)的用于保存任務(wù)數(shù)據(jù)結(jié)構(gòu)的一頁(yè)內(nèi)存也能被設(shè)置成內(nèi)核數(shù)據(jù)段中的數(shù)據(jù)呢?就是說(shuō)tss.ss0為什么可以是0x10?
   
用戶內(nèi)核態(tài)仍然屬于內(nèi)核數(shù)據(jù)空間,在head.s中設(shè)置內(nèi)核代碼段和數(shù)據(jù)段的描述符,段長(zhǎng)度都設(shè)置成了16MB,這個(gè)長(zhǎng)度值是Linux0.11內(nèi)核所能支持的最大物理內(nèi)存長(zhǎng)度(head.s,110開(kāi)始的注釋),所以,內(nèi)核代碼可以尋址到整個(gè)物理內(nèi)存范圍中的任何位置,當(dāng)然也包括主存區(qū),每當(dāng)任務(wù)執(zhí)行內(nèi)核程序而需要使用其內(nèi)核棧時(shí),CPU就會(huì)利用TSS結(jié)構(gòu)把它的內(nèi)核態(tài)堆棧設(shè)置成由tss.ss0和tss.esp0這兩個(gè)值構(gòu)成

任務(wù)0(空閑進(jìn)程idle)和任務(wù)1(初始化進(jìn)程init)的堆棧

任務(wù)0和任務(wù)1的代碼段和數(shù)據(jù)段相同,限長(zhǎng)都是640KB,但它們被映射到不同的線性地址空間,任務(wù)0的段基址從線性地址0開(kāi)始,而任務(wù)1的段基址從64MB開(kāi)始,但他們?nèi)坑成涞轿锢淼刂?~640KB范圍中,這個(gè)地址也就是內(nèi)核代碼和基本數(shù)據(jù)所存放的地方,在執(zhí)行了move_to_user_mode()后,任務(wù)0和任務(wù)1的內(nèi)核態(tài)堆棧分別位于各自任務(wù)數(shù)據(jù)結(jié)構(gòu)所在頁(yè)面的末端,而任務(wù)0的用戶態(tài)堆棧就是前面進(jìn)入保護(hù)模式后使用的堆棧,即user_stack[]數(shù)組的位置,由于任務(wù)1在創(chuàng)建時(shí)復(fù)制了任務(wù)0的用戶堆棧,所以剛開(kāi)始時(shí)任務(wù)0和任務(wù)1共享使用同一個(gè)用戶堆??臻g,但是當(dāng)任務(wù)1開(kāi)始運(yùn)行時(shí),寫時(shí)復(fù)制機(jī)制會(huì)為任務(wù)1另行分配主存區(qū)頁(yè)面作為堆棧空間使用,只有到這個(gè)時(shí)候,任務(wù)1才開(kāi)始使用自己獨(dú)立的用戶堆棧內(nèi)存頁(yè)面,因此任務(wù)0的堆棧需要在任務(wù)1實(shí)際開(kāi)始使用之前保持干凈,即任務(wù)0此時(shí)不能使用堆棧,以確保復(fù)制的堆棧頁(yè)面中不含任務(wù)0的數(shù)據(jù)

這樣你就學(xué)會(huì)Linux系統(tǒng)中使用了四種堆棧知識(shí)了。

【編輯推薦】

  1. 設(shè)置Linux刪除自動(dòng)備份節(jié)省系統(tǒng)空間
  2. Linux操作系統(tǒng)配置和使用Samba完成共享目錄
  3. 拋棄Linux操作系統(tǒng)選擇微軟?
  4. 解決Linux網(wǎng)銀更好網(wǎng)上購(gòu)物
  5. 商業(yè)帝國(guó)的"云計(jì)算"Linux操作系統(tǒng)
責(zé)任編輯:小霞 來(lái)源: cnitblog.com
相關(guān)推薦

2010-01-12 17:59:05

2009-10-27 09:26:26

linux系統(tǒng)監(jiān)控命令

2009-12-18 09:48:26

Linux中應(yīng)用

2009-12-16 11:01:31

Linux Fedor

2011-03-17 16:16:50

2009-12-22 14:08:38

2010-03-16 17:53:23

2009-12-22 11:30:38

Linux操作系統(tǒng)

2010-01-06 17:45:47

Linux操作系統(tǒng)

2009-12-15 18:27:51

Linux操作系統(tǒng)

2010-04-08 10:04:59

free命令Linux系統(tǒng)內(nèi)存監(jiān)控

2009-12-16 13:11:13

Fedora操作系統(tǒng)

2009-12-17 15:01:21

Linux系統(tǒng)多用戶

2009-10-28 13:29:14

Linux文件系統(tǒng)安裝

2010-03-18 16:51:32

2009-10-28 17:23:19

linux配置MySQ

2009-12-21 14:48:20

2009-10-22 12:09:57

linux文件系統(tǒng)

2009-12-22 13:26:03

Linux sysfs

2009-12-10 13:35:25

Linux操作系統(tǒng)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)