青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆-80  評論-24  文章-0  trackbacks-0
該文件是進(jìn)程實現(xiàn)以及啟動第一個進(jìn)程的主要實現(xiàn)部分。
還是從文件開頭說起,先看代碼:

 1 #include <string.h>
 2 #include <asm/system.h>
 3 #include <winixj/mm.h>
 4 #include <winixj/int.h>
 5 #include <winixj/mailbox.h>
 6 #include <winixj/process.h>
 7 #include <winixj/schedule.h>
 8 
 9 //所有進(jìn)程所擁有的內(nèi)核態(tài)堆棧都放到一起
10 //進(jìn)程的內(nèi)核態(tài)堆棧的作用主要是用來保存
11 //進(jìn)程被打斷時的現(xiàn)場信息
12 KSTACK kstack_list[NR_PROCS];
13 
14 /*********************************************
15  * 這只是權(quán)宜之計,因為我們還沒有實現(xiàn)內(nèi)存管理
16  * 所以暫時使每個進(jìn)程都有一個獨立的用戶態(tài)堆棧
17  *********************************************/
18 //所有進(jìn)程所擁有的用戶太堆棧也都放到一起
19 USTACK ustack_list[NR_PROCS];
20 
21 //進(jìn)程鏈表,保存所有的進(jìn)程控制塊信息
22 //這是全局變量
23 PROCESS proc_list[NR_PROCS];
24 
25 PROCESS *current; //指向當(dāng)前正在運行的進(jìn)程
26 

先看幾個變量的含義:
首先是kstack_list和ustack_list,在該博文中已經(jīng)說到了,每個進(jìn)程都有自己單獨的用戶態(tài)棧和核心態(tài)棧,在這里的WinixJ的實現(xiàn)目前比較幼稚,就是申請一個數(shù)組,將所有的用戶態(tài)棧放到一起成為數(shù)組,將所有的核心態(tài)放到一起組成數(shù)組,這樣做是有嚴(yán)重問題的:每個進(jìn)程的數(shù)據(jù)段和堆棧段是分開放置的,數(shù)據(jù)段在進(jìn)程地址空間中,而堆棧段則在內(nèi)核空間中,這樣極不利于進(jìn)程之間的隔離與保護(hù),但是誰讓我們是miniOS呢,這樣實現(xiàn)至少現(xiàn)在也能用,等實現(xiàn)了分頁機(jī)制以及內(nèi)存管理后再改進(jìn)也不遲。
然后是proc_list數(shù)組,該數(shù)組是整個進(jìn)程的核心,它其中的每一項都是一個進(jìn)程的心臟---進(jìn)程控制塊。先看進(jìn)程控制塊的定義,看它有哪些字段組成:

 1 //目前的進(jìn)程控制塊結(jié)構(gòu)不妨盡量簡單
 2 //因為我們要實現(xiàn)的是簡陋的進(jìn)程,請忍受這一點
 3 typedef struct task_struct
 4 {
 5     uint32    state;                    //進(jìn)程狀態(tài)
 6     uint32    priority;                //進(jìn)程優(yōu)先級
 7     uint32    time_slices;            //進(jìn)程的剩余時間片
 8     uint32    pid;                    //進(jìn)程的pid
 9     uint32    ppid;                    //父進(jìn)程的pid
10 #define PROC_NAME_LEN    32            //進(jìn)程名的最大長度為32字節(jié)
11     char    name[PROC_NAME_LEN];
12     uint32    *kstack;                //指向內(nèi)核態(tài)堆棧頂
13     uint32    *ustack;                //指向用戶態(tài)堆棧頂
14     uint32    running_time;            //進(jìn)程一共運行了的時間
15     struct seg_struct ldt[3];        //進(jìn)程的局部描述符表一項為空、一項為cs、一項為ds和ss
16     TSS tss;
17 } PROCESS;
18 

可以看到,我們所熟知的字段都包含了,有:進(jìn)程狀態(tài)、進(jìn)程優(yōu)先級、進(jìn)程運行時間片、進(jìn)程pid、父進(jìn)程pid、進(jìn)程名等等,還有我們剛才提到的該進(jìn)程的用戶態(tài)棧和核心態(tài)棧指針,以及該進(jìn)程運行了多長時間(該參數(shù)目前版本的WinixJ還沒有用到),還有l(wèi)dt、tss。下面依次對其進(jìn)行介紹:
1、state,有如下幾種狀態(tài):

1 #define PROC_RUNNING        1
2 #define PROC_INTERRUPTIBLE    2
3 #define PROC_UNINTERRUPTIBLE    3
4 #define PROC_ZOMBIE        4
5 #define PROC_STOPPED        5
6 

這些定義符合大部分UNIX類系統(tǒng)的規(guī)定。不過在WinixJ中第2、3、4種狀態(tài)目前沒有用到,進(jìn)程只有正在運行、就緒兩種狀態(tài),而RUNNING則代表了這兩種狀態(tài),STOPPED是進(jìn)程控制塊中的初始狀態(tài),代表進(jìn)程不存在(這里與UNIX類系統(tǒng)有些沖突,不過可以很容易修正),目前還不支持進(jìn)程的死亡退出以及僵尸進(jìn)程。
2、priority,進(jìn)程的優(yōu)先級,WinixJ目前采用的是時間片輪轉(zhuǎn)調(diào)度,因此priority和進(jìn)程的初始時間片相同。
3、time_slices,進(jìn)程時間片,該值越大則進(jìn)程獲得運行的時間越長。
4、pid,進(jìn)程pid。
5、ppid,父進(jìn)程pid。
6、name[32],進(jìn)程名。
7、kstack,核心態(tài)堆棧頂,前面介紹過了。
8、ustack,用戶態(tài)堆棧頂,核心態(tài)堆棧和用戶態(tài)堆棧都是1KB大小,見下面的定義:

1 //進(jìn)程所擁有的內(nèi)核態(tài)以及用戶態(tài)堆棧
2 //大小為1KB,短期內(nèi)應(yīng)該夠用
3 typedef struct kstack
4 {
5     uint8 res[1024];
6 } KSTACK, USTACK;
7 

9、running_time,進(jìn)程已經(jīng)運行了多長時間,目前未使用該變量。
10、ldt[3],局部描述符表,定義和GDT相同,如下:

 1 //定義段描述符結(jié)構(gòu),每個描述符占用8個字節(jié)
 2 typedef struct seg_struct
 3 {
 4     uint16    seg_limit_low16;
 5     uint16    seg_base_low16;
 6     uint8    seg_base_mid8;
 7     uint8    attr1;
 8     uint8    attr2_limit_high4;
 9     uint8    seg_base_high8;
10 };
11 

ldt是進(jìn)程間隔離的核心部件之一,每個進(jìn)程都有自己的ldt,它的含義和gdt項沒有什么不同,只不過它僅包含三項,第一項和GDT的第一項一樣未空,不使用,第二項為局部CS段描述符,第三項為局部DS和SS段描述符。而這個ldt又如何使用呢?暫時不需要管,只需要知道,當(dāng)發(fā)生進(jìn)程切換的時候,進(jìn)程的CS段和DS段基地址是從該進(jìn)程的ldt中獲得的。
11、tss,這是TSS段,在進(jìn)行任務(wù)切換的時候用于進(jìn)程現(xiàn)場的保護(hù)和恢復(fù)。

再繼續(xù)往下看代碼:

 1 extern void init();
 2 extern void sys();
 3 
 4 static void set_tss_seg(int n, void *addr)
 5 {
 6     gdt[n].seg_limit_low16        = 0x0068//tss段長為104個字節(jié),不能多也不能少
 7     gdt[n].seg_base_low16        = (uint16)(((uint32)addr) & 0xffff); //段地址的低16位
 8     gdt[n].seg_base_mid8        = (uint8)((((uint32)addr) >> 16& 0xff); //段地址的中間8位
 9     gdt[n].attr1                = 0x89//該段在內(nèi)存中存在,DPL=0,是TSS描述符
10     gdt[n].attr2_limit_high4    = 0x40//段界限粒度是字節(jié)
11     gdt[n].seg_base_high8        = (uint8)((((uint32)addr) >> 24& 0xff); //段地址的高8位
12 }
13 
14 static void set_ldt_seg(int n, void *addr)
15 {
16     gdt[n].seg_limit_low16        = 0x0018//所有進(jìn)程的ldt均只包含三個描述符,因此ldt段長為24個字節(jié)
17     gdt[n].seg_base_low16        = (uint16)(((uint32)addr) & 0xffff); //段地址的低16位
18     gdt[n].seg_base_mid8        = (uint8)((((uint32)addr) >> 16& 0xff); //段地址的中間8位
19     gdt[n].attr1                = 0x82//該段在內(nèi)存中存在,DPL=0,是LDT描述符
20     gdt[n].attr2_limit_high4    = 0x40//段界限粒度是字節(jié)
21     gdt[n].seg_base_high8        = (uint8)((((uint32)addr) >> 24& 0xff); //段地址的高8位
22 }
23 

這兩個函數(shù)不長,代碼也很相似,他們完成的功能如下:
set_tss_seg()函數(shù)用于設(shè)置GDT中的某一描述符表項為指向進(jìn)程控制塊中的tss的起始地址。
set_ldt_seg()函數(shù)用于設(shè)置GDT中的某一描述符表項為指向進(jìn)程控制塊中的ldt的起始地址。
我們可以先預(yù)覽一下WinixJ的GDT表的樣子:
DUMMY
kernel-cs
kernel-ds
unused
process-0-tss
process-0-ldt
process-1-tss
process-1-ldt
process-2-tss
process-2-ldt
...
...
process-124-tss
process-124-ldt
unused
unused
其中每個GDT表項占用8字節(jié),每個進(jìn)程在gdt表中占用2項---1項是該進(jìn)程的tss,1項是該進(jìn)程的ldt。
ldtr寄存器中的值是ldt選擇子,即相對于GDT起始地址的偏移,據(jù)此它能索引到對應(yīng)的ldt,進(jìn)而取得對應(yīng)的段基地址。
posted on 2012-02-14 17:30 myjfm 閱讀(469) 評論(0)  編輯 收藏 引用 所屬分類: 操作系統(tǒng)
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美一区二区视频观看视频| 亚洲一区视频| 国产一区二区在线免费观看| 亚洲国产婷婷| 国精品一区二区三区| 一本色道久久88综合日韩精品| 小辣椒精品导航| aaa亚洲精品一二三区| 久久综合网络一区二区| 亚洲免费影视第一页| 欧美**人妖| 牛人盗摄一区二区三区视频| 国产日韩一区欧美| 亚洲欧美日本国产专区一区| 一卡二卡3卡四卡高清精品视频| 亚洲精品一区二区三区婷婷月| 欧美国产日本高清在线| 久久一区二区三区四区| 国产精品免费网站在线观看| 亚洲少妇在线| 亚洲一区二区三区高清不卡| 欧美日韩一区二区三区在线观看免| 亚洲自拍另类| 欧美亚洲不卡| 宅男精品视频| 性欧美大战久久久久久久免费观看| 先锋影院在线亚洲| 欧美中文字幕不卡| 国产欧美一区二区精品秋霞影院| 久久这里只有精品视频首页| 国产自产精品| 久久精品国产亚洲aⅴ| 久久久久亚洲综合| 在线日韩欧美视频| 欧美成人a视频| 亚洲另类春色国产| 亚洲一区在线看| 国产伦精品一区二区三区视频孕妇 | 欧美不卡视频一区| 免费短视频成人日韩| 亚洲国产视频a| 欧美国产精品久久| 亚洲美女视频在线观看| 亚洲一区在线免费| 国产欧美丝祙| 久久精品人人| 亚洲电影av| 亚洲女女女同性video| 国产欧美日韩精品丝袜高跟鞋 | 国产一区二区电影在线观看| 欧美一区二区三区在线看| 久久先锋影音| 日韩午夜电影av| 国产精品一区二区在线观看| 久久九九国产| 亚洲乱码视频| 午夜久久美女| 亚洲激情在线观看| 国产精品多人| 久久一区二区三区四区| 99xxxx成人网| 蜜桃视频一区| 亚洲欧美日韩天堂| 亚洲丰满少妇videoshd| 欧美亚州一区二区三区| 久久中文久久字幕| 亚洲少妇最新在线视频| 欧美电影在线免费观看网站| 亚洲一区精品电影| 亚洲欧洲综合另类在线| 国产精品一区二区黑丝| 欧美大片一区二区| 欧美亚洲一区二区三区| 亚洲精品一区二区三区在线观看| 亚洲欧洲在线免费| 国产视频精品xxxx| 欧美日韩天堂| 麻豆乱码国产一区二区三区| 亚洲综合激情| 日韩亚洲在线| 欧美激情小视频| 欧美中文在线观看国产| 一本久久a久久免费精品不卡| 欧美日韩1234| 噜噜噜躁狠狠躁狠狠精品视频| 免费成人高清| 久久九九精品| 亚洲欧美日韩综合一区| 99视频一区| 91久久线看在观草草青青| 韩国精品一区二区三区| 国产精品尤物福利片在线观看| 亚洲一卡二卡三卡四卡五卡| 亚洲精品少妇30p| 欧美高清hd18日本| 久久永久免费| 久久性天堂网| 欧美在线中文字幕| 欧美一级夜夜爽| 亚洲自拍偷拍麻豆| 亚洲一区二区免费视频| 中文av一区二区| 一本久道久久综合中文字幕| 亚洲第一在线视频| 亚洲成人资源网| 亚洲国内精品在线| 亚洲二区在线观看| 亚洲国产日韩精品| 亚洲国产精品成人综合| 亚洲国产精品一区制服丝袜| 在线播放日韩| 亚洲人午夜精品| 亚洲精品久久久久久下一站| 亚洲精品久久久久久久久久久久久 | 欧美风情在线观看| 美女主播一区| 亚洲高清不卡在线| 欧美不卡视频一区发布| 欧美激情一区二区三区高清视频| 亚洲综合色婷婷| 小处雏高清一区二区三区| 欧美一区二区三区成人| 久久久久在线| 欧美大尺度在线| 亚洲精品一区二区三区在线观看| 午夜精品短视频| 久久成人精品电影| 久久综合久久久久88| 欧美国产精品va在线观看| 亚洲人成毛片在线播放女女| 日韩视频中文字幕| 翔田千里一区二区| 久久最新视频| 欧美午夜视频网站| 国产午夜精品麻豆| 亚洲成人资源网| 亚洲视频1区| 久久人人97超碰国产公开结果| 亚洲午夜激情网页| 久久精品国产99精品国产亚洲性色 | 美女国产一区| 欧美日韩一区二区三区在线视频 | 国产农村妇女精品一区二区| 国产欧亚日韩视频| 亚洲欧洲精品一区| 亚洲欧美视频在线观看视频| 久久综合久久久久88| 99re热精品| 久久精品国产69国产精品亚洲| 一区二区免费在线播放| 亚洲欧美中文日韩v在线观看| 99爱精品视频| 乱人伦精品视频在线观看| 欧美性大战久久久久| 影音先锋欧美精品| 午夜精彩国产免费不卡不顿大片| 一区二区三区成人| 久久综合久久综合久久| 亚洲乱亚洲高清| 久久亚洲精选| 国产麻豆成人精品| 夜夜爽av福利精品导航| 久久婷婷蜜乳一本欲蜜臀| 夜色激情一区二区| 美女国产一区| 国外视频精品毛片| 欧美一进一出视频| 日韩网站在线看片你懂的| 老司机午夜精品| 国内精品久久久久伊人av| 亚洲一区二区在线看| 91久久午夜| 麻豆成人小视频| 在线观看一区欧美| 久久精品亚洲热| 亚洲欧美日本日韩| 欧美日韩视频在线一区二区观看视频 | 媚黑女一区二区| 国产视频一区二区在线观看| 亚洲午夜电影在线观看| 亚洲国产精品一区制服丝袜 | 狂野欧美性猛交xxxx巴西| 亚洲图片欧美午夜| 欧美日韩一区在线视频| 亚洲精品综合久久中文字幕| 欧美 日韩 国产一区二区在线视频 | 久久婷婷丁香| 欧美一区二区女人| 国产精品高潮粉嫩av| 亚洲一区二区免费视频| 一区二区三区精品视频在线观看| 欧美一区二区三区免费视| 国产精品有限公司| 香蕉免费一区二区三区在线观看 | 国产精品久久97| 亚洲伊人网站| 亚洲天堂av在线免费观看| 国产精品乱码一区二区三区| 亚洲欧美成人| 欧美一区二区三区视频免费播放|