999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

利用內核腳本執行引擎優化系統調用過程

2021-04-20 06:34:04夏盛明
電子技術與軟件工程 2021年3期
關鍵詞:引擎進程用戶

夏盛明

(福州理工學院計算與信息科學學院 福建省福州市 350000)

在Linux 系統,進程訪問內核服務,調用系統調用的過程中需要進行用戶態和內核態的轉換。進程執行系統調用進行狀態切換是個耗時的過程,目前在改進Linux 系統調用的性能已有許多研究工作。如multi-call 機制[1],在內核中實現了系統調用代理,通過將用戶進程多次執行的系統調用函數進行合并,組成系統調用函數數組,在一次系統調用過程中,由內核系統調用代理執行函數數組中的函數。這種方式減少了用戶進程執行系統調用時的狀態轉換次數,但是,multi-call 機制中的系統調用代理不能夠執行進程位于用戶空間的代碼,如果在執行多個系統調用函數之間必須執行用戶空間代碼,那么這些系統調用函數將不能進行合并執行。所以,當進程在一個循環中執行多個系統調用時,multi-call 機制可能減少進程狀態轉換的次數,但是不能實現使進程只經過一次狀態變換就能執行完成循環中的所有系統調用。實現內核專門功能模塊方式,采用的方法是將用戶進程需要訪問內核服務的功能實現為一個內核模塊,每次用戶進程只需要調用內核模塊提供的服務即可,去除了多次狀態轉換,提高了程序運行效率。但是此種方式,靈活度不高,只能滿足特定要求,很難具有通用性。二進制重寫技術[2]方式,采取的途徑是對內核中運行函數代碼進行優化處理,如將對內核中函數的調用轉換為內聯對應函數的代碼,去除了函數調用過程,減少了函數執行時間。位于內核中的用戶進程[3]方式,考慮了將用戶進程放入內核中執行,實現程序性能的提升等。

本文介紹了通過內核腳本執行引擎提升用戶進程執行系統調用的性能。下文具體安排如下,先介紹了分析了Linux 系統調用具體過程,其次再介紹了內核腳本執行引擎的設計及組成結構,最后分別通過內核腳本執行引擎,普通系統調用機制實現對不同大小文件拷貝,測試完成操作耗費的時間。通過對測試結果的對比分析,證明了在用戶進程需要頻繁訪問系統調用進行狀態切換時,通過內核腳本執行引擎實現系統調用過程,能夠顯著的提升應用程序的性能。

1 系統調用過程

在Linux 系統中,程序的運行空間分為用戶空間和內核空間(用戶態和內核態)。在用戶空間和內核空間運行的進程擁有不同運行級別,在邏輯上是相互隔離。用戶進程通常不允許訪問內核,當用戶進程需要獲得一定的系統服務時候,就必須使用系統調用。系統調用規定了用戶進程進入內核空間的位置,然后程序運行空間由用戶態進入內核態完成相關處理,處理完成后再返回到用戶態。

Linux 系統調用是作為一種異常類型實現,用戶進程通過執行特定的機器代碼指令來產生異常信號,然后自動將系統切換為內核態。在x86 體系結構中,內核支持通過兩種方式實現系統調用,即執行int 0x80 指令或者執行sysenter 指令。系統調用完成后,再執行iret 指令或sysexit 指令將系統從返回到用戶態。下面只介紹使用int 0x80 指令實現系統調用的具體過程,使用sysenter 指令情況以此類似。

用戶進程執行系統調用的其主要過程為:用戶進程序進行必要的寄存器參數設置后,執行int 0x80 指令,系統硬件切換用戶堆棧到內核堆棧,并將相關寄存器壓入到內核堆棧中,然后執行system_call 函數,該函數保存寄存器參數值,并根據eax 寄存器值確定sys_call_table 表中對應的系統調用函數,調用對應函數執行,執行完畢后,system_call 函數恢復用戶進程在用戶堆棧中保存的寄存器值,將當前進程從內核態轉換到用戶態,使用戶進程在返回到用戶空間后繼續執行。

系統調用的執行過程中,需要對進程的用戶空間和內核空間中的寄存器進行保存和恢復,即保護現場,恢復現場的操作。當用戶進程頻繁的訪問系統調用時,執行現場的保護和恢復的操作將要耗費較多時間,所以通過減少用戶進程執行系統調用時狀態轉換次數,進而減少用戶進程不必要的狀態轉換時間,是提高用戶進程執行系統服務性能的一種途徑。

在用戶空間編寫的程序,使用的是位于用戶空間的庫函數,由庫函數負責執行具體的系統調用過程。對用戶空間不同的系統調用函數,在內核中都有對應得系統調用服務函數,例如讀文件,寫文件,刪除文件等,因此將普通程序中對庫函數調用轉換成對內核空間系統調用處理函數的調用,是可實現的。

2 內核腳本執行引擎

2.1 工作原理

將內核腳本執行引擎實現為一個可裝載的內核模塊[4],作為一個虛擬設備驅動掛載在Linux 系統設備文件目錄下,普通用戶可通過訪問對應路徑與之進行通信。內核腳本執行引擎是通過讀取用戶進程提供的腳本文件,進行編譯,鏈接內核中函數并執行,完成戶進程相應得請求內核服務。

內核腳本執行引擎工作流程為,用戶進程將普通腳本文件路徑提供給內核腳本執行引擎,內核腳本執行引擎裝載腳本文件進行編譯,同時將程序中訪問的用戶空間系統調用入口函數轉換為內核系統調用服務函數,然后進行鏈接,最后生成可執行代碼,對可執行代碼進行注冊,然后將注冊信息返回給用戶進程,用戶進程可憑借注冊信息向內核腳本執行引擎提出請求,內核腳本執行引擎依據注冊信息執行相應代碼。如果在編譯注冊腳本文件過程中出現錯誤,內核腳本執行引擎將通知用戶進程服務注冊失敗,放棄此次操作。

內核腳本執行引擎由系統調用注冊模塊,符號管理模塊,編譯模塊,鏈接模塊,執行模塊組成。系統結構圖如圖1 所示。

2.2 系統調用服務注冊模塊

用戶進程向系統調用服務模塊提供腳本文件路徑進行系統調用服務請求。系統調用服務模塊判斷用戶進程提供的腳本文件信息是否已注冊,如果未注冊,服務模塊將把腳本文件路徑交給編譯模塊,由編譯模塊讀取腳本文件,進行編譯生成執行代碼,再由鏈接模塊負責內核函數的鏈接,最后由執行模塊進行執行;如果用戶進程系統請求腳本文件已注冊,系統調用服務模塊將通知執行模塊直接執行對應的代碼塊。各模塊將處理的結果信息反饋給系統調用服務模塊,由系統調用服務模塊進行處理。

2.3 編譯模塊

編譯模塊實現了如下主要功能:詞法分析,語法分析,生成分析樹,語義分析,中間代碼生成,代碼優化,非法寫內存操作檢測,程序數據內存分配,目標代碼生成。內核腳本執行引擎結構圖如圖1 所示。

詞法分析的過程通過構造確定性有限狀態自動機[5],識別出的源文件中的字符,數字,關鍵字,變量,字符串,注釋等,形成標記,并鏈入標記鏈表中。標記鏈表是雙向鏈表,其中的每個元素包含了當前標記的具體信息,例如類型,值等。對識別出的變量標記,將在符號管理模塊中進行登記,變量包括了全局變量和當前函數中定義的局部變量。

語法分析的實現是通過編譯模塊讀取文法定義文件,依據文法規則,采用LR 語法分析算法,獲得可能出現的分析狀態集合,構造LR 分析表,包含了Action 表和Goto 表,采用下推自動機模型,實現在時間復雜度為O(N)的情況下,完成對標記鏈表分析。語法分析共包含四種操作,分別是移進,歸約,報錯,接受。移動操作,對應得是讀入標記鏈表中的下一個標記,壓入分析棧中;歸約操作,是將分析棧中涉及標記,依照規約操作中對應得產生式,合并成一個新的標記;報錯操作,則是停止分析,將錯誤信息返回給服務注冊模塊,由服務注冊模塊進行處理;接受操作,分析完成,此時分析結果將只存在一個程序塊標記或全局變量定義標記,標記鏈中的標記已分析完成。

生成分析樹是對語法分析的結果標記進行遞歸下降分析構造的過程。分析樹中的節點結構中包括了一個左子節點,一個右子節點以任意數目的伙伴節點等。節點類型包括了函數體,語句塊,語句,表達式,變量,關鍵字等。不同類型的節點擁有子節點的情況各不相同。單個變量是葉子節點,不具有子節點和伙伴節點。一維運算表達式只擁有左子節點。二維算數表達式擁有左子節點和右子節點。循環語句結構則擁有左子節點,右子節點和擁有多個伙伴節點等。

中間代碼生成和語義分析同時進行。中間代碼生成是對分析樹進行遍歷,產生偽代碼指令鏈表的過程。分析樹中不同類型的節點,都有對應的偽指令生成模塊用于偽指令生成,在遍歷分析樹的過程中,只要調用節點對應偽指令生成模塊實現偽指令生成。與此同時進行語義分析,依據節點的類型分析當前節點的結構,執行的操作是否有效。例如分析表達式是否有效,即按照當前表達式中變量的類型是否合法,表達式的操作是否合法,進而判斷表達式是否有效。

代碼優化,目前主要是實現了對無用偽指令代碼的刪除。中間代碼的產生是按照節點對應的生成模塊產生的,生成的偽指令代碼存在無用代碼,對可能是無用指令代碼的部分設定范圍標識,如果經過判斷確定該范圍內偽指令代碼不被使用,則將此范圍的偽指令代碼可從偽代碼指令鏈中刪除。

非法寫內存操作檢測,實現的功能是檢測程序中動態的訪問內存地址并進行寫操作的指令,判斷其所訪問的內存地址是否合法。進程在內核中執行,需要保證進程不能夠非法修改內核中其他重要的數據結構,進程中的執行函數只能修改當前進程定義的變量包括了全局變量,局部變量,函數傳遞參數等。編譯模塊為當前執行進程分配了固定的內存區域用于變量的存儲,進程能夠進行寫內存操作的目標地址也只能在此區域內。對程序中動態寫內存的指令,編譯模塊在編譯時,在該指令前插入了用于判斷目標內存地址是否在當前程序分配的固定內存區域內的檢測指令。在程序運行時,檢測指令將判斷寫內存操作所訪問的內存地址是否處于當前程序分配的內存區域內,如果所訪問的內存地址不屬于分配的內存區域,說明程序執行的寫內存操作是非法的,檢測指令將會使程序停止運行,并報告程序寫內存操作非法錯誤。對于固定內存地址訪問,編譯模塊不添加監視指令,因為訪問內存地址已知,并且位于程序分配的內存區域內。

程序數據內存分配。當前采取的方式是編譯模塊為用戶進程預分配了固定大小內存區域,用于存儲當前執行函數的局部變量及傳遞的參數。在函數調用過程中,編譯模塊通過堆棧傳遞參數,同時編譯模塊在當前函數分配的內存區域內,也分配了對應參數存儲的內存,并在函數指令開始部分插入參數移動指令,負責將堆棧上的參數移動到程序分配的內存區內。用戶定義的函數只訪問和修改處于函數內存分配區域中的參數。并通過非法寫內存操作檢測,防止用戶進程修改調用堆棧中的操作。目前只針對用戶編寫的腳本文件代碼進行分析,未考慮調用庫函數等因素。目前暫不支持函數遞歸調用。

目標代碼生成,是將偽指令代碼直接翻譯成機器指令的過程,目前只支持Intel x86 指令集。通過遍歷偽指令代碼鏈即實現此過程,同時對函數調用指令進行記錄,用于鏈接模塊進行內核函數及用戶自定義函數的鏈接。

2.4 鏈接模塊

鏈接模塊通過獲取編譯模塊產生的函數調用記錄,包括了用戶自定義函數和系統調用函數,對腳本文件中系統調用函數的調用,鏈接模塊能夠自動匹配腳本中使用的系統調用函數和相應的內核函數,通過查找獲得相應內核函數地址,然后更新目標代碼中函數調用指令中函數偏移量值,實現程序對內核系統調用函數的引用。同時,內核中存在部分函數不能夠通過此方式進行直接鏈接,鏈接模塊實現了為這樣的函數實現了相應的適配函數,對這類內核函數,鏈接模塊將鏈接相應的適配函數,由適配函數實現對內核系統調用服務函數的調用。

2.5 執行模塊

依據調用服務注冊傳遞的代碼塊注冊信息,創建一個內核任務,執行對應的代碼塊,并將執行結果返回給系統調用服務注冊模塊。

2.6 符號管理模塊

記錄了編譯模塊和鏈接模塊中使用的符號信息和占用內存信息。涉及的符號包括了函數符號以及結構體,字符串,數值等變量符號。函數符號記錄了函數起始地址,函數塊的大小等信息;變量符號記錄了變量存儲的內存地址,變量的類型,占用內存大小等信息。

3 實驗

測試環境中Linux 操作系統為Gentoo,Linux 內核版本為2.6.30,內存為512M,CPU 為1.50GHZ,gcc 版本為4.1.2。分別采用內核腳本執行引擎編譯腳本執行以及普通的文件拷貝程序,實現對不同大小文件的拷貝操作,使用gettimeofday 函數獲取程序的執行時間。用于文件拷貝的緩沖大小為4096 字節。測試中實現文件拷貝源程序代碼如圖2。用戶程序通過gcc 編譯生成可執行程序,生成代碼未使用優化選項。使用腳本執行引擎方式,既可在內核中將此源程序實現為一個拷貝文件的函數,然后在腳本文件中引用此函數實現文件的拷貝,也可將此源程序直接提供給腳本執行引擎,由腳本執行引擎編譯生成執行代碼,執行完成文件的拷貝。為了測量內核中執行拷貝操作所能達到性能的最大提升,測試中采取了前一種方式。實際測試過程中,每類數據共測試100 次,取其平均值,測試結果如圖3。采用腳本執行引擎實現文件拷貝獲得的性能提升如圖4。

通過圖4 可看出,使用內核腳本執行引擎實現文件拷貝,相對于普通用戶程序執行文件拷貝,在性能上有很大提升。

圖1:內核腳本執行引擎結構圖

圖2:文件拷貝源程序

圖3:文件拷貝時間折線圖

圖4:文件拷貝優化比率

4 小結

本文介紹了利用內核腳本執行引擎編譯執行用戶進程提供的腳本文件,完成用戶進程執行系統調用的操作,減少了用戶進程進行狀態轉換的次數,提高用戶進程執行系統調用的性能,為用戶進程實現優化系統調用過程提供了較為簡便的途徑。目前已有許多關于提升Linux 運行性能的研究工作正在持續展開,例如提升Realtime Linux 系統性能[6][7],針對Arm 芯片上系統的性能優化[8][9][10],這些改善系統性能的工作應用于當前的工業控制領域具有一定的意義。

猜你喜歡
引擎進程用戶
債券市場對外開放的進程與展望
中國外匯(2019年20期)2019-11-25 09:54:58
藍谷: “涉藍”新引擎
商周刊(2017年22期)2017-11-09 05:08:31
關注用戶
商用汽車(2016年11期)2016-12-19 01:20:16
關注用戶
商用汽車(2016年6期)2016-06-29 09:18:54
關注用戶
商用汽車(2016年4期)2016-05-09 01:23:12
無形的引擎
河南電力(2015年5期)2015-06-08 06:01:46
基于Cocos2d引擎的PuzzleGame開發
如何獲取一億海外用戶
創業家(2015年5期)2015-02-27 07:53:25
社會進程中的新聞學探尋
民主與科學(2014年3期)2014-02-28 11:23:03
我國高等教育改革進程與反思
教育與職業(2014年7期)2014-01-21 02:35:04
主站蜘蛛池模板: 午夜电影在线观看国产1区| 日韩精品免费一线在线观看| 国产黄色片在线看| 亚洲性视频网站| 国产av剧情无码精品色午夜| 色亚洲成人| 国产一区二区三区在线观看视频| 99精品这里只有精品高清视频| 波多野结衣第一页| 91网址在线播放| 欧美黄网站免费观看| 99热国产这里只有精品9九| 日韩av无码DVD| 国产成人h在线观看网站站| 美女高潮全身流白浆福利区| 国产又爽又黄无遮挡免费观看| 精品国产电影久久九九| 91美女在线| 激情午夜婷婷| 久久精品娱乐亚洲领先| 91九色视频网| 国产呦精品一区二区三区网站| 男女性色大片免费网站| 91亚瑟视频| 热九九精品| 孕妇高潮太爽了在线观看免费| 在线亚洲精品福利网址导航| 成年A级毛片| 中文成人无码国产亚洲| 久久久久亚洲av成人网人人软件| 亚洲日韩日本中文在线| 久久不卡精品| 国产精品专区第1页| 天天综合网亚洲网站| 亚洲第一视频区| 美女无遮挡被啪啪到高潮免费| 五月婷婷综合色| 欧美人人干| 日韩精品无码免费一区二区三区| 99精品这里只有精品高清视频| 97在线免费视频| 凹凸精品免费精品视频| 亚洲av成人无码网站在线观看| 91色爱欧美精品www| 台湾AV国片精品女同性| 欧美精品1区2区| 成人午夜福利视频| 永久在线精品免费视频观看| 国产91视频免费观看| 激情视频综合网| 麻豆AV网站免费进入| 国产成人一级| 久久永久免费人妻精品| 国产手机在线ΑⅤ片无码观看| 欧美 国产 人人视频| 91午夜福利在线观看| 丰满的熟女一区二区三区l| 亚洲第一黄色网| 91极品美女高潮叫床在线观看| 久久综合结合久久狠狠狠97色 | 国产亚洲精久久久久久无码AV| 国产Av无码精品色午夜| 亚洲欧美一区在线| 国产一区二区三区在线观看视频| 久久激情影院| 一级毛片免费观看久| 亚洲第一黄色网址| 亚洲区视频在线观看| 亚洲成a人片77777在线播放| 久久午夜夜伦鲁鲁片不卡| 亚洲欧美精品在线| 伊人成人在线| 在线观看国产精美视频| 伊人久久综在合线亚洲91| 中文字幕在线永久在线视频2020| 老司机午夜精品网站在线观看 | 亚洲成人在线免费| 日韩人妻少妇一区二区| 亚洲国产精品人久久电影| AV熟女乱| 青青青视频免费一区二区| 欧美丝袜高跟鞋一区二区|