用戶態程序與內核交互報文的方法及系統的製作方法
2023-06-04 19:39:26
用戶態程序與內核交互報文的方法及系統的製作方法
【專利摘要】本發明公開了一種用戶態程序與內核交互報文的方法及系統,涉及作業系統【技術領域】,本發明通過設置內核和用戶態程序共享的內存,當內核有報文發送給用戶態程序時,僅需改變內存的數值,用戶態程序在初始化過程中映射了該內存,因此可以讀到該數值,用戶態程序通過簡單的讀取該數值來判斷是否有報文,如果有報文再去收取報文,避免了不停的系統調用,同時避免了大量的無效操作,提高了整個系統的性能。
【專利說明】用戶態程序與內核交互報文的方法及系統
【技術領域】
[0001]本發明涉及作業系統【技術領域】,特別涉及一種用戶態程序與內核交互報文的方法及系統。
【背景技術】
[0002]各種基於作業系統(例如:linux)開發的用戶態程序,都不可避免的會和內核有報文交互,用戶態程序可能是要內核將網絡報文發送出去,也可能是要把報文交給內核進入協議棧。
[0003]現有技術方法中的用戶態程序和內核之間的交互方法為:通過在用戶態創建一個線程,該線程不停的通過系統調用來獲取內核發送過來的數據,當內核有數據發給用戶態程序時,該系統調用執行成功,當沒有數據發給用戶態程序時,該系統調用執行失敗,但由於是通過線程不停的系統調用來獲取內核發送過來的數據,在作業系統正常的運行狀態下,大部分時間內核不會給用戶態程序發送報文,而大量系統調用使整個系統的性能大幅下降。
【發明內容】
[0004](一)要解決的技術問題
[0005]本發明要解決的技術問題是:如何提高系統的性能。
[0006](二)技術方案
[0007]為解決上述技術問題,本發明提供了一種用戶態程序與內核交互報文的方法,所述方法包括以下步驟:
[0008]S1:內核申請一塊物理地址連續的內存,並將所述內存設置為與用戶態程序共
[0009]S2:當所述內核向所述用戶態程序發送報文時,則改變所述內存中所存儲的數值;
[0010]S3:所述用戶態程序讀取所述內存中所存儲的數值,並判斷所述內存中所存儲的數值是否被改變,若所述數值被改變,則認定為所述內核向所述用戶態程序發送了報文,並進行報文接收。
[0011]其中,步驟SI包括:
[0012]SlO1:內核申請一塊物理地址連續的內存,並將申請到內存的虛擬地址轉換成物理地址;
[0013]S102:用戶態程序獲取所述內存的物理地址和大小,並將所述內存的物理地址通過mmap接口及所述內存大小轉換為用戶態程序能訪問的虛擬地址;
[0014]S103:內核通過全局指針g_pkernel來指向所述內存,用戶態程序通過全局指針g_pusr來指向所述內存,以實現內核與用戶態程序共享所述內存。
[0015]其中,步驟S2中,所述內核通過下式改變所述內存中所存儲的數值,[0016](* (size_t*)g_pkernel)+=1,
[0017]其中,*(size_t*) g_pkernel為size_t*類型的全局指針g_pkernel所指向的內存中的數值,+=I為自加I運算。
[0018]其中,步驟S3中,所述用戶態程序通過比較var和*(size_t*)g_pusr來判斷所述內存中所存儲的數值是否被改變,當var和*(size_t*)g_pusr不相等時,貝U認定為所述內核向所述用戶態程序發送了報文,var+=l,並進行報文接收;
[0019]其中,var為初值為O的變量,* (size_t*) g_pusr為size_t*類型的全局指針g_pusr所指向的內存中的數值。
[0020]其中,所述內核為Iinux作業系統的內核。
[0021]本發明還公開了一種用戶態程序與內核交互報文的系統,所述系統包括:內核和用戶態程序,
[0022]所述內核,用於申請一塊物理地址連續的內存,並將所述內存設置為與用戶態程序共孚;
[0023]所述內核,進一步用於向所述用戶態程序發送報文時,改變所述內存中所存儲的數值;
[0024]所述用戶態程序,用於讀取所述內存中所存儲的數值,並判斷所述內存中所存儲的數值是否被改變,若所述數值被改變,則認定為所述內核向所述用戶態程序發送了報文,並進行報文接收。
[0025]其中,所述內核,進一步用於申請一塊物理地址連續的內存,並將申請到內存的虛擬地址轉換成物理地址;
[0026]所述用戶態程序,進一步用於獲取所述內存的物理地址和大小,並將所述內存的物理地址通過_ap接口及所述內存大小轉換為用戶態程序能訪問的虛擬地址;
[0027]所述內核,進一步用於通過全局指針g_pkernel來指向所述內存,用戶態程序通過全局指針g_pusr來指向所述內存,以實現內核與用戶態程序共享所述內存。
[0028]其中,所述內核通過下式改變所述內存中所存儲的數值,
[0029](* (size_t*)g_pkernel)+=1,
[0030]其中,*(size_t*) g_pkernel為size_t*類型的全局指針g_pkernel所指向的內存中的數值,+=1為自加I運算。
[0031 ] 其中,所述用戶態程序通過比較var和* (size_t*) g_pusr來判斷所述內存中所存儲的數值是否被改變,當var和*(size_t*)g_pusr不相等時,貝U認定為所述內核向所述用戶態程序發送了報文,var+=l,並進行報文接收;
[0032]其中,var為初值為O的變量,* (size_t*) g_pusr為size_t*類型的全局指針g_pusr所指向的內存中的數值。
[0033]其中,所述內核為Iinux作業系統的內核。
[0034](三)有益效果
[0035]本發明通過設置內核和用戶態程序共享的內存,當內核有報文發送給用戶態程序時,僅需改變內存的數值,用戶態程序在初始化過程中映射了該內存,因此可以讀到該數值,用戶態程序通過簡單的讀取該數值來判斷是否有報文,如果有報文再去收取報文,避免了不停的系統調用,同時避免了大量的無效操作,提高了整個系統的性能。【專利附圖】
【附圖說明】
[0036]圖1是本發明一種實施方式的用戶態程序與內核交互報文的方法流程圖。
【具體實施方式】
[0037]下面結合附圖和實施例,對本發明的【具體實施方式】作進一步詳細描述。以下實施例用於說明本發明,但不用來限制本發明的範圍。
[0038]圖1是本發明一種實施方式的用戶態程序與內核交互報文的方法流程圖;參照圖1,所述方法包括以下步驟:
[0039]S1:內核申請一塊物理地址連續的內存,並將所述內存設置為與用戶態程序共
[0040]S2:當所述內核向所述用戶態程序發送報文時,則改變所述內存中所存儲的數值;
[0041]S3:所述用戶態程序讀取所述內存中所存儲的數值,並判斷所述內存中所存儲的數值是否被改變,若所述數值被改變,則認定為所述內核向所述用戶態程序發送了報文,並進行報文接收。
[0042]為了方便訪問內存,優選地,步驟SI包括:
[0043]SlOl:內核申請一塊物理地址連續的內存,並將申請到內存的虛擬地址轉換成物理地址;
[0044]S102:用戶態程序獲取(可在用戶態程序初始化時,通過系統調用等方法來獲取)所述內存的物理地址kernel_vir和大小,並將所述內存的物理地址通過mmap接口及所述內存大小轉換為用戶態程序能訪問的虛擬地址phyaddr ;
[0045]S103:內核通過全局指針g_pkernel來指向所述內存,用戶態程序通過全局指針g_pusr來指向所述內存,以實現內核與用戶態程序共享所述內存。
[0046]為便於改變內存中存儲的數值,優選地,步驟S2中,所述內核通過下式改變所述內存中所存儲的數值,
[0047](* (size_t*)g_pkernel)+=1,
[0048]其中,*(size_t*) g_pkernel為size_t*類型的全局指針g_pkernel所指向的內存中的數值,+=1為自加I運算。
[0049]為便於確認內核是否向用戶態程序發送了報文,優選地,步驟S3中,所述用戶態程序通過比較var和*(size_t*)g_pusr來判斷所述內存中所存儲的數值是否被改變,當var和*(size_t*)g_pusr不相等時,則認定為所述內核向所述用戶態程序發送了報文,var+=l,並進行報文接收;
[0050]其中,var為初值為O的變量,* (size_t*) g_pusr為size_t*類型的全局指針g_pusr所指向的內存中的數值(由於內核和用戶態程序共享所述內存,故而當內核對內存中存儲的數值進行改變後,則用戶態程序讀取到的所述內存中所存儲的數值也發生了相應改變);size_t是在標準C庫中定義的,在32位系統中時,其為unsigned int,是4位元組的(即32位);在64位系統中時,其為long unsigned int,是8位元組的(即64位),利用該類型可以增強程序的可移植性。[0051]在具體判斷所述內存中所存儲的數值是否被改變時,可由用戶態程序在初始化時,創建一個線程,該線程裡面有如下指令:
[0052]static size_t var=0 ;聲明一個靜態變量 var
[0053]if (var==*(size_t*)g_pusr)說明內核沒有向用戶態程序發送報文
[0054]else說明var和* (size_t*) g_pusr不相等了,表明內核向用戶態程序發送了報文,此時用戶態程序可以通過系統調用等方法去收取報文,然後設置var+=l,說明用戶態程序已經收到了一個報文,下次線程輪訓時,如果var和* (size_t*) g_pusr相等,說明已經沒有報文了,如果不相等說明還有報文。
[0055]上述指令,當內核有報文發送給用戶態程序時,將內存數值僅需做加I的改寫,用戶態程序在初始化過程中映射了該內存,因此可以讀到該數值,線程每次輪訓時通過簡單的讀取該數值來判斷是否有報文,如果有報文再通過系統調用去收取報文,避免了不停的系統調用,避免了大量的無效操作,提高了整個系統的性能。
[0056]優選地,所述內核為Iinux作業系統的內核。
[0057]本發明還公開了一種用戶態程序與內核交互報文的系統,所述系統包括:內核和用戶態程序,
[0058]所述內核,用於申請一塊物理地址連續的內存,並將所述內存設置為與用戶態程序共孚;
[0059]所述內核,進一步用於向所述用戶態程序發送報文時,改變所述內存中所存儲的數值;
[0060]所述用戶態程序,用於讀取所述內存中所存儲的數值,並判斷所述內存中所存儲的數值是否被改變,若所述數值被改變,則認定為所述內核向所述用戶態程序發送了報文,並進行報文接收。
[0061 ] 優選地,所述內核,進一步用於申請一塊物理地址連續的內存,並將申請到內存的虛擬地址轉換成物理地址;
[0062]所述用戶態程序,進一步用於獲取所述內存的物理地址和大小,並將所述內存的物理地址通過_ap接口及所述內存大小轉換為用戶態程序能訪問的虛擬地址;
[0063]所述內核,進一步用於通過全局指針g_pkernel來指向所述內存,用戶態程序通過全局指針g_pusr來指向所述內存,以實現內核與用戶態程序共享所述內存。
[0064]優選地,所述內核通過下式改變所述內存中所存儲的數值,
[0065](* (size_t*)g_pkernel)+=1,
[0066]其中,*(size_t*) g_pkernel為size_t*類型的全局指針g_pkernel所指向的內存中的數值,+=1為自加I運算。
[0067]優選地,所述用戶態程序通過比較var和* (size_t*) g_pusr來判斷所述內存中所存儲的數值是否被改變,當var和*(size_t*)g_pusr不相等時,貝U認定為所述內核向所述用戶態程序發送了報文,var+=l,並進行報文接收;
[0068]其中,var為初值為O的變量,* (size_t*) g_pusr為size_t*類型的全局指針g_pusr所指向的內存中的數值。
[0069]優選地,所述內核為Iinux作業系統的內核。
[0070]以上實施方式僅用於說明本發明,而並非對本發明的限制,有關【技術領域】的普通技術人員,在不脫離本發明的精神和範圍的情況下,還可以做出各種變化和變型,因此所有等同的技術方案也屬於本發明的範疇,本發明的專利保護範圍應由權利要求限定。
【權利要求】
1.一種用戶態程序與內核交互報文的方法,其特徵在於,所述方法包括以下步驟: S1:內核申請一塊物理地址連續的內存,並將所述內存設置為與用戶態程序共享; S2:當所述內核向所述用戶態程序發送報文時,則改變所述內存中所存儲的數值; S3:所述用戶態程序讀取所述內存中所存儲的數值,並判斷所述內存中所存儲的數值是否被改變,若所述數值被改變,則認定為所述內核向所述用戶態程序發送了報文,並進行報文接收。
2.如權利要求1所述的方法,其特徵在於,步驟SI包括: S101:內核申請一塊物理地址連續的內存,並將申請到內存的虛擬地址轉換成物理地址; S102:用戶態程序獲取所述內存的物理地址和大小,並將所述內存的物理地址通過mmap接口及所述內存大小轉換為用戶態程序能訪問的虛擬地址; S103:內核通過全局指針g_pkernel來指向所述內存,用戶態程序通過全局指針g_pusr來指向所述內存,以實現內核與用戶態程序共享所述內存。
3.如權利要求2所述的方法,其特徵在於,步驟S2中,所述內核通過下式改變所述內存中所存儲的數值,
(氺(size_t氺)g_pkernel)+=1, 其中,*(size_t*)g_pkernel為size_t*類型的全局指針g_pkernel所指向的內存中的數值,+=1為自加I運算。
4.如權利要求3所述的方法,其特徵在於,步驟S3中,所述用戶態程序通過比較var和*(size_t*)g_pusr來判斷所述內存中所存儲的數值是否被改變,當var和*(size_t*)g_pusr不相等時,則認定為所述內核向所述用戶態程序發送了報文,var+=l,並進行報文接收; 其中,var為初值為O的變量,*(size_t*)g_pusr為size_t*類型的全局指針g_pusr所指向的內存中的數值。
5.如權利要求1~4中任一項所述的方法,其特徵在於,所述內核為Iinux作業系統的內核。
6.一種用戶態程序與內核交互報文的系統,其特徵在於,所述系統包括:內核和用戶態程序, 所述內核,用於申請一塊物理地址連續的內存,並將所述內存設置為與用戶態程序共 所述內核,進一步用於向所述用戶態程序發送報文時,改變所述內存中所存儲的數值; 所述用戶態程序,用於讀取所述內存中所存儲的數值,並判斷所述內存中所存儲的數值是否被改變,若所述數值被改變,則認定為所述內核向所述用戶態程序發送了報文,並進行報文接收。
7.如權利要求6所述的系統,其特徵在於,所述內核,進一步用於申請一塊物理地址連續的內存,並將申請到內存的虛擬地址轉換成物理地址; 所述用戶態程序,進一步用於獲取所述內存的物理地址和大小,並將所述內存的物理地址通過-ap接口及所述內存大小轉換為用戶態程序能訪問的虛擬地址;所述內核,進一步用於通過全局指針g_pkernel來指向所述內存,用戶態程序通過全局指針g_pusr來指向所述內存,以實現內核與用戶態程序共享所述內存。
8.如權利要求7所述的系統,其特徵在於,所述內核通過下式改變所述內存中所存儲的數值,
(氺(size_t氺)g_pkernel)+=1, 其中,*(size_t*)g_pkernel為size_t*類型的全局指針g_pkernel所指向的內存中的數值,+=1為自加I運算。
9.如權利要求8所述的系統,其特徵在於,所述用戶態程序通過比較var和*(size_t*)g_pusr來判斷所述內存中所存儲的數值是否被改變,當var和* (size_t*) g_pusr不相等時,則認定為所述內核向所述用戶態程序發送了報文,var+=l,並進行報文接收; 其中,var為初值為O的變量,*(size_t*)g_pusr為size_t*類型的全局指針g_pusr所指向的內存中的數值。
10.如權利要求6~9中任一項所述的系統,其特徵在於,所述內核為Iinux作業系統 的內核。
【文檔編號】G06F12/02GK103942149SQ201410118936
【公開日】2014年7月23日 申請日期:2014年3月27日 優先權日:2014年3月27日
【發明者】李鵬 申請人:漢柏科技有限公司