成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

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

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

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

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

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

四    任務(wù)在用戶態(tài)執(zhí)行的堆棧,位于任務(wù)(進程 )邏輯地址空間近末端處
使用多個棧或在不同情況下使用不同棧的主要原因

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

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

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

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

初始化時(main.c)
在執(zhí)行move_to_user_mode()代碼把控制權(quán)移交給任務(wù)0之前,系統(tǒng)一直使用上述堆棧,而在執(zhí)行過move_to_user_mode()之后,main.c的代碼被“切換”成任務(wù)0中執(zhí)行。通過執(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ù)的堆棧
每個任務(wù)都有兩個堆棧,分別用于用戶態(tài)和內(nèi)核態(tài)程序的執(zhí)行,并且分別稱為用戶態(tài)堆棧和內(nèi)核態(tài)堆棧。
除了處于不同CPU特權(quán)級中,這兩個堆棧之間的主要區(qū)別在于任務(wù)的內(nèi)核態(tài)堆棧很小,所保存的數(shù)據(jù)最多不能超過4096個字節(jié),而任務(wù)的用戶態(tài)堆棧卻可以在用戶的64MB空間中延伸

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

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

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

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

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

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

【編輯推薦】

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

2009-10-27 09:26:26

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

2010-01-12 17:59:05

2009-12-18 09:48:26

Linux中應(yīng)用

2010-03-16 17:53:23

2009-12-16 11:01:31

Linux Fedor

2011-03-17 16:16:50

2009-12-22 14:08:38

2010-01-06 17:45:47

Linux操作系統(tǒng)

2010-04-08 10:04:59

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

2009-12-22 11:30:38

Linux操作系統(tǒng)

2009-12-15 18:27:51

Linux操作系統(tǒng)

2009-12-16 13:11:13

Fedora操作系統(tǒng)

2009-10-22 12:09:57

linux文件系統(tǒng)

2009-12-21 14:48:20

2009-12-22 13:26:03

Linux sysfs

2010-03-18 16:51:32

2009-10-28 17:23:19

linux配置MySQ

2009-10-28 13:29:14

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

2009-12-17 15:01:21

Linux系統(tǒng)多用戶

2010-04-29 14:08:38

Unix操作系統(tǒng)
點贊
收藏

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

主站蜘蛛池模板: 精品乱码久久久久 | 亚洲在线| 天天草天天 | 久久久成人网 | 欧美精品第一页 | 国产精品18hdxxxⅹ在线 | 精品无码久久久久久国产 | 久久中文字幕一区 | 欧美视频 亚洲视频 | 国产综合精品一区二区三区 | 欧美xxxx在线 | 久久99国产精品 | 在线中文一区 | 日日夜夜91 | 在线观看你懂的网站 | 亚洲第一区国产精品 | 亚洲欧美日韩在线 | 日韩和的一区二区 | 亚洲一区 中文字幕 | av电影一区 | 伊人一区 | 国产精品a级| 成人在线免费电影 | 欧美一区二区三区小说 | 午夜日韩| 91精品国产91久久久久久最新 | 黄色国产在线播放 | 999久久| 欧美日韩亚洲国产综合 | 一级毛片免费看 | 国产精品爱久久久久久久 | 日韩一区二区三区视频在线观看 | www国产精 | 一级午夜aaa免费看三区 | 久久精品中文字幕 | 亚洲精品一区二区三区在线 | 日批的视频 | 免费一区二区三区 | 亚洲欧洲激情 | 日韩在线国产 | 成人 在线 |