專利名稱:基于用戶模式多任務(wù)下控制硬件設(shè)備的方法及其裝置的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及計算機技術(shù)領(lǐng)域,特別是涉及基于用戶模式多任務(wù)下驅(qū)動器控制硬件設(shè)備的方法及其裝置。
背景技術(shù):
Unix系統(tǒng)如Linux下的程序都可以工作在兩種模式下用戶模式(User Mode)以及內(nèi)核模式(KerneI Mode)。用戶模式一個在用戶模式下運行的程序,只能受限制地訪問部分系統(tǒng)資源,不能直接訪問內(nèi)核(Kernel)數(shù)據(jù)結(jié)構(gòu),不能直接與內(nèi)核程序交互。
內(nèi)核模式一個在內(nèi)核模式下運行的程序,可以執(zhí)行任何CPU指令,訪問4G以32位中央處理器CPU (Central Processing Unit)為例存儲空間的任意位置,也可以直接訪問內(nèi)核數(shù)據(jù)結(jié)構(gòu)或程序。驅(qū)動器是指通過某個文件系統(tǒng)格式化并帶有一個驅(qū)動器號的存儲區(qū)域。驅(qū)動器在整個控制環(huán)節(jié)中,正好處于主控制箱(Main Controller)以及馬達(Motor)的中間環(huán)節(jié),它的主要功能是接收來自主控制箱的信號,然后將信號進行處理再轉(zhuǎn)移至馬達以及和馬達有關(guān)的感應(yīng)器,并且將馬達的工作情況反饋至主控制箱。為了實現(xiàn)多任務(wù)下的硬件設(shè)備及數(shù)據(jù)共享,主流的Linux驅(qū)動器(Driver)都是エ作在內(nèi)核模式下的,但這樣會導(dǎo)致產(chǎn)生至少以下幾個缺陷第一,由于驅(qū)動器做在了 Linux內(nèi)核里面,難以回避通用公共許可證(GPLlicense)傳染,并且必須公開自己的源代碼(Source Code),這在某些商用領(lǐng)域是很難接受的。第二,應(yīng)用程序需要頻繁地出入內(nèi)核模式,對ー些功能復(fù)雜的硬件設(shè)備,例如圖形處理顯示器頻繁地出入內(nèi)核,將帶來巨大的系統(tǒng)開銷,直接導(dǎo)致整個系統(tǒng)性能的下降。第三,在內(nèi)核模式下的驅(qū)動器,一旦某個程序訪問擁堵通常會造成整個系統(tǒng)運行的擁堵,即便這個程序訪問擁堵只是由某一個進程(Process)的錯誤造成的。而在用戶模式下驅(qū)動器某個程序訪問擁堵通常只會導(dǎo)致使用它的那ー個進程擁堵,不會影響到系統(tǒng)及其它進程。第四,硬件設(shè)備調(diào)試很不方便,特別是對ー些需要經(jīng)常訪問硬件設(shè)備寄存器(Register)的情況,更是如此?,F(xiàn)行已有的某些基于用戶模式的驅(qū)動器,也只能應(yīng)用在一些相對簡單的硬件設(shè)備上,無法做到在多任務(wù)環(huán)境下,應(yīng)用程序隨機、安全地對硬件設(shè)備進行訪問。
發(fā)明內(nèi)容
本發(fā)明主要解決的技術(shù)問題是提供一種基于用戶模式多任務(wù)下驅(qū)動器控制硬件設(shè)備的方法及其裝置,能夠大幅提升訪問復(fù)雜硬件設(shè)備時驅(qū)動器的性能,又能很好地實現(xiàn)在多任務(wù)環(huán)境下對硬件設(shè)備的隨機安全訪問。
為解決上述技術(shù)問題,本發(fā)明采用的一個技術(shù)方案是提供一種基于用戶模式多任務(wù)下驅(qū)動器控制硬件設(shè)備的方法,包括在用戶模式下接收需要訪問硬件設(shè)備的進程訪問該硬件設(shè)備的請求,該請求中含有所述需要訪問硬件設(shè)備的進程的標識(ID);判斷所述需要訪問硬件設(shè)備的進程是否獲取了訪問該硬件設(shè)備的互斥鎖;若所述需要訪問硬件設(shè)備的進程獲取了訪問該硬件設(shè)備的互斥鎖,則判斷所述需要訪問硬件設(shè)備的進程的ID與最近一次訪問該硬件設(shè)備的進程的ID是否相同;若所述需要訪問硬件設(shè)備的進程的ID與最近一次訪問該硬件設(shè)備的進程的ID不相同,則在所述需要訪問硬件設(shè)備的進程和最近一次訪問該硬件設(shè)備的進程之間進行上下文切換,使得所述需要訪問硬件設(shè)備的進程使用該硬件設(shè)備。其中,還包括從已保存的所述需要訪問硬件設(shè)備的進程的進程鏡像文件讀出寄 存器和I/o狀態(tài)數(shù)據(jù)或上述兩者之一,并將其寫入該硬件設(shè)備,該硬件設(shè)備恢復(fù)為所述需要訪問硬件設(shè)備的進程的配置。其中,所述進程鏡像文件是指用戶模式下驅(qū)動器的進程鏡像中的文件,該文件用于保存該硬件設(shè)備寄存器和I/o狀態(tài)數(shù)據(jù)或上述兩者之一且為每個進程所獨享的數(shù)據(jù)。其中,還包括若所述需要訪問硬件設(shè)備的進程獲取了訪問該硬件設(shè)備的互斥鎖,判斷所述需要訪問硬件設(shè)備的線程的ID與已經(jīng)獲得該互斥鎖的線程的ID是否相同;若與已經(jīng)獲得該互斥鎖的線程的ID相同,則將互斥鎖計數(shù)器的值加1,并且所述需要訪問硬件設(shè)備的線程繼續(xù)使用該硬件設(shè)備;若與已經(jīng)獲得該互斥鎖的線程的ID不相同,則所述需要訪問硬件設(shè)備的線程等待,直到獲得該互斥鎖。其中,還包括若所述需要訪問硬件設(shè)備的進程的ID與最近一次訪問該硬件設(shè)備的進程的ID相同,則所述需要訪問硬件設(shè)備的進程繼續(xù)使用該硬件設(shè)備。其中,還包括判斷所述需要訪問硬件設(shè)備的進程的互斥鎖計數(shù)器的值是否大于等于I;若該互斥鎖計數(shù)器的值大于等于1,則表示所述需要訪問硬件設(shè)備的進程已獲取了訪問該硬件設(shè)備的互斥鎖,若該互斥鎖計數(shù)器的值小于1,則表示所述需要訪問硬件設(shè)備的進程沒有獲取訪問該硬件設(shè)備的互斥鎖。其中,還包括所述需要訪問硬件設(shè)備的進程使用結(jié)束該硬件設(shè)備后,判斷所述需要訪問硬件設(shè)備的進程的互斥鎖計數(shù)器的值是否小于I;若該互斥鎖計數(shù)器的值小于1,則釋放該互斥鎖,并退出使用該硬件設(shè)備的狀態(tài),若該互斥鎖計數(shù)器的值大于等于1,則將互斥鎖計數(shù)器的值減I。其中,所述需要訪問硬件設(shè)備的進程是通過ー個或者多個應(yīng)用程序編程接ロ API來使用該硬件設(shè)備的。其中,還包括判斷該請求是否屬于資源獨占模式請求,若為資源獨占模式請求,則所述資源獨占模式下的起始應(yīng)用程序編程接ロ API獲取訪問該硬件設(shè)備的互斥鎖,并且所述需要訪問硬件設(shè)備的進程連續(xù)使用該硬件設(shè)備直到所述需要訪問硬件設(shè)備的進程完成所有的作業(yè);在所述需要訪問硬件設(shè)備的進程完成所有的作業(yè)之后,釋放該互斥鎖,并退出使用該硬件設(shè)備的狀態(tài)。其中,還包括注冊所述需要訪問硬件設(shè)備的進程的程序終止處理函數(shù),該程序終止處理函數(shù)用于回收所述需要訪問硬件設(shè)備的進程所有的數(shù)據(jù)信息并還原該硬件設(shè)備狀態(tài)。
其中,還包括判斷所述需要訪問硬件設(shè)備的進程是否正使用該硬件設(shè)備;若所述需要訪問硬件設(shè)備的進程正使用該硬件設(shè)備,則釋放該硬件設(shè)備;若所述需要訪問硬件設(shè)備的進程沒有使用該硬件設(shè)備,則判斷該進程的互斥鎖計數(shù)器的值是否大于等于I ;若該互斥鎖計數(shù)器的值大于等于1,則釋放該互斥鎖,將該互斥鎖計數(shù)器的值設(shè)為0,退出所述需要訪問硬件設(shè)備的進程。其中,還包括對所述需要訪問硬件設(shè)備的進程進行驅(qū)動器初始化。其中,還包括判斷所述需要訪問硬件設(shè)備的進程是否是第一個請求訪問該硬件設(shè)備的進程;若是第一個請求訪問該硬件設(shè)備的進程,則所述需要訪問硬件設(shè)備的進程創(chuàng)建一個基于線程互斥訪問的互斥鎖以及共享鏡像文件,若不是第一個請求訪問該硬件設(shè)備的進程,則所述需要訪問硬件設(shè)備的進程獲取已經(jīng)創(chuàng)建好的互斥鎖以及共享鏡像文件。
其中,所述共享鏡像文件是指用戶模式下驅(qū)動器的共享鏡像中的文件,該文件用于保存該硬件設(shè)備寄存器和I/o狀態(tài)數(shù)據(jù)或上述兩者之ー且為所有進程所共享的數(shù)據(jù)。為解決上述技術(shù)問題,本發(fā)明采用的另ー個技術(shù)方案是提供一種基于用戶模式多任務(wù)下驅(qū)動器控制硬件設(shè)備的裝置,包括接收模塊,用于在用戶模式下接收需要訪問硬件設(shè)備的進程訪問該硬件設(shè)備的請求,該請求中含有所述需要訪問硬件設(shè)備的進程的ID ;第一判斷模塊,用于判斷所述需要訪問硬件設(shè)備的進程是否獲取了訪問該硬件設(shè)備的互斥鎖;第二判斷模塊,用于在所述需要訪問硬件設(shè)備的進程獲取了訪問該硬件設(shè)備的互斥鎖吋,則判斷所述需要訪問硬件設(shè)備的進程的ID與最近一次訪問該硬件設(shè)備的進程的ID是否相同;切換與使用模塊,用于在所述需要訪問硬件設(shè)備的進程的ID與最近一次訪問該硬件設(shè)備的進程的ID不相同時,則在所述需要訪問硬件設(shè)備的進程和最近一次訪問該硬件設(shè)備的進程之間進行上下文切換,所述需要訪問硬件設(shè)備的進程使用該硬件設(shè)備。其中,所述切換與使用模塊具體用于從已保存的所述需要訪問硬件設(shè)備的進程鏡像文件讀出寄存器和I/O狀態(tài)數(shù)據(jù)或上述兩者之一,并將其寫入該硬件設(shè)備,該硬件設(shè)備恢復(fù)為所述需要訪問硬件設(shè)備的進程的配置。其中,所述進程鏡像文件是指用戶模式下驅(qū)動器的進程鏡像中的文件,該文件用于保存該硬件設(shè)備寄存器和I/o狀態(tài)數(shù)據(jù)或上述兩者之一且為每個進程所獨享的數(shù)據(jù)。其中,所述裝置還包括第三判斷模塊,用于在所述需要訪問硬件設(shè)備的進程獲取了訪問該硬件設(shè)備的互斥鎖時,判斷所述需要訪問硬件設(shè)備的線程的ID與已經(jīng)獲得該互斥鎖的線程的ID是否相同;第一執(zhí)行模塊,用于在與已經(jīng)獲得該互斥鎖的線程的ID相同吋,則將互斥鎖計數(shù)器的值加1,并且所述需要訪問硬件設(shè)備的線程繼續(xù)使用該硬件設(shè)備;在與已經(jīng)獲得該互斥鎖的線程的ID不相同時,則所述需要訪問硬件設(shè)備的線程等待,直到獲得該互斥鎖。其中,所述裝置還包括第二執(zhí)行模塊,所述第二執(zhí)行模塊具體用于在所述需要訪問硬件設(shè)備的進程的ID與最近一次訪問該硬件設(shè)備的進程的ID相同時,則所述需要訪問硬件設(shè)備的進程繼續(xù)使用該硬件設(shè)備。其中,所述第一判斷模塊包括第一判斷単元,用于判斷所述需要訪問硬件設(shè)備的進程的互斥鎖計數(shù)器的值是否大于等于I ;互斥鎖單元,用于在該互斥鎖計數(shù)器的值大于等于I吋,則表示所述需要訪問硬件設(shè)備的進程獲取了訪問該硬件設(shè)備的互斥鎖,在該互斥鎖計數(shù)器的值小于1,則表示所述需要訪問硬件設(shè)備的進程沒有獲取訪問該硬件設(shè)備的互斥鎖。其中,所述裝置還包括第四判斷模塊,用于所述需要訪問硬件設(shè)備的進程使用結(jié)束該硬件設(shè)備后,判斷所述需要訪問硬件設(shè)備的進程的互斥鎖計數(shù)器的值是否小于I ;第三執(zhí)行模塊,用于在該互斥鎖計數(shù)器的值小于I吋,則釋放該互斥鎖,并退出使用該硬件設(shè)備的狀態(tài),在該互斥鎖計數(shù)器的值大于等于I吋,則將互斥鎖計數(shù)器的值減I。其中,所述需要訪問硬件設(shè)備的進程是通過ー個或者多個應(yīng)用程序編程接ロ API來使用該硬件設(shè)備的。其中,所述裝置還包括資源獨占模塊,所述資源獨占模塊包括硬件設(shè)備獨占單元,用于判斷該請求是否屬于資源獨占模式請求,在判斷為資源獨占模式請求時,則所述資源獨占模式下的起始應(yīng)用程序編程接ロ API獲取訪問該硬件設(shè)備的互斥鎖,并且所述需要 訪問硬件設(shè)備的進程連續(xù)使用該硬件設(shè)備直到所述需要訪問硬件設(shè)備的進程完成所有的作業(yè);硬件設(shè)備退出単元,用于在所述需要訪問硬件設(shè)備的進程完成所有的作業(yè)之后,釋放該互斥鎖,并退出使用該硬件設(shè)備的狀態(tài)。其中,所述裝置還包括程序終止處理函數(shù)模塊,所述程序終止處理函數(shù)模塊具體用于回收所述需要訪問硬件設(shè)備的進程所有的數(shù)據(jù)信息并還原該硬件設(shè)備狀態(tài),包括硬件設(shè)備釋放単元,用于在所述需要訪問硬件設(shè)備的進程正使用該硬件設(shè)備時,則釋放該硬件設(shè)備;第三判斷単元,用于在所述需要訪問硬件設(shè)備的進程沒有使用該硬件設(shè)備時,則判斷該進程的互斥鎖計數(shù)器的值是否大于等于I ;互斥鎖釋放単元,用于在該互斥鎖計數(shù)器的值大于等于I吋,則釋放該互斥鎖,將該互斥鎖計數(shù)器的值設(shè)為0,退出所述需要訪問硬件設(shè)備的進程。其中,所述裝置還包括驅(qū)動器初始化模塊,所述驅(qū)動器初始化模塊包括第四判斷単元,用于判斷所述需要訪問硬件設(shè)備的進程是否是第一個請求訪問該硬件設(shè)備的進程;驅(qū)動器初始化單元,用于在是第一個請求訪問該硬件設(shè)備的進程時,則所述需要訪問硬件設(shè)備的進程創(chuàng)建一個基于線程互斥訪問的互斥鎖以及共享鏡像文件,在不是第一個請求訪問該硬件設(shè)備的進程時,則所述需要訪問硬件設(shè)備的進程獲取已經(jīng)創(chuàng)建好的互斥鎖以及共享鏡像文件。其中,所述共享鏡像文件是指用戶模式下驅(qū)動器的共享鏡像中的文件,該文件用于保存該硬件設(shè)備寄存器和I/o狀態(tài)數(shù)據(jù)或上述兩者之ー且為所有進程所共享的數(shù)據(jù)。本發(fā)明的有益效果是區(qū)別于現(xiàn)有技術(shù)的情況,本發(fā)明采用獲取互斥鎖以及上下文切換的方式來實現(xiàn)在用戶模式下對硬件設(shè)備的隨機訪問,即在當前需要訪問硬件設(shè)備的進程獲取互斥鎖后,通過判斷進程的ID是否相同,確定是否在當前需要訪問硬件設(shè)備的進程和最近一次訪問硬件設(shè)備的進程之間進行上下文切換,以便于在多任務(wù)時訪問硬件設(shè)備。通過這種方式,在訪問復(fù)雜硬件設(shè)備時,能夠大幅提升用戶模式下驅(qū)動器的性能,又能很好地實現(xiàn)在多任務(wù)環(huán)境下對硬件設(shè)備的隨機安全訪問。
圖I是本發(fā)明基于用戶模式多任務(wù)下驅(qū)動器控制硬件設(shè)備的方法一實施例的流程圖;圖2是本發(fā)明基于用戶模式多任務(wù)下驅(qū)動器控制硬件設(shè)備的方法中上下文切換的流程圖;圖3是本發(fā)明基于用戶模式多任務(wù)下驅(qū)動器控制硬件設(shè)備的方法中多任務(wù)實現(xiàn)進入退出驅(qū)動器API的流程圖;圖4是本發(fā)明基于用戶模式多任務(wù)下驅(qū)動器控制硬件設(shè)備的方法中終止處理函數(shù)處理的流程圖;圖5是本發(fā)明基于用戶模式多任務(wù)下驅(qū)動器控制硬件設(shè)備的方法中在多任務(wù)環(huán)境下典型的流程圖;圖6是本發(fā)明基于用戶模式多任務(wù)下驅(qū)動器控制硬件設(shè)備的方法中在多任務(wù)環(huán)境下使用資源獨占模式后的流程圖; 圖7是本發(fā)明基于用戶模式多任務(wù)下驅(qū)動器控制硬件設(shè)備的裝置的一實施例的結(jié)構(gòu)示意圖。
具體實施例方式下面結(jié)合附圖和實施例對本發(fā)明進行詳細說明。圖I是本發(fā)明基于用戶模式多任務(wù)下驅(qū)動器控制硬件設(shè)備的方法第一實施例的流程圖,如圖I所示,包括步驟SlOl :在用戶模式下接收需要訪問硬件設(shè)備的進程訪問該硬件設(shè)備的請求,該請求中含有所述需要訪問硬件設(shè)備的進程的ID ;Linux等Unix系統(tǒng)下的中央處理器以兩種模式運行用戶模式以及內(nèi)核模式。在用戶模式下,用戶只能受限制地訪問部分系統(tǒng)資源,不能直接訪問內(nèi)核數(shù)據(jù)結(jié)構(gòu),不能直接與內(nèi)核程序交互。在內(nèi)核模式下,一個程序可以執(zhí)行任何CPU指令,訪問4G (以32位CPU為例)存儲空間的任意位置,也可以直接訪問內(nèi)核數(shù)據(jù)結(jié)構(gòu)或程序。在用戶模式下接收需要訪問硬件設(shè)備的進程訪問該硬件設(shè)備的請求,比如圖像處理的請求等。一個程序至少有ー個進程,一個進程至少有ー個線程。任何ー個進程,首先有ー個主線程(即它自身),然后可能有O個或多個子線程。需要訪問硬件設(shè)備的進程包括單ー進程以及多進程,而單ー進程包括多個線程,多進程包括多個線程。每個進程在初始化的時候,系統(tǒng)都會分配ー個ID號,用于標識該進程。進程是具有一定獨立功能的程序關(guān)于某個數(shù)據(jù)集合上的一次運行活動,是系統(tǒng)進行資源分配和調(diào)度的ー個獨立単位;線程是進程的ー個實體,是CPU調(diào)度和分派的基本単位,它是比進程更小的能獨立運行的基本単位,線程自己基本上不擁有系統(tǒng)資源,只擁有一點在運行中必不可少的資源(如程序計數(shù)器,一組寄存器和棧),但是它可與同屬ー個進程的其他的線程共享進程所擁有的全部資源。在步驟SlOl的過程中還包括對該需要訪問硬件設(shè)備的進程進行驅(qū)動器初始化,該進程進行驅(qū)動器初始化以后,驅(qū)動器即可有一個基于線程互斥訪問的互斥鎖以及共享鏡像文件。初始化的步驟是(I)判斷所述需要訪問硬件設(shè)備的進程是否是第一個請求訪問該硬件設(shè)備的進程;需要訪問硬件設(shè)備的進程是否是第一個請求訪問該硬件設(shè)備的進程關(guān)系到需要訪問硬件設(shè)備的進程進行驅(qū)動器初始化的具體操作是不一樣的。
(2)若是第一個請求訪問該硬件設(shè)備的進程,則所述需要訪問硬件設(shè)備的進程創(chuàng)建一個基于線程互斥訪問的互斥鎖以及共享鏡像文件,若不是第一個請求訪問該硬件設(shè)備的進程,則所述需要訪問硬件設(shè)備的進程獲取已經(jīng)創(chuàng)建好的互斥鎖以及共享鏡像文件。第一個請求訪問硬件設(shè)備的進程進行驅(qū)動器初始化時,需要創(chuàng)建ー個基于線程互斥訪問的互斥鎖以及共享鏡像文件,創(chuàng)建好基于線程互斥訪問的互斥鎖以及共享鏡像文件后,后面請求訪問硬件設(shè)備的進程只需要獲取該互斥鎖以及共享鏡像文件即可。共享鏡像文件是指用戶模式下驅(qū)動器的共享鏡像中的文件,該文件用于保存該硬件設(shè)備寄存器和I/O狀態(tài)數(shù)據(jù)或上述兩者之ー且為所有進程所共享的數(shù)據(jù)。步驟S102 :判斷所述需要訪問硬件設(shè)備的進程是否獲取了訪問該硬件設(shè)備的互斥鎖(Mutex);
需要訪問硬件設(shè)備的進程首先需要獲得訪問硬件設(shè)備的互斥鎖,有了訪問硬件設(shè)備的互斥鎖后,才有權(quán)限訪問硬件設(shè)備。 互斥是用來控制多任務(wù)對共享數(shù)據(jù)進行串行訪問的同步機制。在多任務(wù)應(yīng)用中,當兩個或多個任務(wù)同時訪問共享數(shù)據(jù)時,可能會造成數(shù)據(jù)破壞,而互斥可以使得多個任務(wù)可以串行地訪問數(shù)據(jù),從而達到保護數(shù)據(jù)的目的。其中,判斷需要訪問硬件設(shè)備的進程是否獲取了訪問該硬件設(shè)備的互斥鎖的步驟包括(I)判斷所述需要訪問硬件設(shè)備的進程的互斥鎖計數(shù)器(MutexCount)的值是否大于等于I ;(2)若該互斥鎖計數(shù)器的值大于等于1,則表示所述需要訪問硬件設(shè)備的進程已獲取了訪問該硬件設(shè)備的互斥鎖,若該互斥鎖計數(shù)器的值小于1,則表示所述需要訪問硬件設(shè)備的進程沒有獲取訪問該硬件設(shè)備的互斥鎖。在上述步驟中,通過判斷互斥鎖計數(shù)器的值是否大于等于I,來判斷需要訪問硬件設(shè)備的進程是否獲取了訪問硬件設(shè)備的互斥鎖。其中,在步驟S102的判斷過程中還包括如下的判斷過程,具體是(I)若所述需要訪問硬件設(shè)備的進程獲取了訪問該硬件設(shè)備的互斥鎖,判斷所述需要訪問硬件設(shè)備的線程的ID與已經(jīng)獲得該互斥鎖的線程的ID是否相同;(2)若與已經(jīng)獲得該互斥鎖的線程的ID相同,則將互斥鎖計數(shù)器的值加1,并且所述需要訪問硬件設(shè)備的線程繼續(xù)使用該硬件設(shè)備;若與已經(jīng)獲得該互斥鎖的線程的ID不相同,則所述需要訪問硬件設(shè)備的線程等待,直到獲得該互斥鎖。步驟S103 :若所述需要訪問硬件設(shè)備的進程獲取了訪問該硬件設(shè)備的互斥鎖,則判斷所述需要訪問硬件設(shè)備的進程的ID與最近一次訪問該硬件設(shè)備的進程的ID是否相同;若需要訪問硬件設(shè)備的進程的ID與最近一次訪問硬件設(shè)備的進程的ID相同,說明需要訪問硬件設(shè)備的進程與最近一次訪問該硬件設(shè)備的進程是同一個進程,則需要訪問硬件設(shè)備的進程繼續(xù)使用該硬件設(shè)備。若需要訪問硬件設(shè)備的進程的ID與最近一次訪問該硬件設(shè)備的進程的ID不相同,說明需要訪問硬件設(shè)備的進程與最近一次訪問該硬件設(shè)備的進程不是同一個進程。步驟S104 :若所述需要訪問硬件設(shè)備的進程的ID與最近一次訪問該硬件設(shè)備的進程的ID不相同,則在所述需要訪問硬件設(shè)備的進程和最近一次訪問該硬件設(shè)備的進程之間進行上下文切換,使得所述需要訪問硬件設(shè)備的進程使用該硬件設(shè)備。上下文切換是多任務(wù)調(diào)度的核心內(nèi)容,也是在ー個CPU上并行運行多個程序的基礎(chǔ)。上下文切換是指在多任務(wù)系統(tǒng)中,CPU的控制權(quán)由當前運行任務(wù)轉(zhuǎn)移到另外ー個就緒任務(wù)時所發(fā)生的事件,當前運行任務(wù)轉(zhuǎn)為就緒(或者掛起、刪除)狀態(tài),另ー個被選定的就緒任務(wù)成為當前任務(wù)。上下文切換包括保存當前任務(wù)的運行環(huán)境,恢復(fù)將要運行任務(wù)的運行環(huán)境。此處的任務(wù)即為應(yīng)用程序,一個程序至少有ー個進程。需要訪問硬件設(shè)備的進程與最近一次訪問硬件設(shè)備的進程是同一個進程時,最近一次訪問硬件設(shè)備的進程的硬件設(shè)備的狀態(tài)就是需要訪問硬件設(shè)備的進程的硬件設(shè)備的狀態(tài),因此不需要進程上下文切換;需要訪問硬件設(shè)備的進程與最近一次訪問硬件設(shè)備的進程不是同一個進程時,最近一次訪問硬件設(shè)備的進程的硬件設(shè)備的狀態(tài)不是需要訪問硬件設(shè)備的進程的硬件設(shè)備的狀態(tài),因此需要進行上下文切換,在需要訪問硬件設(shè)備的進程和最近一次訪問硬件設(shè)備的進程之間需要進行上下文切換,這樣需要訪問硬件設(shè)備的進程才可以使用該硬件設(shè)備。 在步驟S104中,在需要訪問硬件設(shè)備的進程和最近一次訪問硬件設(shè)備的進程之間進行上下文切換具體為從已保存的需要訪問硬件設(shè)備的進程鏡像文件讀出寄存器和I/o狀態(tài)數(shù)據(jù)或上述兩者之一,并將其寫入該硬件設(shè)備,該硬件設(shè)備恢復(fù)為需要訪問硬件設(shè)備的進程的配置,因而該進程可以使用該硬件設(shè)備。所謂進程鏡像文件是指用戶模式下驅(qū)動器的進程鏡像中的文件,該文件用于保存該硬件設(shè)備寄存器和I/o狀態(tài)數(shù)據(jù)或上述兩者之一且為每個進程所獨享的數(shù)據(jù)。其中,在需要訪問硬件設(shè)備的進程使用結(jié)束該硬件設(shè)備之后還包括(I)所述需要訪問硬件設(shè)備的進程使用結(jié)束該硬件設(shè)備后,判斷所述需要訪問硬件設(shè)備的進程的互斥鎖計數(shù)器的值是否小于I ;(2)若該互斥鎖計數(shù)器的值小于1,則釋放該互斥鎖,并退出使用該硬件設(shè)備的狀態(tài),若該互斥鎖計數(shù)器的值大于等于I,則將互斥鎖計數(shù)器的值減I。其中,所述需要訪問硬件設(shè)備的進程是通過ー個或者多個應(yīng)用程序編程接ロ API(Application Programming Interface)來使用該硬件設(shè)備的。在本發(fā)明中,首先驅(qū)動器對應(yīng)用程序開發(fā)的每ー個應(yīng)用程序編程接ロ API都盡量做到功能単一,即將硬件功能模塊化,應(yīng)用程序要訪問該功能模塊,必須通過ー個或幾個驅(qū)動器的API來實現(xiàn),例如以Driver API I、Driver API2、Driver API3等表示;其次,每個API都會在操作系統(tǒng)的互斥鎖訪問機制保護下,保證多任務(wù)的環(huán)境下對硬件設(shè)備的互斥訪問。在單一進程(Single Process),多線程(Multi-thread)的環(huán)境下,姆個線程(Thread)直接通過互斥鎖保護實現(xiàn)安全的訪問硬件設(shè)備。在多進程(Multi-Process),多線程(Multi-thread)的環(huán)境下,首先檢查最近一次訪問驅(qū)動器的進程是否與當前需要訪問硬件設(shè)備的進程是同一個,如果最近一次訪問驅(qū)動器的進程與當前需要訪問硬件設(shè)備的進程是同一個,允許當前需要訪問硬件設(shè)備的進程在互斥鎖保護機制下獲取硬件設(shè)備的訪問權(quán)限,如果最近一次訪問驅(qū)動器的進程與當前需要訪問硬件設(shè)備的進程不是同一個進程,則當前需要訪問硬件設(shè)備的進程首先獲取互斥鎖,拿到硬件設(shè)備的訪問權(quán)限,再設(shè)置硬件設(shè)備為當前需要訪問硬件設(shè)備的進程的配置,然后再繼續(xù)其想要執(zhí)行的硬件設(shè)備訪問請求。
對數(shù)據(jù)結(jié)構(gòu)分類,需要各應(yīng)用程序共享的數(shù)據(jù),存儲到共享空間里面。對于每個應(yīng)用獨立的數(shù)據(jù),存放在進程空間里面(存為靜態(tài)變量),為每個應(yīng)用程序獨享。為了每個進程都能保留ー份硬件“現(xiàn)場”,以便后面能恢復(fù)“現(xiàn)場”,繼續(xù)自己被打斷的作業(yè),驅(qū)動器需要保存ー份硬件設(shè)備寄存器的進程鏡像文件,這屬于每個應(yīng)用程序獨立的數(shù)據(jù),存儲為僅本進程可見的靜態(tài)變量;為了加快驅(qū)動器的運行速度,同時使各進程共享硬件信息,驅(qū)動器還需要再維護ー份寄存器的共享鏡像文件,這屬于各應(yīng)用程序共享的數(shù)據(jù),存儲到共享空間里面,可供所有進程查看。因此,在進行驅(qū)動器的硬件功能抽象時,把全部的硬件設(shè)備寄存器分為三類進程獨享的、進程共享的以及其他類,并在驅(qū)動器里面分別為保存為兩份鏡像文件進程鏡像文件及共享鏡像文件。進程獨享的寄存器及其他類寄存器的鏡像文件定義為靜態(tài)變量,存放在進程鏡像文件里面,進程共享寄存器的鏡像文件存放到共享鏡像文件中。在寫每ー個寄存器值時,將值寫入實際硬件設(shè)備寄存器的同時,也將值更新到對應(yīng)的鏡像文件里面,在讀回寄存器值吋,對寄存器值分類,進程獨享或共享的寄存器值可分別從對應(yīng)的鏡像文件中讀出寄存器值,對其他類寄存器值(如狀態(tài)寄存器),則直接從硬件設(shè)備中重新讀取值。這樣相當于為每個進程創(chuàng)造了一份硬件鏡像文件,當由進程A切到更高優(yōu)先級的進程B,進程B 即獲得了硬件設(shè)備的訪問權(quán)限,當進程B處理完自己的作業(yè),系統(tǒng)再次切回進程A后,驅(qū)動器會發(fā)現(xiàn)出現(xiàn)了進程切換,現(xiàn)在是進程A,因此首先從該進程空間的進程鏡像中讀取進程A的寄存器值,將需要恢復(fù)的寄存器值重新寫入硬件設(shè)備中。經(jīng)此操作,硬件設(shè)備又回到當初進程A的狀態(tài)中,這樣進程A就可以繼續(xù)其被打斷的硬件作業(yè)。在整個切換過程中,所有的操作都封裝在驅(qū)動器里面,因此上層應(yīng)用程序感覺不到差異,就像是獨享了硬件設(shè)備一祥。在本發(fā)明中,驅(qū)動器初始化吋,構(gòu)建兩份寄存器鏡像文件進程鏡像文件及共享鏡像文件,進程鏡像文件用于存放各進程會不同設(shè)置的寄存器值,共享鏡像文件用于存放各進程設(shè)置相同或需要共享的寄存器值。以本發(fā)明應(yīng)用的圖形處理器為例,Blt相關(guān)的寄存器值,如Source ana Destination Buffer’ s Address> Memory Format、Width、Height、Pitch、Color Key、External Palette Table Address等,都需要存放在進程鏡像中。而某些Graphics engine設(shè)置相關(guān)的寄存器值,如Engine Enable、Engine Reset>Command Queueenable、Virtual Command Queue Size、Virtual Command Queue Enable 等都需要存放在共享鏡像文件中,供每個進程共享,以避免多次、隨機的、相互沖突的設(shè)置,造成死機。另外還有一些只讀(Read Only)的狀態(tài)寄存器,如Engine Status、Command Queue Status 等,由于每次都是直接從硬件設(shè)備中讀取寄存器值,因此這部分就不必存放在鏡像文件中。按照上面的分類,在驅(qū)動器的寫寄存器函數(shù)中,將值寫入真正硬件設(shè)備的同時,分別寫入對應(yīng)的鏡像文件中。同理,在讀寄存器函數(shù)中,按上面的分類,有鏡像文件保存的,直接從相應(yīng)的鏡像文件中讀取寄存器值(并不從真正的硬件設(shè)備讀取),除此之外的其它寄存器值,直接從硬件設(shè)備中讀取。在需要上下文切換時,對需要恢復(fù)的寄存器值,先直接調(diào)用上面的“讀寄存器函數(shù)”,由于進程獨享的寄存器值會從進程鏡像文件中讀出來,因此也就會讀出當前需要訪問硬件設(shè)備的進程上一次被系統(tǒng)調(diào)度切走之前的最后一次硬件寄存器設(shè)置,然后再把讀出來的值通過“寫寄存器函數(shù)”寫入硬件寄存器,也就完成了硬件設(shè)備的“恢復(fù)現(xiàn)場”動作,達到上下文切換的效果。圖2中列出了上下文切換的整個過程的處理流程圖,所述處理流程包括以下步驟步驟S201 :在驅(qū)動器中進行上下文切換;步驟S202 :下載需要恢復(fù)的寄存器的地址、屏蔽位等數(shù)據(jù);步驟S203 :需要讀寄存器數(shù)據(jù)時,判斷該數(shù)據(jù)是否屬于進程鏡像文件,若該數(shù)據(jù)屬于進程鏡像文件,進入步驟S204,若該數(shù)據(jù)不屬于進程鏡像文件,進入步驟S205 ;步驟S204 :從進程鏡像文件中讀取保存的寄存器值,該寄存器值即為要讀取的數(shù)據(jù),然后進入步驟S208;步驟S205 :判斷該數(shù)據(jù)是否屬于共享鏡像文件,若該數(shù)據(jù)屬于共享鏡像文件,進入步驟S206,若該數(shù)據(jù)不屬于共享鏡像文件,進入步驟S207 ;步驟S206 :從共享鏡像文件中讀取保存的寄存器值,該寄存器值即為要讀取的數(shù)據(jù),然后進入步驟S208;步驟S207 :讀取實際的硬件寄存器值;步驟S208 :寫寄存器數(shù)據(jù)時,判斷該數(shù)據(jù)是否屬于進程鏡像文件,若該數(shù)據(jù)屬于進程鏡像文件,進入步驟S209,若該數(shù)據(jù)不屬于進程鏡像文件,進入步驟S210 ;步驟S209 :用該數(shù)據(jù)更新進程鏡像文件中保存的寄存器值,然后進入步驟S213 ;步驟S210 :判斷該數(shù)據(jù)是否屬于共享鏡像文件,若該數(shù)據(jù)屬于共享鏡像文件,進入步驟S211,若該數(shù)據(jù)不屬于共享鏡像文件,進入步驟S212 ;步驟S211 :用該數(shù)據(jù)更新共享鏡像文件中保存的寄存器值,然后進入步驟S213 ;步驟S212 :將該數(shù)據(jù)直接寫入硬件設(shè)備的寄存器;步驟S213 :判斷上下文恢復(fù)的寄存器的下載是否結(jié)束,若下載結(jié)束,進入步驟S214,若下載沒有結(jié)束,進入步驟S202 ;步驟S214 :上下文切換結(jié)束,可以開始其它硬件設(shè)備的訪問。在本發(fā)明應(yīng)用實例的驅(qū)動器設(shè)計中,第一個進行驅(qū)動器初始化的進程,先向系統(tǒng)申請創(chuàng)建一個基于線程互斥訪問的互斥鎖,并創(chuàng)建共享鏡像文件相關(guān)數(shù)據(jù)結(jié)構(gòu),創(chuàng)建完成后,后續(xù)進程即可直接獲取并使用該互斥鎖及共享鏡像文件。每個進程進行驅(qū)動器初始化時,驅(qū)動器會首先記錄該進程的進程ID (Process ID,簡稱PID),在每個驅(qū)動器對外開放的API中,都會有一段定義為drV_entry的入口代碼,該代碼段會首先判斷當前需要訪問硬件設(shè)備的進程是否已經(jīng)獲取互斥鎖,如果沒有,則等待直到獲取到互斥鎖,然后記錄下獲得互斥鎖的線程ID (Thread ID,簡稱TID),同時將標識線程請求連續(xù)占用互斥鎖次數(shù)的互斥鎖計數(shù)器值加I ;如果已經(jīng)獲取,則判斷當前線程ID是否與已獲取了互斥鎖的線程ID相同,如果相同則僅將MutexCount值加1,表示該線程要求連續(xù)占用互斥鎖及硬件設(shè)備,該線程可繼續(xù)通過驅(qū)動器訪問硬件設(shè)備,如果線程ID與已占用互斥鎖的線程ID不同,則ー樣需要等待直到獲取到互斥鎖,一旦線程獲取到互斥鎖,都會首先記錄下獲得互斥鎖的線程ID,表示自己已經(jīng)拿到硬件設(shè)備訪問權(quán)限,同時將MutexCount值加I。接下來drv_entry代碼段會繼續(xù)檢查上一次獲取互斥鎖的進程ID,是否與當前需要訪問硬件設(shè)備的進程的進程ID相等,如果相等則允許其繼續(xù)后面的操作,否則將先恢復(fù)硬件設(shè)備到該進程之前的狀態(tài),然后再繼續(xù)后面的操作。與drv_entry相似,在姆個driver API的結(jié)束部分,都會有一段drv_return定義的退出代碼,該代碼段在確認當前線程已獲取互斥鎖,且MutexCount值等于I 的情況下釋放互斥鎖,否則將MutexCount值減I即可(不會釋放互斥鎖,以滿足連續(xù)占用互斥鎖及硬件設(shè)備的需求),隨后返回。drv_entry及drv_return處理流程圖,如圖3所示。步驟S301 :驅(qū)動器API的入口代碼Drv_entry開始啟動;步驟S302 :驅(qū)動器API的入口代碼Drv_entry判斷當前需要訪問硬件設(shè)備的進程是否已經(jīng)獲取互斥鎖,若當前需要訪問硬件設(shè)備的進程已經(jīng)獲取互斥鎖,進入步驟S303,若當前需要訪問硬件設(shè)備的進程沒有獲得互斥鎖,進入步驟S304 ;步驟S303 :判斷當前線程ID與已經(jīng)獲得互斥鎖的線程ID是否相同,若當前線程ID與已經(jīng)獲得互斥鎖的線程ID相同,進入步驟S305,若當前線程ID與已經(jīng)獲得互斥鎖的線程ID不同,進入步驟S304 ;步驟S304 :等待,直到當前線程獲得互斥鎖,然后進入步驟S305 ;
步驟S305 :記錄已經(jīng)獲取互斥鎖的線程ID為當前的線程ID,同時MutexCount值加I ;步驟S306 :判斷當前需要訪問硬件設(shè)備的進程ID與最后訪問驅(qū)動器的進程ID是否相同,若當前需要訪問硬件設(shè)備的進程ID與最后訪問驅(qū)動器的進程ID相同,進入步驟S308,若當前需要訪問硬件設(shè)備的進程ID與最后訪問驅(qū)動器的進程ID不同,進入步驟S307 ;步驟S307 :在驅(qū)動器中進行上下文切換,將最后訪問驅(qū)動器的進程ID更新為當前的進程ID,然后進入步驟S308 ;步驟S308 :獲得訪問硬件設(shè)備的權(quán)限,并使用硬件設(shè)備;步驟S309 :硬件設(shè)備使用完畢,驅(qū)動器API的退出代碼drv_return開始啟動;步驟S310 :驅(qū)動器API的退出代碼drv_return判斷當前的進程ID的MutexCount值是否小于等于I,若當前的進程ID的MutexCount值小于等于1,進入步驟S311,若當前的進程ID的MutexCount值大于I,進入步驟S312 ;步驟S311 :驅(qū)動器API的退出代碼drv_return釋放互斥鎖;步驟S312 :將MutexCount值減1,然后進入步驟S313 ;步驟S313 :驅(qū)動器API的退出代碼drv_return API退出。本發(fā)明還提供了一種資源獨占模式,在該模式下,需要訪問硬件設(shè)備的進程獨占硬件設(shè)備的資源。享用該資源獨占模式也是需要請求的,在步驟SlOl的過程中,需要訪問硬件設(shè)備的進程請求獨占硬件設(shè)備的資源,具體包括(I)判斷該請求是否屬于資源獨占模式請求,若為資源獨占模式請求,則所述資源獨占模式下的起始應(yīng)用程序編程接ロ API獲取訪問該硬件設(shè)備的互斥鎖,并且所述需要訪問硬件設(shè)備的進程連續(xù)使用該硬件設(shè)備直到所述需要訪問硬件設(shè)備的進程完成所有的作業(yè);(2)在所述需要訪問硬件設(shè)備的進程完成所有的作業(yè)之后,釋放該互斥鎖,并退出使用該硬件設(shè)備的狀態(tài);在本發(fā)明中,資源獨占模式通過驅(qū)動器對外開放兩個應(yīng)用程序編程接ロ API API_BeginDraw及API_EndDraw。由此,提供一個由應(yīng)用程序自由獲取和釋放驅(qū)動器互斥鎖,以達到獨自占用硬件設(shè)備的目的。API_BeginDraw會通過drv_entry先行占用互斥鎖,但退出時卻不會調(diào)用drvjeturn,即不釋放互斥鎖,這樣應(yīng)用程序即可保持占用互斥鎖的狀態(tài)。API_EndDraw會檢查如果本應(yīng)用程序有執(zhí)行API_BeginDraw,且已經(jīng)獲得互斥鎖,則直接執(zhí)行dnreturn釋放獲得的互斥鎖。通過以上兩個應(yīng)用程序編程接ロ API,應(yīng)用程序可以通過一直持有互斥鎖而阻止其它線程或進程進入驅(qū)動器使用硬件設(shè)備,也就完成了“資源獨占”,應(yīng)用程序?qū)τ布O(shè)備使用完畢后,通過API_EndDraw即可退出“資源獨占”模式。執(zhí)行API_BeginDraW占用互斥鎖以后,該線程實際上就已經(jīng)獲得硬件設(shè)備的獨立訪問權(quán)限。在該線程隨后的其它驅(qū)動器應(yīng)用程序編程接ロ API訪問中,drv_entry都會發(fā)現(xiàn)一直是該線程占用著互斥鎖,只是對該線程占用互斥鎖的次數(shù)做加I操作,同理在dnreturn代碼段中,會發(fā)現(xiàn)當前線程的MutexCount值大于I,因此也只是將MutexCount值減I,不會釋放互斥鎖。由于此過程中,該線程一直持有互斥鎖,從而可以控制硬件設(shè)備連續(xù)作業(yè)下去,其它進程或線程若向驅(qū)動器請求硬件設(shè)備的訪問,都會因無法獲得互斥鎖而阻塞,無法進行硬件設(shè)備的訪問,因此在該線程的連續(xù)硬件設(shè)備訪問中,也就不會出現(xiàn)上下文切換,當該線程處理完所有作業(yè),退出最后ー個作業(yè)的driver API (調(diào)用一次drv_return代碼段),想要釋放硬件設(shè)備的時候,調(diào)用API_EndDraw即會再次執(zhí)行drv_return代碼段,這ー次將發(fā)現(xiàn)MutexCount值等于1,因此將會釋放互斥鎖,其它進程即可接著使用硬件設(shè)備了。 另外,本發(fā)明也提供了一種異常退出保護機制,該保護機制需要注冊所述需要訪問硬件設(shè)備的進程的程序終止處理函數(shù),該程序終止處理函數(shù)用于回收所述需要訪問硬件設(shè)備的進程所有的數(shù)據(jù)信息并還原該硬件設(shè)備狀態(tài),該步驟具體包括(I)判斷所述需要訪問硬件設(shè)備的進程是否正使用該硬件設(shè)備;(2)若所述需要訪問硬件設(shè)備的進程正使用該硬件設(shè)備,則釋放該硬件設(shè)備;(3)若所述需要訪問硬件設(shè)備的進程沒有使用該硬件設(shè)備,則判斷該進程的互斥鎖計數(shù)器的值是否大于等于I;(4)若該互斥鎖計數(shù)器的值大于等于1,則釋放該互斥鎖,將該互斥鎖計數(shù)器的值設(shè)為0,退出所述需要訪問硬件設(shè)備的進程。在本發(fā)明中,通過atexit注冊的程序終止處理函數(shù)將收集驅(qū)動器里面關(guān)于該進程的所有軟件數(shù)據(jù)結(jié)構(gòu)信息和硬件設(shè)備資源,對其進行處理復(fù)位所有驅(qū)動器內(nèi)部數(shù)據(jù)為初始狀態(tài),釋放該進程占用的硬件設(shè)備,如關(guān)閉尚處于開啟狀態(tài)的,該進程占用的Displayengine等。最后檢查該進程的MutexCount值,若大于O,則直接清為O,并釋放其占用的所有互斥鎖,隨后退出。圖4給出了通過atexit注冊的程序終止處理函數(shù)的處理流程圖。步驟S401 :程序終止處理函數(shù)Dry_atexit開始啟動;步驟S402 Dry_atexit判斷當前需要訪問硬件設(shè)備的進程ID是否正占用硬件設(shè)備,若當前需要訪問硬件設(shè)備的進程ID正占用硬件設(shè)備,進入步驟S403,若當前需要訪問硬件設(shè)備的進程ID沒有占用硬件設(shè)備,進入步驟S404 ;步驟S403 :釋放該進程占用的所有硬件設(shè)備;步驟S404 Dry_atexit判斷當前需要訪問硬件設(shè)備的進程ID的MutexCount值是否大于等于I,若MutexCount值大于等于I,進入步驟S405,若MutexCount值小于I,進入步驟S406 ;步驟S405 :釋放互斥鎖,使MutexCount值等于零;步驟S406 :清除該進程相關(guān)驅(qū)動器信息后退出。參閱圖5、圖6,這兩個圖給出了本發(fā)明基于用戶模式多任務(wù)下驅(qū)動器控制硬件設(shè)備的方法的兩個具體應(yīng)用實例流程圖。進程A為系統(tǒng)開機后第一個進行驅(qū)動器初始化的進程,系統(tǒng)啟動完成后,進程A向驅(qū)動器請求完成ー個對Destination Buffer填充顏色(FillColor)的操作(需使用到的Driver API編號2、4)。進程A完成任務(wù)前,另ー進程B也向驅(qū)動器請求完成一個從Source Buffer到Destination Buffer的Bitblt操作(需使用到的Driver API編號1、2、3),在系統(tǒng)調(diào)度下,兩個進程交錯執(zhí)行。在本發(fā)明所述之驅(qū)動器的多任務(wù)架構(gòu)支持下,實現(xiàn)對這兩個應(yīng)用的支持。圖5為通常情況下兩個進程在系統(tǒng)調(diào)度下平等獲取硬件設(shè)備使用權(quán)限的應(yīng)用實例流程圖步驟S501 :進程A進行驅(qū)動器初始化;步驟S502 :創(chuàng)建共享鏡像文件,創(chuàng)建互斥鎖,通過atexit注冊進程A的程序終止處理函數(shù),并記錄進程A的進程ID ;此處,進程A是第一個進行驅(qū)動器初始化的進程,因此需要創(chuàng)建互斥鎖以及共享鏡像文件,同時也注冊了程序終止處理函數(shù)。記錄進程A的進程ID是為了后面判斷進程A是否和最近一次訪問硬件設(shè)備的進程是同一個進程。
步驟S503 :驅(qū)動器API2啟動,入口代碼Drv_entry啟動,等待互斥鎖;需要訪問硬件設(shè)備的進程使用硬件設(shè)備是通過ー個或者多個應(yīng)用程序編程接ロAPI來使用硬件設(shè)備的,入口代碼DrV_entry啟動,通過判斷互斥鎖計數(shù)器的值,來判斷進程A是否獲取了互斥鎖。步驟S504 :取得互斥鎖,設(shè)置destination buffer :地址、寬度、高度、形式等等;取得互斥鎖后,即可使用硬件設(shè)備。步驟S505 :驅(qū)動器API2結(jié)束,退出代碼Drv_return釋放互斥鎖;驅(qū)動器API2結(jié)束,退出代碼Drvjeturn通過互斥鎖計數(shù)器的值確定操作釋放互斥鎖。在上面步驟S501-S505的過程中,進程B向驅(qū)動器請求使用硬件設(shè)備,在進程A使用的驅(qū)動器API2釋放互斥鎖后,此時進程B的驅(qū)動器APIl以及API2獲得互斥鎖。步驟S506 :進程B進行驅(qū)動器初始化;步驟S507 :獲取共享鏡像文件,注冊atexit函數(shù),并記錄進程ID ;進程B不是第一個進行驅(qū)動器初始化的程序,因此只需要獲取共享鏡像文件,獲取互斥鎖即可,同時注冊程序終止處理函數(shù)。步驟S508 :驅(qū)動器APIl啟動,Drv_entry啟動,等待互斥鎖;步驟S509 :取得互斥鎖,設(shè)置Source buffer :地址、寬度、高度、形式等等;步驟S510 :驅(qū)動器APIl結(jié)束,退出代碼Drv_return釋放互斥鎖;步驟S511 :驅(qū)動器AP12啟動,Drv_entry啟動,等待互斥鎖;步驟S512 :設(shè)置destination buffer :地址、寬度、高度、形式等等;步驟S513 :驅(qū)動器API2結(jié)束,Drv_return :釋放互斥鎖;在上面步驟S506-S513的過程中,進程A向驅(qū)動器請求使用硬件設(shè)備,在進程B使用的API2釋放互斥鎖后,此時進程A的驅(qū)動器API4獲得互斥鎖。步驟S514 :驅(qū)動器AP14啟動,Drv_entry啟動,等待互斥鎖;步驟S515 :上下文切換,檢測并恢復(fù)硬件設(shè)備的配置;此時進程A的進程ID和最近一次訪問硬件設(shè)備的進程B的進程ID不相同,表明進程A和進程B不是同一個進程,因此,需要在進程A和進程B之間進行上下文切換從已保存的進程A的進程鏡像文件讀出寄存器和I/O狀態(tài)數(shù)據(jù)或上述兩者之一,并將其寫入硬件設(shè)備,使該硬件設(shè)備恢復(fù)為進程A的配置。步驟S516 :使用硬件設(shè)備完成填充顏色的作業(yè);步驟S517 :驅(qū)動器API4結(jié)束,Drv_return :釋放互斥鎖;步驟S518 :進程A退出,啟動atexit終止處理函數(shù);進程A完成作業(yè),使用完硬件設(shè)備,釋放互斥鎖,并退出。在進程A作業(yè)的過程中,若出現(xiàn)異常退出,atexit終止處理函數(shù)回收進程A所有的數(shù)據(jù)信息并還原該硬件設(shè)備狀態(tài),具體步驟可以參見前面所述。在上面步驟S514-S518的過程中,進程B向驅(qū)動器請求使用硬件設(shè)備,在進程A使用的API4釋放互斥鎖后,此時進程B的驅(qū)動器API3獲得互斥鎖。
步驟S519 :驅(qū)動器AP13啟動,Drv_entry啟動,等待互斥鎖;步驟S520 :上下文切換,檢測并恢復(fù)硬件設(shè)備配置;步驟S521 :使用硬件設(shè)備完成Bitblt的作業(yè);步驟S522 :驅(qū)動器API3結(jié)束,Drv_return :釋放互斥鎖;步驟S523 :進程B退出,啟動atexit終止處理函數(shù)。上面的應(yīng)用流程是通常情況下兩個進程在系統(tǒng)調(diào)度下平等獲取硬件設(shè)備使用權(quán)限的應(yīng)用實例流程,沒有進程請求資源獨占模式,下面以進程A請求使用資源獨占模式為例,來說明優(yōu)先獲得硬件設(shè)備使用權(quán)限的應(yīng)用實例流程圖。參見圖6,圖6與圖5為同一應(yīng)用實例,只是進程A使用了驅(qū)動器的資源獨占模式,優(yōu)先獲得硬件設(shè)備使用權(quán)限,具體的應(yīng)用實例流程步驟包括步驟S601 :進程A進行驅(qū)動器初始化;步驟S602 :創(chuàng)建共享空間,創(chuàng)建互斥鎖,注冊atexit函數(shù),并記錄進程ID ;此處進程A的驅(qū)動器初始化與圖5的基本一祥,不同之處在于該請求中含有資源獨占模式下的起始應(yīng)用程序編程接ロ API (以API_BeginDraw表示)以及結(jié)束應(yīng)用程序編程接ロ API(以API_EndDraw表示),屬于資源獨占模式請求;所述資源獨占模式下的起始應(yīng)用程序編程接ロ API獲取訪問該硬件設(shè)備的互斥鎖,并且所述需要訪問硬件設(shè)備的進程連續(xù)使用該硬件設(shè)備直到所述需要訪問硬件設(shè)備的進程完成所有的作業(yè)。步驟S603 申請進入資源獨占模式驅(qū)動器API_BeginDraw啟動,Drv_entry啟動,等待互斥鎖;步驟S604 :驅(qū)動器API2啟動,Drv_entry啟動;步驟S605 :取得互斥鎖,設(shè)置destination buffer :地址、寬度、高度、形式等等;步驟S606 :驅(qū)動器 API2 結(jié)束,Drv_return ;在上面步驟S601-S606的過程中,進程B向驅(qū)動器請求使用硬件設(shè)備,在進程A使用的API2結(jié)束后,系統(tǒng)進程調(diào)度進入進程B。步驟S607 :進程B進行驅(qū)動器初始化;步驟S608 :獲取共享空間,注冊' atexit函數(shù),并記錄進程ID ;步驟S609 :驅(qū)動器APIl啟動,Drv_entry啟動,等待互斥鎖;盡管進程B請求使用硬件設(shè)備,由于進程A在資源獨占模式下,此時進程B無法獲得互斥鎖而阻塞,系統(tǒng)進程調(diào)度重新回到進程A。
步驟S610 :驅(qū)動器API4啟動,Drv_entry啟動;步驟S611 :使用硬件設(shè)備完成填充顏色的作業(yè);步驟S612 :驅(qū)動器API4結(jié)束,退出代碼Drv_return啟動;
步驟S613 :退出資源獨占模式驅(qū)動器API_EndDraw啟動,退出代碼Drv_return釋放互斥鎖;此處的步驟即為前面的步驟在所述需要訪問硬件設(shè)備的進程完成所有的作業(yè)之后,釋放該互斥鎖,并退出使用該硬件設(shè)備的狀態(tài)。步驟S614 :進程A退出,啟動atexit終止處理函數(shù);在進程A完成作業(yè),使用的API4釋放互斥鎖后,此時向驅(qū)動器請求使用硬件設(shè)備的進程B的驅(qū)動器APIl獲得互斥鎖。步驟S615 :設(shè)置Source buffer :地址、寬度、高度、形式等等;步驟S616 :驅(qū)動器APIl結(jié)束,Drv_return :釋放互斥鎖;步驟S617 :驅(qū)動器API2啟動,Drv_entry啟動,等待互斥鎖;步驟S618 :設(shè)置destination buffer :地址、寬度、高度、形式等等;步驟S619 :驅(qū)動器API2結(jié)束,Drv_return :釋放互斥鎖;步驟S620 :驅(qū)動器API3啟動,Drv_entry啟動,等待互斥鎖;步驟S621 :使用硬件設(shè)備完成Bitblt的作業(yè);步驟S622 :驅(qū)動器API3結(jié)束,Drv_return :釋放互斥鎖;步驟S623 :進程B退出,啟動atexit終止處理函數(shù)。上面的應(yīng)用流程即為進程A在資源獨占模式下的流程,盡管在進程A使用硬件設(shè)備的過程中,進程B請求使用硬件設(shè)備,但是由于進程A在資源獨占模式下作業(yè),不會釋放互斥鎖,進程B沒法獲取互斥鎖,也就沒法使用硬件設(shè)備,直到進程A完成所有的作業(yè),釋放互斥鎖后,進程B才可以獲得互斥鎖,使用硬件設(shè)備。區(qū)別于現(xiàn)有技術(shù)的情況,本發(fā)明采用獲取互斥鎖以及上下文切換的方式來實現(xiàn)在用戶模式下對硬件設(shè)備的隨機訪問,即在當前需要訪問硬件設(shè)備的進程獲取互斥鎖后,通過判斷進程的ID是否相同,確定是否在當前需要訪問硬件設(shè)備的進程和最近一次訪問硬件設(shè)備的進程之間進行上下文切換,以便于在多任務(wù)時訪問硬件設(shè)備。通過這種方式,在訪問復(fù)雜硬件設(shè)備時,能夠大幅提升用戶模式下驅(qū)動器的性能,又能很好地實現(xiàn)在多任務(wù)環(huán)境下對硬件設(shè)備的隨機安全訪問。另外,本發(fā)明由于將驅(qū)動器置于用戶模式下,首先規(guī)避了通用公共許可證傳染,不用公開源代碼,方便方案供應(yīng)商開發(fā)ー些自己獨有的應(yīng)用,其次,可以明顯提升多任務(wù)環(huán)境下系統(tǒng)性能,大大減少因頻繁出入內(nèi)核模式所帯來的系統(tǒng)開銷;同時為了實現(xiàn)上下文切換,驅(qū)動器采用將所有寄存器分類,從鏡像文件中讀取大部分寄存器值的辦法,避免為了讀取某些硬件設(shè)備隊列中的寄存器設(shè)置值而需要等待很長時間的情況,這也從側(cè)面更加提升了驅(qū)動器的性能。在本發(fā)明應(yīng)用的圖形處理顯示平臺上實測發(fā)現(xiàn),比現(xiàn)有技術(shù)在內(nèi)核模式下的驅(qū)動器提升約30%的性能;在多任務(wù)環(huán)境下,由于每個任務(wù)都有上下文恢復(fù)的保護,因此每個應(yīng)用程序都感覺硬件設(shè)備是自己獨享的,而且正在按自己的要求工作,完美實現(xiàn)多進程下硬件設(shè)備共享;通過資源獨占模式,可以滿足不同應(yīng)用需求下對硬件設(shè)備或性能的定制化需求,使用起來方便靈活;通過注冊的終止處理函數(shù),可保證在應(yīng)用程序未正常釋放硬件設(shè)備或異常退出時,完成驅(qū)動器資源的回收及硬件設(shè)備狀態(tài)復(fù)位等操作。如圖7所示,圖7是本發(fā)明基于用戶模式多任務(wù)下驅(qū)動器控制硬件設(shè)備的裝置的一實施例的結(jié)構(gòu)示意圖,該裝置包括接收模塊701、第一判斷模塊702、第二判斷模塊703以及切換與使用模塊704。接收模塊701用于在用戶模式下接收需要訪問硬件設(shè)備的進程訪問該硬件設(shè)備的請求,該請求中含有所述需要訪問硬件設(shè)備的進程的ID ;第一判斷模塊702用于判斷所述需要訪問硬件設(shè)備的進程是否獲取了訪問該硬件設(shè)備的互斥鎖;第二判斷模塊703用于在所述需要訪問硬件設(shè)備的進程獲取了訪問該硬件設(shè)備的互斥鎖時,則判斷所述需要訪問硬件設(shè)備的進程的ID與最近一次訪問該硬件設(shè)備的進程的ID是否相同; 切換與使用模塊704用于在所述需要訪問硬件設(shè)備的進程的ID與最近一次訪問該硬件設(shè)備的進程的ID不相同時,則在所述需要訪問硬件設(shè)備的進程和最近一次訪問該硬件設(shè)備的進程之間進行上下文切換,所述需要訪問硬件設(shè)備的進程使用該硬件設(shè)備。其中,需要訪問硬件設(shè)備的進程是通過ー個或者多個應(yīng)用程序編程接ロ API來使用該硬件設(shè)備的。該裝置還包括驅(qū)動器初始化模塊,該驅(qū)動器初始化模塊包括第四判斷單元以及驅(qū)動器初始化單元。第四判斷単元用于判斷所述需要訪問硬件設(shè)備的進程是否是第一個請求訪問該硬件設(shè)備的進程;驅(qū)動器初始化單元用于在是第一個請求訪問該硬件設(shè)備的進程時,則所述需要訪問硬件設(shè)備的進程創(chuàng)建一個基于線程互斥訪問的互斥鎖以及共享鏡像文件,在不是第一個請求訪問該硬件設(shè)備的進程時,則所述需要訪問硬件設(shè)備的進程獲取已經(jīng)創(chuàng)建好的互斥鎖以及共享鏡像文件。第一個請求訪問硬件設(shè)備的進程進行驅(qū)動器初始化時,需要創(chuàng)建ー個基于線程互斥訪問的互斥鎖以及共享鏡像文件,創(chuàng)建好基于線程互斥訪問的互斥鎖以及共享鏡像文件后,以后請求訪問硬件設(shè)備的進程只需要獲取該互斥鎖以及共享鏡像文件即可。共享鏡像文件是指用戶模式下驅(qū)動器的共享鏡像中的文件,該文件用于保存該硬件設(shè)備寄存器和I/O狀態(tài)數(shù)據(jù)或上述兩者之ー且為所有進程所共享的數(shù)據(jù)。第一判斷模塊702包括第一判斷單元以及互斥鎖單元。第一判斷単元用于判斷所述需要訪問硬件設(shè)備的進程的互斥鎖計數(shù)器的值是否大于等于I ;互斥鎖單元用于在該互斥鎖計數(shù)器的值大于等于I吋,則表示所述需要訪問硬件設(shè)備的進程獲取了訪問該硬件設(shè)備的互斥鎖,在該互斥鎖計數(shù)器的值小于I吋,則表示所述需要訪問硬件設(shè)備的進程沒有獲取訪問該硬件設(shè)備的互斥鎖。該裝置還包括第三判斷模塊以及第ー執(zhí)行模塊。第三判斷模塊用于在所述需要訪問硬件設(shè)備的進程獲取了訪問該硬件設(shè)備的互斥鎖時,判斷所述需要訪問硬件設(shè)備的線程的ID與已經(jīng)獲得該互斥鎖的線程的ID是否相同;
第一執(zhí)行模塊用于在與已經(jīng)獲得該互斥鎖的線程的ID相同時,則將互斥鎖計數(shù)器的值加1,并且所述需要訪問硬件設(shè)備的線程繼續(xù)使用該硬件設(shè)備;在與已經(jīng)獲得該互斥鎖的線程的ID不相同時,則所述需要訪問硬件設(shè)備的線程等待,直到獲得該互斥鎖。該裝置還包括第二執(zhí)行模塊,第二執(zhí)行模塊具體用于在所述需要訪問硬件設(shè)備的進程的ID與最近一次訪問該硬件設(shè)備的進程的ID相同時,則所述需要訪問硬件設(shè)備的進程繼續(xù)使用該硬件設(shè)備。切換與使用模塊704具體用于從已保存的所述需要訪問硬件設(shè)備的進程鏡像文件讀出寄存器和I/O狀態(tài)數(shù)據(jù)或上述兩者之一,并將其寫入該硬件設(shè)備,所述硬件設(shè)備恢復(fù)為所述需要訪問硬件設(shè)備的進程的配置。進程鏡像文件是指用戶模式下驅(qū)動器的進程鏡像中的文件,該文件用于保存該硬件設(shè)備寄存器和I/O狀態(tài)數(shù)據(jù)或上述兩者之一且為每個進程所獨享的數(shù)據(jù)。該裝置還包括第四判斷模塊以及第三執(zhí)行模塊。 第四判斷模塊用于所述需要訪問硬件設(shè)備的進程使用結(jié)束該硬件設(shè)備后,判斷所述需要訪問硬件設(shè)備的進程的互斥鎖計數(shù)器的值是否小于I ;第三執(zhí)行模塊用于在該互斥鎖計數(shù)器的值小于I時,則釋放該互斥鎖,并退出使用該硬件設(shè)備的狀態(tài),在該互斥鎖計數(shù)器的值大于等于I吋,則將互斥鎖計數(shù)器的值減I。該裝置還包括資源獨占模塊,資源獨占模塊包括硬件設(shè)備獨占單元以及硬件設(shè)備退出単元。硬件設(shè)備獨占単元用于判斷該請求是否屬于資源獨占模式請求,在判斷為資源獨占模式請求時,則所述資源獨占模式下的起始應(yīng)用程序編程接ロ API獲取訪問該硬件設(shè)備的互斥鎖,并且所述需要訪問硬件設(shè)備的進程連續(xù)使用該硬件設(shè)備直到所述需要訪問硬件設(shè)備的進程完成所有的作業(yè);硬件設(shè)備退出単元用于在所述需要訪問硬件設(shè)備的進程完成所有的作業(yè)之后,釋放該互斥鎖,并退出使用該硬件設(shè)備的狀態(tài)。該裝置還包括程序終止處理函數(shù)模塊,該程序終止處理函數(shù)模塊具體用于回收所述需要訪問硬件設(shè)備的進程所有的數(shù)據(jù)信息并還原該硬件設(shè)備狀態(tài),包括第二判斷単元、硬件設(shè)備釋放単元、第三判斷単元、互斥鎖釋放單元以及退出単元。第二判斷単元用于判斷所述需要訪問硬件設(shè)備的進程是否正使用該硬件設(shè)備;硬件設(shè)備釋放単元用于在所述需要訪問硬件設(shè)備的進程正使用該硬件設(shè)備時,則釋放該硬件設(shè)備;第三判斷単元用于在所述需要訪問硬件設(shè)備的進程沒有使用該硬件設(shè)備時,則判斷該進程的互斥鎖計數(shù)器的值是否大于等于I ;互斥鎖釋放単元用于在該互斥鎖計數(shù)器的值大于等于I吋,則釋放該互斥鎖,將該互斥鎖計數(shù)器的值設(shè)為0,退出所述需要訪問硬件設(shè)備的進程。本發(fā)明采用獲取互斥鎖以及上下文切換的方式來實現(xiàn)在用戶模式下對硬件設(shè)備的隨機訪問,即在當前需要訪問硬件設(shè)備的進程獲取互斥鎖后,判斷進程的ID是否相同,確定是否在當前的進程和最近一次訪問硬件設(shè)備的進程之間進行上下文切換,以便于在多任務(wù)時訪問硬件設(shè)備。通過這種方式,在訪問復(fù)雜硬件設(shè)備時,能夠大幅提升用戶模式下驅(qū)動器的性能,又能很好地實現(xiàn)在多任務(wù)環(huán)境下對硬件設(shè)備的隨機安全訪問。
需要提出說明的是,本發(fā)明由于將驅(qū)動器置于用戶模式下,首先規(guī)避了通用公共許可證傳染,方便方案供應(yīng)商開發(fā)獨有的應(yīng)用,其次,提升多任務(wù)環(huán)境下系統(tǒng)性能,大大減少系統(tǒng)開銷;同時驅(qū)動器將所有寄存器分類,從鏡像文件中讀取大部分寄存器值,避免為了讀取某些硬件設(shè)備隊列中的寄存器設(shè)置值而需要等待很長時間的情況,從側(cè)面更加提升了驅(qū)動器的性能。在本發(fā)明應(yīng)用的圖形處理顯示平臺上實測發(fā)現(xiàn),比現(xiàn)有技術(shù)在內(nèi)核模式下的驅(qū)動器提升約30%的性能;資源獨占模式可以滿足不同應(yīng)用需求下對硬件設(shè)備或性能的定制化需求;注冊的終止處理函數(shù)可保證在應(yīng)用程序未正常釋放硬件設(shè)備或異常退出吋,完成驅(qū)動器資源的回收及硬件設(shè)備狀態(tài)復(fù)位等操作。以上所述僅為本發(fā)明的實施例,并非因此限制本發(fā)明的專利范圍,凡是利用本發(fā) 明說明書及附圖內(nèi)容所作的等效結(jié)構(gòu)或等效流程變換,或直接或間接運用在其他相關(guān)的技術(shù)領(lǐng)域,均同理包括在本發(fā)明的專利保護范圍內(nèi)。
權(quán)利要求
1.一種基于用戶模式多任務(wù)下驅(qū)動器控制硬件設(shè)備的方法,其特征在于,包括 在用戶模式下接收需要訪問硬件設(shè)備的進程訪問該硬件設(shè)備的請求,該請求中含有所述需要訪問硬件設(shè)備的進程的標識(ID); 判斷所述需要訪問硬件設(shè)備的進程是否獲取了訪問該硬件設(shè)備的互斥鎖; 若所述需要訪問硬件設(shè)備的進程獲取了訪問該硬件設(shè)備的互斥鎖,則判斷所述需要訪問硬件設(shè)備的進程的ID與最近一次訪問該硬件設(shè)備的進程的ID是否相同; 若所述需要訪問硬件設(shè)備的進程的ID與最近一次訪問該硬件設(shè)備的進程的ID不相同,則在所述需要訪問硬件設(shè)備的進程和最近一次訪問該硬件設(shè)備的進程之間進行上下文切換,使得所述需要訪問硬件設(shè)備的進程使用該硬件設(shè)備。
2.根據(jù)權(quán)利要求I所述的方法,其特征在于,還包括如下步驟 從已保存的所述需要訪問硬件設(shè)備的進程鏡像文件讀出寄存器和I/O狀態(tài)數(shù)據(jù)或上述兩者之一,并將其寫入該硬件設(shè)備,使該硬件設(shè)備恢復(fù)為所述需要訪問硬件設(shè)備的進程的配置。
3.根據(jù)權(quán)利要求2所述的方法,其特征在于,所述進程鏡像文件是指用戶模式下驅(qū)動器的進程鏡像中的文件,該文件用于保存該硬件設(shè)備寄存器和I/O狀態(tài)數(shù)據(jù)或上述兩者之一且為每個進程所獨享的數(shù)據(jù)。
4.根據(jù)權(quán)利要求I所述的方法,其特征在于,還包括 若所述需要訪問硬件設(shè)備的進程獲取了訪問該硬件設(shè)備的互斥鎖,判斷所述需要訪問硬件設(shè)備的線程的ID與已經(jīng)獲得該互斥鎖的線程的ID是否相同; 若與已經(jīng)獲得該互斥鎖的線程的ID相同,則將互斥鎖計數(shù)器的值加1,所述需要訪問硬件設(shè)備的線程繼續(xù)使用該硬件設(shè)備;若與已經(jīng)獲得該互斥鎖的線程的ID不相同,則所述需要訪問硬件設(shè)備的線程等待,直到獲得該互斥鎖。
5.根據(jù)權(quán)利要求I所述的方法,其特征在于若所述需要訪問硬件設(shè)備的進程的ID與最近一次訪問該硬件設(shè)備的進程的ID相同,則所述需要訪問硬件設(shè)備的進程繼續(xù)使用該硬件設(shè)備。
6.根據(jù)權(quán)利要求I所述的方法,其特征在于,還包括 判斷所述需要訪問硬件設(shè)備的進程的互斥鎖計數(shù)器的值是否大于等于I ; 若該互斥鎖計數(shù)器的值大于等于1,則表示所述需要訪問硬件設(shè)備的進程已獲取了訪問該硬件設(shè)備的互斥鎖,若該互斥鎖計數(shù)器的值小于1,則表示所述需要訪問硬件設(shè)備的進程沒有獲取訪問該硬件設(shè)備的互斥鎖。
7.根據(jù)權(quán)利要求I所述的方法,其特征在于,還包括 所述需要訪問硬件設(shè)備的進程結(jié)束使用該硬件設(shè)備后,判斷所述需要訪問硬件設(shè)備的進程的互斥鎖計數(shù)器的值是否小于I; 若該互斥鎖計數(shù)器的值小于1,則釋放該互斥鎖,并退出使用該硬件設(shè)備的狀態(tài),若該互斥鎖計數(shù)器的值大于等于I,則將互斥鎖計數(shù)器的值減I。
8.根據(jù)權(quán)利要求I所述的方法,其特征在于,所述需要訪問硬件設(shè)備的進程是通過ー個或者多個應(yīng)用程序編程接ロ API來使用該硬件設(shè)備的。
9.根據(jù)權(quán)利要求8所述的方法,其特征在于,還包括 判斷該請求是否屬于資源獨占模式請求,若為資源獨占模式請求,則所述資源獨占模式下的起始應(yīng)用程序編程接ロ API獲取訪問該硬件設(shè)備的互斥鎖,所述需要訪問硬件設(shè)備的進程連續(xù)使用該硬件設(shè)備直到所述需要訪問硬件設(shè)備的進程完成所有的作業(yè); 在所述需要訪問硬件設(shè)備的進程完成所有的作業(yè)之后,釋放該互斥鎖,并退出使用該硬件設(shè)備的狀態(tài)。
10.根據(jù)權(quán)利要求I所述的方法,其特征在于,還包括注冊所述需要訪問硬件設(shè)備的進程的程序終止處理函數(shù),該程序終止處理函數(shù)用于回收所述需要訪問硬件設(shè)備的進程所有的數(shù)據(jù)信息并還原該硬件設(shè)備的狀態(tài)。
11.根據(jù)權(quán)利要求10所述的方法,其特征在于,還包括如下步驟 判斷所述需要訪問硬件設(shè)備的進程是否正使用該硬件設(shè)備; 若所述需要訪問硬件設(shè)備的進程正使用該硬件設(shè)備,則釋放該硬件設(shè)備; 若所述需要訪問硬件設(shè)備的進程沒有使用該硬件設(shè)備,則判斷該進程的互斥鎖計數(shù)器的值是否大于等于I; 若該互斥鎖計數(shù)器的值大于等于1,則釋放該互斥鎖,將該互斥鎖計數(shù)器的值設(shè)為0,退出所述需要訪問硬件設(shè)備的進程。
12.根據(jù)權(quán)利要求I所述的方法,其特征在于,還包括對所述需要訪問硬件設(shè)備的進程進行驅(qū)動器初始化。
13.根據(jù)權(quán)利要求12所述的方法,其特征在于,還包括 判斷所述需要訪問硬件設(shè)備的進程是否是第一個請求訪問該硬件設(shè)備的進程; 若是第一個請求訪問該硬件設(shè)備的進程,則所述需要訪問硬件設(shè)備的進程創(chuàng)建ー個基于線程互斥訪問的互斥鎖以及共享鏡像文件,若不是第一個請求訪問該硬件設(shè)備的進程,則所述需要訪問硬件設(shè)備的進程獲取已經(jīng)創(chuàng)建好的互斥鎖以及共享鏡像文件。
14.根據(jù)權(quán)利要求13所述的方法,其特征在于,所述共享鏡像文件是指用戶模式下驅(qū)動器的共享鏡像中的文件,該文件用于保存該硬件設(shè)備寄存器和I/O狀態(tài)數(shù)據(jù)或上述兩者之ー且為所有進程所共享的數(shù)據(jù)。
15.一種基于用戶模式多任務(wù)下控制硬件設(shè)備的裝置,其特征在于,所述裝置包括 接收模塊,用于在用戶模式下接收需要訪問硬件設(shè)備的進程訪問該硬件設(shè)備的請求,該請求中含有所述需要訪問硬件設(shè)備的進程的ID ; 第一判斷模塊,用于判斷所述需要訪問硬件設(shè)備的進程是否獲取了訪問該硬件設(shè)備的互斥鎖; 第二判斷模塊,用于在所述需要訪問硬件設(shè)備的進程獲取了訪問該硬件設(shè)備的互斥鎖時,判斷所述需要訪問硬件設(shè)備的進程的ID與最近一次訪問該硬件設(shè)備的進程的ID是否相同; 切換與使用模塊,用于在所述需要訪問硬件設(shè)備的進程的ID與最近一次訪問該硬件設(shè)備的進程的ID不相同時,在所述需要訪問硬件設(shè)備的進程和最近一次訪問該硬件設(shè)備的進程之間進行上下文切換,使所述需要訪問硬件設(shè)備的進程使用該硬件設(shè)備。
16.根據(jù)權(quán)利要求15所述的裝置,其特征在于,所述切換與使用模塊具體用于從已保存的所述需要訪問硬件設(shè)備的進程鏡像文件讀出寄存器和I/O狀態(tài)數(shù)據(jù)或上述兩者之一,并將其寫入該硬件設(shè)備,所述硬件設(shè)備恢復(fù)為所述需要訪問硬件設(shè)備的進程的配置。
17.根據(jù)權(quán)利要求16所述的裝置,其特征在于,所述進程鏡像文件是指用戶模式下驅(qū)動器的進程鏡像中的文件,該文件用于保存該硬件設(shè)備寄存器和I/o狀態(tài)數(shù)據(jù)或上述兩者之一且為每個進程所獨享的數(shù)據(jù)。
18.根據(jù)權(quán)利要求15所述的裝置,其特征在于,所述裝置還包括 第三判斷模塊,用于在所述需要訪問硬件設(shè)備的進程獲取了訪問該硬件設(shè)備的互斥鎖時,判斷所述需要訪問硬件設(shè)備的線程的ID與已經(jīng)獲得該互斥鎖的線程的ID是否相同; 第一執(zhí)行模塊,當所述需要訪問硬件設(shè)備的線程的ID與已經(jīng)獲得該互斥鎖的線程的ID相同時,其用于將互斥鎖計數(shù)器的值加1,使所述需要訪問硬件設(shè)備的線程繼續(xù)使用該硬件設(shè)備;當所述需要訪問硬件設(shè)備的線程的ID與已經(jīng)獲得該互斥鎖的線程的ID不相同時,其使得所述需要訪問硬件設(shè)備的線程執(zhí)行等待,直到獲得該互斥鎖。
19.根據(jù)權(quán)利要求15所述的裝置,其特征在于,所述裝置還包括第二執(zhí)行模塊,所述第ニ執(zhí)行模塊具體用于在所述需要訪問硬件設(shè)備的進程的ID與最近一次訪問該硬件設(shè)備的進程的ID相同時,使所述需要訪問硬件設(shè)備的進程繼續(xù)使用該硬件設(shè)備。
20.根據(jù)權(quán)利要求15所述的裝置,其特征在于,所述第一判斷模塊包括 第一判斷単元,用于判斷所述需要訪問硬件設(shè)備的進程的互斥鎖計數(shù)器的值是否大于等于I ; 互斥鎖單元,用于在該互斥鎖計數(shù)器的值大于等于I時,表示所述需要訪問硬件設(shè)備的進程獲取了訪問該硬件設(shè)備的互斥鎖,而在該互斥鎖計數(shù)器的值小于I吋,則表示所述需要訪問硬件設(shè)備的進程沒有獲取訪問該硬件設(shè)備的互斥鎖。
21.根據(jù)權(quán)利要求15所述的裝置,其特征在于,所述裝置還包括 第四判斷模塊,用于在所述需要訪問硬件設(shè)備的進程結(jié)束使用該硬件設(shè)備后,判斷所述需要訪問硬件設(shè)備的進程的互斥鎖計數(shù)器的值是否小于I ; 第三執(zhí)行模塊,用于在該互斥鎖計數(shù)器的值小于I吋,釋放該互斥鎖,并退出使用該硬件設(shè)備的狀態(tài),在該互斥鎖計數(shù)器的值大于等于I吋,則將互斥鎖計數(shù)器的值減I。
22.根據(jù)權(quán)利要求15所述的裝置,其特征在于,所述需要訪問硬件設(shè)備的進程是通過一個或者多個應(yīng)用程序編程接ロ API來使用該硬件設(shè)備的。
23.根據(jù)權(quán)利要求22所述的裝置,其特征在于,所述裝置還包括資源獨占模塊,所述資源獨占模塊包括 硬件設(shè)備獨占単元,用于判斷該請求是否屬于資源獨占模式請求,在判斷為資源獨占模式請求時,則所述資源獨占模式下的起始應(yīng)用程序編程接ロ API獲取訪問該硬件設(shè)備的互斥鎖,所述需要訪問硬件設(shè)備的進程連續(xù)使用該硬件設(shè)備直到所述需要訪問硬件設(shè)備的進程完成所有的作業(yè); 硬件設(shè)備退出単元,用于在所述需要訪問硬件設(shè)備的進程完成所有的作業(yè)之后,釋放該互斥鎖,并退出使用該硬件設(shè)備的狀態(tài)。
24.根據(jù)權(quán)利要求15所述的裝置,其特征在于,所述裝置還包括程序終止處理函數(shù)模塊,該程序終止處理函數(shù)模塊具體用于回收所述需要訪問硬件設(shè)備的進程所有的數(shù)據(jù)信息并還原該硬件設(shè)備狀態(tài),包括 第二判斷単元,用于判斷所述需要訪問硬件設(shè)備的進程是否正使用該硬件設(shè)備; 硬件設(shè)備釋放単元,用于在所述需要訪問硬件設(shè)備的進程正使用該硬件設(shè)備時,釋放該硬件設(shè)備;第三判斷単元,用于在所述需要訪問硬件設(shè)備的進程沒有使用該硬件設(shè)備時,判斷該進程的互斥鎖計數(shù)器的值是否大于等于I; 互斥鎖釋放単元,用于在該互斥鎖計數(shù)器的值大于等于I吋,則釋放該互斥鎖,將該互斥鎖計數(shù)器的值設(shè)為O,退出所述需要訪問硬件設(shè)備的進程。
25.根據(jù)權(quán)利要求15所述的裝置,其特征在于,所述裝置還包括驅(qū)動器初始化模塊,所述驅(qū)動器初始化模塊包括 第四判斷単元,用于判斷所述需要訪問硬件設(shè)備的進程是否是第一個請求訪問該硬件設(shè)備的進程; 驅(qū)動器初始化單元,當?shù)谝粋€請求訪問該硬件設(shè)備的進程時,其用于使得所述需要訪問硬件設(shè)備的進程創(chuàng)建一個基于線程互斥訪問的互斥鎖以及共享鏡像文件。
26.根據(jù)權(quán)利要求25所述的裝置,其特征在干,所述共享鏡像文件是指用戶模式下驅(qū)動器的共享鏡像中的文件,該文件用于保存該硬件設(shè)備寄存器和I/O狀態(tài)數(shù)據(jù)或上述兩者之ー且為所有進程所共享的數(shù)據(jù)。
全文摘要
本發(fā)明公開了基于用戶模式多任務(wù)下驅(qū)動器控制硬件設(shè)備的方法及其裝置,所述方法包括在用戶模式下接收當前進程訪問硬件設(shè)備的請求,請求中含有當前進程的ID;判斷當前進程是否獲取了訪問硬件設(shè)備的互斥鎖;若當前進程獲取了訪問硬件設(shè)備的互斥鎖,判斷當前進程的ID與最近一次訪問硬件設(shè)備的進程的ID是否相同;若當前進程的ID與最近一次訪問硬件設(shè)備的進程的ID不相同,在當前進程和最近一次訪問硬件設(shè)備的進程之間進行上下文切換,使當前進程得以使用該硬件設(shè)備。通過上述方式,本發(fā)明能夠在訪問復(fù)雜硬件設(shè)備時,能夠大幅提升用戶模式下驅(qū)動器的性能,又能很好地實現(xiàn)在多任務(wù)環(huán)境下對硬件設(shè)備的隨機安全訪問。
文檔編號G06F9/48GK102693159SQ201210143390
公開日2012年9月26日 申請日期2012年5月9日 優(yōu)先權(quán)日2012年5月9日
發(fā)明者孫明勇, 王建 申請人:上海晨思電子科技有限公司, 晨星半導(dǎo)體股份有限公司