亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 操作系統 > 正文

xv6中存儲cpu和進程信息的技巧

2024-06-28 13:20:01
字體:
來源:轉載
供稿:網友
xv6中存儲cpu和進程信息的技巧

xv6是一個支持多處理器的Unix-like操作系統,

近日閱讀源碼時發現xv6在記錄當前CPU和進程狀態時非常tricky

首先,上代碼:

 1 extern struct cpu cpus[NCPU]; 2 extern int ncpu; 3  4 // Per-CPU variables, holding pointers to the 5 // current cpu and to the current PRocess. 6 // The asm suffix tells gcc to use "%gs:0" to refer to cpu 7 // and "%gs:4" to refer to proc.  seginit sets up the 8 // %gs segment register so that %gs refers to the memory 9 // holding those two variables in the local cpu's struct cpu.10 // This is similar to how thread-local variables are implemented11 // in thread libraries such as linux pthreads.12 extern struct cpu *cpu asm("%gs:0");       // &cpus[cpunum()]13 extern struct proc *proc asm("%gs:4");     // cpus[cpunum()].proc

其中struct cpu是一個用來保存每個cpu運行狀態的結構體,

代碼第一行定義了結構體數組cpus[NCPU],NCPU對應cpu的總數(最大為8),也就是說cpus用來存儲所有cpu的運行狀態。

那么問題來了:上面的內核代碼是運行于每個cpu之中的,那每個cpu如何知道自身的當前運行狀態呢?

對于這個問題,我們可以通過lapic獲取cpu自身編號,再利用編號對cpus尋址即可,

也就是說,對于任意一個cpu,自身狀態的存儲位置可以這樣獲得:struct cpu *c = &cpus[cpunum()];

然而,第二個問題來了:我們不可能每次引用cpu自身狀態時都通過lapic獲取編號啊,能不能弄一個全局變量把狀態位置一次性存儲下來呢?

像是這樣,struct cpu *cpu; //全局變量,存儲cpu自身狀態,然后在初始化代碼中cpu = c;

對于記錄每個cpu正在運行的進程也有這樣的問題,能不能寫成:struct proc *proc; //全局變量,存儲當前cpu正在運行的進程狀態

那么,第三個問題來了:每個cpu是獨立并行的,在每個cpu上運行的內核代碼都是一樣的,頁表也一樣,

這意味著全局變量cpu和proc的地址也是一樣的,這樣便不可以用來區分不同cpu的狀態了。

因此,我們需要一種方法,可以讓我們在每個cpu中都用同一個符號記錄狀態,但這些符號卻是映射到不同的地址。

既然頁表一樣,我們自然不能用一個絕對的數值來尋址啦,仔細想想,頁表之上有什么?頁表之上,還有段表啊。

所以我們需要用segment register來尋址,只要我們在建立段表時把該段都映射到不同的內存區域不就可以了,所以我們有了以下聲明:

1 extern struct cpu *cpu asm("%gs:0");       // &cpus[cpunum()]2 extern struct proc *proc asm("%gs:4");     // cpus[cpunum()].proc

我們用gs作為段寄存器,cpu指向[%gs],proc指向[%gs+4],

其中為什么開頭要用extern呢?我問過某大神,他說是因為gs段是在外部建立的,相當于外部定義的。。。

OK,最后一個問題來了,gs段應該指向哪,才能確保每個cpu的gs段都位于不同的區域?

最直觀的想法當然是指向對應的cpus[num]內部啦,所以在struct cpu尾部增加兩個域:

1 struct cpu{2    ........  //cpu狀態3 4    // Cpu-local storage variables; see below5   struct cpu *cpu;6   struct proc *proc;           // The currently-running process.7 }

然后在建立段表時,增加gs段,并映射至尾部這兩個域:

 1   c = &cpus[cpunum()]; 2    3   ......... //建立其他段 4  5   // 建立gs段,共兩個域(存儲cpu和proc地址),起始地址為&c->cpu 6   c->gdt[SEG_KCPU] = SEG(STA_W, &c->cpu, 8, 0); 7  8   //加載gdt 9   lgdt(c->gdt, sizeof(c->gdt));10   //加載gs11   loadgs(SEG_KCPU << 3);12   13   // 把當前cpu和proc狀態的地址賦給cpu和proc全局變量14   //而cpu變量實質為%gs:0, proc變量實質為%gs:415   cpu = c;16   proc = 0;

其實在這里cpu和proc變量跟線程局部存儲的性質差不多,每個處理器都可以引用同一個變量,但這些變量都對應不同的存儲區域。

有可能這種實現技巧跟TLS(線程局部存儲)差不多,有空研究下TLS的實現看看是不是。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
69视频在线免费观看| 日韩在线欧美在线| 日韩av大片免费看| 伊人伊成久久人综合网站| 九九热r在线视频精品| 欧美一级黑人aaaaaaa做受| 日韩美女主播视频| 国产亚洲福利一区| 亚洲jizzjizz日本少妇| 日韩久久午夜影院| 成人免费福利视频| 92裸体在线视频网站| 欧美日韩性视频| 久久久久久久国产精品视频| 国产精品九九九| 国产成人一区二区三区| 日韩精品视频免费在线观看| 亚洲男人天天操| 国产午夜精品一区理论片飘花| 国产日韩欧美另类| 色伦专区97中文字幕| 欧美高清视频免费观看| 久久99国产精品久久久久久久久| 精品久久久91| 亚洲欧美国产视频| 欧美激情免费观看| 97高清免费视频| 91最新在线免费观看| 国产精品久久久久久久久久新婚| 日韩一区二区久久久| 久久精品99久久久香蕉| 午夜精品美女自拍福到在线| 在线播放日韩欧美| 日韩电影网在线| 欧美日在线观看| 欧美激情视频网| 亚洲免费小视频| 日本乱人伦a精品| 欧美日韩国产在线看| 久久免费福利视频| 久久激情五月丁香伊人| 中文字幕欧美精品日韩中文字幕| 国产精品三级久久久久久电影| 动漫精品一区二区| 久久久国产精品免费| 国产在线拍揄自揄视频不卡99| 色噜噜国产精品视频一区二区| 国产精品三级久久久久久电影| 亚洲中国色老太| 日韩欧美成人精品| 成人免费观看a| 亚洲一区二区三区久久| 欧美中文字幕在线播放| 日韩中文字幕免费| 日韩av免费在线| 亚洲97在线观看| 欧美日韩一区免费| 日韩欧美国产高清91| 日韩欧美有码在线| 国产精品女人网站| 高潮白浆女日韩av免费看| 国产日韩欧美在线播放| 岛国av一区二区在线在线观看| 中文在线资源观看视频网站免费不卡| 日韩一区视频在线| 久久夜色精品国产亚洲aⅴ| 日韩精品视频在线观看免费| 国产精品久久久久久久久久99| 日韩国产欧美精品在线| 日韩中文在线中文网在线观看| 亚洲精品国产精品国自产观看浪潮| 欧美亚洲国产成人精品| 日韩精品免费观看| 性欧美暴力猛交69hd| 91视频九色网站| 亚洲天堂免费视频| 欧美成人中文字幕| 国产日韩亚洲欧美| 日韩精品免费在线播放| 亚洲美女www午夜| 亚洲乱码一区二区| 另类视频在线观看| 亚洲精品www久久久| 91香蕉电影院| 国产精品久久久久福利| 日韩最新中文字幕电影免费看| 亚洲最大成人免费视频| 成人免费观看49www在线观看| 国产美女精彩久久| 在线电影欧美日韩一区二区私密| 色哟哟亚洲精品一区二区| 国产精品久久99久久| 中文一区二区视频| 久久久久久久久久久91| 亚洲激情免费观看| 国产精品久久激情| 色婷婷综合久久久久中文字幕1| 久久这里只有精品视频首页| 国产精品久久激情| 亚洲美女中文字幕| 亚洲男人天堂2019| 国产精品ⅴa在线观看h| 久久视频国产精品免费视频在线| 欧美激情免费视频| 亚洲香蕉伊综合在人在线视看| 亚洲视频网站在线观看| 日韩的一区二区| 欧美日韩国产色| 久久久久久久久久久av| 88国产精品欧美一区二区三区| 国产精品va在线播放我和闺蜜| 一区二区三区黄色| 欧美一级淫片aaaaaaa视频| 国产又爽又黄的激情精品视频| 成人精品一区二区三区电影免费| 成人做爰www免费看视频网站| 日韩欧美在线免费观看| 日韩av中文字幕在线| 97久久国产精品| 久久国产精品久久久| 国产视频久久久久久久| 亚洲国产一区二区三区在线观看| 午夜精品久久久久久久久久久久久| 久久亚洲国产精品成人av秋霞| 日韩的一区二区| 国外视频精品毛片| 日韩美女激情视频| 精品亚洲夜色av98在线观看| 亚洲精品美女视频| 成人午夜激情免费视频| 91中文在线观看| 尤物九九久久国产精品的特点| 欧美精品日韩www.p站| 亚洲xxx自由成熟| 欧美在线视频观看免费网站| 日韩电影免费在线观看中文字幕| 亚洲精品国产精品国自产在线| 亚洲日韩中文字幕在线播放| 亚洲欧美另类人妖| 成人乱色短篇合集| 亚洲人成电影网站色www| 精品久久久999| 在线观看日韩欧美| 在线播放日韩av| 久久免费视频这里只有精品| 亚洲日韩中文字幕| 久久综合免费视频影院| 亚洲欧美国产va在线影院| 姬川优奈aav一区二区| 91超碰caoporn97人人| 亚洲天堂av在线播放| 国产性色av一区二区| 中文字幕欧美精品日韩中文字幕| 日本午夜在线亚洲.国产| 亚洲深夜福利视频| 亚洲偷熟乱区亚洲香蕉av| 视频一区视频二区国产精品| 国产自产女人91一区在线观看| 精品久久久久久久久久久久| 国产精品久久久久久一区二区| 国产一区二区三区直播精品电影| 亚洲激情第一页| 日韩成人高清在线| 秋霞av国产精品一区|