本發(fā)明涉及嵌入式實(shí)時(shí)操作系統(tǒng),尤其涉及一種嵌入式實(shí)時(shí)操作系統(tǒng)中進(jìn)程的信號(hào)處理方法。
背景技術(shù):
1、進(jìn)程是嵌入式實(shí)時(shí)操作系統(tǒng)進(jìn)行資源分配和調(diào)度的一個(gè)獨(dú)立單元,是系統(tǒng)進(jìn)行資源分配和調(diào)度的一個(gè)獨(dú)立運(yùn)行的實(shí)體,是應(yīng)用程序運(yùn)行的載體。每個(gè)進(jìn)程都有自己的獨(dú)立地址空間,包括代碼段、數(shù)據(jù)段、堆棧等,以及運(yùn)行時(shí)所需的系統(tǒng)資源(如文件描述符、信號(hào)處理器等)。
2、在用戶指定了信號(hào)處理函數(shù)后,由于若信號(hào)處理函數(shù)處于內(nèi)核態(tài)時(shí),程序便擁有過(guò)高的控制權(quán)限,容易導(dǎo)致系統(tǒng)資源和硬件設(shè)備遭到破壞。因此,進(jìn)程在執(zhí)行信號(hào)處理函數(shù)過(guò)程需要從內(nèi)核態(tài)返回用戶空間(用戶態(tài))時(shí)執(zhí)行。
3、目前,現(xiàn)有技術(shù)中,進(jìn)程信號(hào)處理過(guò)程為:第一步,進(jìn)程經(jīng)過(guò)內(nèi)核提供的接口第一次進(jìn)入內(nèi)核態(tài),并將用戶現(xiàn)場(chǎng)數(shù)據(jù)保存至內(nèi)核態(tài)線程棧終;第二步,內(nèi)核將當(dāng)前內(nèi)核態(tài)線程棧的數(shù)據(jù)拷貝到用戶棧上,并修改指令寄存器地址使其指向信號(hào)處理函數(shù),用以進(jìn)程在返回用戶態(tài)時(shí)對(duì)選擇的未決信號(hào)執(zhí)行信號(hào)處理函數(shù);第三步,信號(hào)處理函數(shù)執(zhí)行完成后,進(jìn)程第二次進(jìn)入內(nèi)核態(tài),檢查是否還有其他未決信號(hào)未處理;第四步,如果所有信號(hào)都處理完成,則恢復(fù)內(nèi)核棧和恢復(fù)指令寄存器將其指向中斷前的運(yùn)行位置,使進(jìn)程返回用戶態(tài)繼續(xù)執(zhí)行。
4、基于上述現(xiàn)有技術(shù)中的進(jìn)程信號(hào)處理過(guò)程,存在以下技術(shù)缺陷:第一,由于進(jìn)程信號(hào)處理過(guò)程涉及至少兩次返回用戶態(tài)和進(jìn)入內(nèi)核態(tài),其頻繁的狀態(tài)切換會(huì)消耗大量的cpu資源。第二,由于進(jìn)程信號(hào)處理過(guò)程中需要對(duì)用戶現(xiàn)場(chǎng)數(shù)據(jù)通過(guò)頻繁的壓棧和出棧來(lái)進(jìn)行保護(hù),導(dǎo)致消耗大量?jī)?nèi)存。第三,由于內(nèi)核態(tài)需要感知信號(hào)處理函數(shù),導(dǎo)致信號(hào)處理函數(shù)與內(nèi)核態(tài)的耦合性較高。
技術(shù)實(shí)現(xiàn)思路
1、(一)要解決的技術(shù)問(wèn)題
2、鑒于現(xiàn)有技術(shù)的上述缺點(diǎn)、不足,本發(fā)明提供一種嵌入式實(shí)時(shí)操作系統(tǒng)中進(jìn)程的信號(hào)處理方法,其解決了進(jìn)程在執(zhí)行信號(hào)處理過(guò)程中時(shí)存在的cpu資源和內(nèi)存消耗高以及信號(hào)處理函數(shù)與內(nèi)核態(tài)的耦合性高的技術(shù)問(wèn)題。
3、(二)技術(shù)方案
4、為了達(dá)到上述目的,本發(fā)明采用的主要技術(shù)方案包括:
5、第一方面,本發(fā)明實(shí)施例提供一種嵌入式實(shí)時(shí)操作系統(tǒng)中進(jìn)程的信號(hào)處理方法,其包括:
6、將用戶態(tài)的信號(hào)處理函數(shù)記錄在嵌入式實(shí)時(shí)操作系統(tǒng)的用戶系統(tǒng)調(diào)用庫(kù)中,并在啟動(dòng)之前,執(zhí)行用戶系統(tǒng)調(diào)用庫(kù)初始化,將用戶態(tài)未決信號(hào)集全局變量地址傳遞到進(jìn)程控制塊結(jié)構(gòu)體中,獲得內(nèi)核態(tài)未決信號(hào)集全局變量地址;
7、若存在進(jìn)程的觸發(fā)信號(hào),則將觸發(fā)信號(hào)記錄在內(nèi)核態(tài)未決信號(hào)集全局變量地址中,用戶系統(tǒng)調(diào)用庫(kù)調(diào)用進(jìn)程陷入內(nèi)核態(tài)時(shí),將用戶現(xiàn)場(chǎng)數(shù)據(jù)保存在內(nèi)核態(tài)線程棧中,和在內(nèi)核態(tài)中對(duì)觸發(fā)信號(hào)進(jìn)行內(nèi)核處理,將得到的未決信號(hào)集記錄在用戶態(tài)未決信號(hào)集全局變量地址;以及,根據(jù)內(nèi)核態(tài)線程棧中的用戶現(xiàn)場(chǎng)數(shù)據(jù)進(jìn)行恢復(fù)以使進(jìn)程返回用戶態(tài),并根據(jù)信號(hào)處理函數(shù)對(duì)未決信號(hào)集依次執(zhí)行信號(hào)處理。
8、可選地,嵌入式實(shí)時(shí)操作系統(tǒng)中進(jìn)程的信號(hào)處理方法還包括:
9、在未決信號(hào)集處理完成之后,根據(jù)恢復(fù)內(nèi)核態(tài)線程棧中的用戶現(xiàn)場(chǎng)數(shù)據(jù)所獲得的指令地址,控制進(jìn)程返回該指令地址繼續(xù)執(zhí)行。
10、可選地,將用戶態(tài)的信號(hào)處理函數(shù)記錄在嵌入式實(shí)時(shí)操作系統(tǒng)的用戶系統(tǒng)調(diào)用庫(kù)中,并在啟動(dòng)之前,執(zhí)行用戶系統(tǒng)調(diào)用庫(kù)初始化,將用戶態(tài)未決信號(hào)集全局變量地址傳遞到進(jìn)程控制塊結(jié)構(gòu)體中,獲得內(nèi)核態(tài)未決信號(hào)集全局變量地址包括:
11、基于嵌入式實(shí)時(shí)操作系統(tǒng)中進(jìn)程的信號(hào)類別信息,注冊(cè)該進(jìn)程的信號(hào)處理函數(shù),并將信號(hào)處理函數(shù)記錄在用戶系統(tǒng)調(diào)用庫(kù)中;
12、在嵌入式實(shí)時(shí)操作系統(tǒng)中進(jìn)程用戶main函數(shù)啟動(dòng)前,執(zhí)行用戶系統(tǒng)調(diào)用庫(kù)初始化,將用戶態(tài)未決信號(hào)集全局變量地址傳遞到進(jìn)程控制塊結(jié)構(gòu)體中,獲得內(nèi)核態(tài)未決信號(hào)集全局變量地址。
13、可選地,若存在進(jìn)程的觸發(fā)信號(hào),則將觸發(fā)信號(hào)記錄在內(nèi)核態(tài)未決信號(hào)集全局變量地址中包括:
14、獲取嵌入式實(shí)時(shí)操作系統(tǒng)接收到外部信號(hào),并判斷外部信號(hào)中是否存在進(jìn)程的觸發(fā)信號(hào);
15、若外部信號(hào)中存在進(jìn)程的觸發(fā)信號(hào),則將該觸發(fā)信號(hào)記錄在內(nèi)核態(tài)未決信號(hào)集全局變量地址;
16、若外部信號(hào)中不存在進(jìn)程的觸發(fā)信號(hào),則保持進(jìn)程的執(zhí)行狀態(tài),并實(shí)時(shí)更新保存在嵌入式實(shí)時(shí)操作系統(tǒng)的物理寄存器中的包含指令地址的用戶現(xiàn)場(chǎng)數(shù)據(jù)。
17、可選地,用戶系統(tǒng)調(diào)用庫(kù)調(diào)用進(jìn)程陷入內(nèi)核態(tài)時(shí),將用戶現(xiàn)場(chǎng)數(shù)據(jù)保存在內(nèi)核態(tài)線程棧中,和在內(nèi)核態(tài)中對(duì)觸發(fā)信號(hào)進(jìn)行內(nèi)核處理,將得到的未決信號(hào)集記錄在用戶態(tài)未決信號(hào)集全局變量地址包括:
18、用戶系統(tǒng)調(diào)用庫(kù)調(diào)用進(jìn)程陷入內(nèi)核態(tài)時(shí),將用戶現(xiàn)場(chǎng)數(shù)據(jù)保存在內(nèi)核態(tài)線程棧中;
19、基于進(jìn)程的信號(hào)屏蔽集,對(duì)觸發(fā)信號(hào)中與信號(hào)屏蔽集對(duì)應(yīng)的子信號(hào)的進(jìn)行屏蔽處理,得到初始未決信號(hào)集;
20、在進(jìn)程陷入內(nèi)核態(tài)的情況下,對(duì)初始未決信號(hào)集進(jìn)行內(nèi)核處理,并將得到未決信號(hào)集記錄在用戶態(tài)未決信號(hào)集全局變量地址中。
21、可選地,在進(jìn)程陷入內(nèi)核態(tài)的情況下,對(duì)初始未決信號(hào)集進(jìn)行內(nèi)核處理,并將得到未決信號(hào)集記錄在用戶態(tài)未決信號(hào)集全局變量地址中之后,還包括:
22、判斷內(nèi)核態(tài)未決信號(hào)集全局變量地址中是否存在初始未決信號(hào)集;
23、若內(nèi)核態(tài)未決信號(hào)集全局變量地址中存在初始未決信號(hào)集時(shí),則修改內(nèi)核態(tài)線程棧中用戶現(xiàn)場(chǎng)數(shù)據(jù)的指令地址為預(yù)先設(shè)置的信號(hào)分發(fā)函數(shù)的入口地址,并將信號(hào)分發(fā)函數(shù)的返回地址設(shè)置為進(jìn)程陷入內(nèi)核態(tài)前一時(shí)刻的指令地址;
24、若內(nèi)核態(tài)未決信號(hào)集全局變量地址中不存在初始未決信號(hào)集時(shí),則保持進(jìn)程的返回地址為進(jìn)程陷入內(nèi)核態(tài)時(shí)的指令地址。
25、可選地,根據(jù)內(nèi)核態(tài)線程棧中的用戶現(xiàn)場(chǎng)數(shù)據(jù)進(jìn)行恢復(fù)以使進(jìn)程返回用戶態(tài),并根據(jù)信號(hào)處理函數(shù)對(duì)未決信號(hào)集依次執(zhí)行信號(hào)處理包括:
26、將內(nèi)核態(tài)線程棧中的用戶現(xiàn)場(chǎng)數(shù)據(jù)恢復(fù)到物理寄存器中,以使進(jìn)程返回用戶態(tài);
27、根據(jù)信號(hào)分發(fā)函數(shù),分配對(duì)應(yīng)的信號(hào)處理函數(shù)依次處理未決信號(hào)集中的未決信號(hào),得到經(jīng)信號(hào)處理后的進(jìn)程。
28、第二方面,本發(fā)明實(shí)施例提供一種嵌入式實(shí)時(shí)操作系統(tǒng)中進(jìn)程的信號(hào)處理系統(tǒng),其包括:
29、嵌入式實(shí)時(shí)操作系統(tǒng)的初始化模塊,用于將用戶態(tài)的信號(hào)處理函數(shù)記錄在嵌入式實(shí)時(shí)操作系統(tǒng)的用戶系統(tǒng)調(diào)用庫(kù)中,并在啟動(dòng)之前,執(zhí)行用戶系統(tǒng)調(diào)用庫(kù)初始化,將用戶態(tài)未決信號(hào)集全局變量地址傳遞到進(jìn)程控制塊結(jié)構(gòu)體中,獲得內(nèi)核態(tài)未決信號(hào)集全局變量地址;
30、信號(hào)處理模塊,用于若存在進(jìn)程的觸發(fā)信號(hào),則將觸發(fā)信號(hào)記錄在內(nèi)核態(tài)未決信號(hào)集全局變量地址中,用戶系統(tǒng)調(diào)用庫(kù)調(diào)用進(jìn)程陷入內(nèi)核態(tài)時(shí),將用戶現(xiàn)場(chǎng)數(shù)據(jù)保存在內(nèi)核態(tài)線程棧中,和在內(nèi)核態(tài)中對(duì)觸發(fā)信號(hào)進(jìn)行內(nèi)核處理,將得到的未決信號(hào)集記錄在用戶態(tài)未決信號(hào)集全局變量地址;以及,根據(jù)內(nèi)核態(tài)線程棧中的用戶現(xiàn)場(chǎng)數(shù)據(jù)進(jìn)行恢復(fù)以使進(jìn)程返回用戶態(tài),并根據(jù)信號(hào)處理函數(shù)對(duì)未決信號(hào)集依次執(zhí)行信號(hào)處理。
31、第三方面,本發(fā)明實(shí)施例提供一種電子設(shè)備,其包括:
32、至少一個(gè)數(shù)據(jù)庫(kù);以及
33、與所述至少一個(gè)數(shù)據(jù)庫(kù)通信連接的存儲(chǔ)器;
34、其中,所述存儲(chǔ)器存儲(chǔ)有可被所述至少一個(gè)數(shù)據(jù)庫(kù)執(zhí)行的指令,所述指令被所述至少一個(gè)數(shù)據(jù)庫(kù)執(zhí)行,以使所述至少一個(gè)數(shù)據(jù)庫(kù)能夠執(zhí)行以上所述的嵌入式實(shí)時(shí)操作系統(tǒng)中進(jìn)程的信號(hào)處理方法步驟。
35、第四方面,本發(fā)明實(shí)施例提供一種計(jì)算機(jī)可讀介質(zhì),其上存儲(chǔ)有計(jì)算機(jī)可執(zhí)行指令,所述可執(zhí)行指令被處理器執(zhí)行時(shí)實(shí)現(xiàn)以上所述的嵌入式實(shí)時(shí)操作系統(tǒng)中進(jìn)程的信號(hào)處理方法步驟。
36、(三)有益效果
37、本發(fā)明的有益效果是:本發(fā)明的一種嵌入式實(shí)時(shí)操作系統(tǒng)中進(jìn)程的信號(hào)處理方法,由于采用將用戶態(tài)未決信號(hào)集全局變量地址進(jìn)行地址傳遞,以在內(nèi)核態(tài)中設(shè)置內(nèi)核態(tài)未決信號(hào)集全局變量地址用于記錄觸發(fā)信號(hào),并將觸發(fā)信號(hào)進(jìn)行內(nèi)核處理后得到的未決信號(hào)集傳入用戶態(tài)未決信號(hào)集全局變量地址中進(jìn)行記錄的技術(shù)方案。與現(xiàn)有技術(shù)相比較,其將未決信號(hào)集記錄在用戶態(tài)中,使得在用戶態(tài)下處理進(jìn)程的未決信號(hào)集后無(wú)需再次進(jìn)入內(nèi)核態(tài)訪問(wèn)其他未決信號(hào),減少了進(jìn)程狀態(tài)切換的次數(shù),使得壓棧和出棧的次數(shù)減少,進(jìn)而降低了進(jìn)程在信號(hào)處理過(guò)程中對(duì)cpu資源和內(nèi)存的消耗。
38、其次,信號(hào)處理函數(shù)記錄于用戶態(tài),對(duì)不同的進(jìn)程進(jìn)行隔離,使得進(jìn)程之間無(wú)法相互訪問(wèn),提高了進(jìn)程執(zhí)行時(shí)的安全性和隔離性。
39、還有,用戶態(tài)根據(jù)內(nèi)核處理后得到的未決信號(hào)集執(zhí)行用戶注冊(cè)的信號(hào)處理函數(shù),使得內(nèi)核態(tài)無(wú)需感知信號(hào)處理函數(shù),降低信號(hào)處理函數(shù)與內(nèi)核態(tài)的耦合性。