本發(fā)明涉及計(jì)算機(jī)領(lǐng)域,具體來說,涉及一種輸入/輸出端口的訪問方法及裝置。
背景技術(shù):在X86系統(tǒng)架構(gòu)下,當(dāng)在用戶空間訪問IO端口時(shí),通常會(huì)使用X86架構(gòu)提供的IO端口訪問指令in和out進(jìn)行訪問。但在單字長(zhǎng)定點(diǎn)指令平均執(zhí)行速度(MillionInstructionsPerSecond,下文中簡(jiǎn)稱為MIPS)等其他系統(tǒng)架構(gòu)下,并不存在指令in和out。這樣,就只能使用其他方式進(jìn)行IO端口訪問了?,F(xiàn)有技術(shù)中的其他訪問方法包括使用C語(yǔ)言中的mmap函數(shù)方式調(diào)用將IO端口所處在的地址空間映射到用戶空間,通過對(duì)此地址空間內(nèi)的地址進(jìn)行訪問達(dá)到對(duì)IO端口的訪問。但使用mmap函數(shù)調(diào)用將IO端口所處在的地址空間映射到用戶空間,需要用戶對(duì)系統(tǒng)架構(gòu)非常熟悉,明確知道IO端口所處在的地址空間的起始地址等信息。此方法不適用于初級(jí)用戶。而且,此方法在使用過程中發(fā)現(xiàn),經(jīng)受不起長(zhǎng)時(shí)間的系統(tǒng)穩(wěn)定性功能測(cè)試。針對(duì)相關(guān)技術(shù)中在非X86系統(tǒng)架構(gòu)下,實(shí)現(xiàn)在用戶空間訪問IO端口的方式存在的對(duì)用戶技術(shù)要求高、以及經(jīng)不起長(zhǎng)時(shí)間的系統(tǒng)穩(wěn)定性功能測(cè)試的問題,目前尚未提出有效的解決方案。
技術(shù)實(shí)現(xiàn)要素:針對(duì)相關(guān)技術(shù)中的問題,本發(fā)明提出一種輸入/輸出端口的訪問方法及裝置,能夠在非X86系統(tǒng)架構(gòu)下,通過預(yù)定的功能指令(例如,in指令、out指令),來訪問輸入/輸出端口,從而避免了需要調(diào)用mmap函數(shù)以及映射等操作來實(shí)現(xiàn)在用戶空間訪問輸入/輸出端口的麻煩,降低了對(duì)用戶的技術(shù)要求,使得輸入/輸出端口訪問變的更簡(jiǎn)單、方便。本發(fā)明的技術(shù)方案是這樣實(shí)現(xiàn)的:根據(jù)本發(fā)明的一個(gè)方面,提供了一種輸入/輸出端口的訪問方法。該輸入/輸出端口的訪問方法包括:分析當(dāng)前操作系統(tǒng)的設(shè)備文件,判定操作系統(tǒng)的設(shè)備文件中是否具有接口設(shè)備文件;在判定的結(jié)果為否的情況下,向操作系統(tǒng)的系統(tǒng)內(nèi)核中添加設(shè)備接口進(jìn)程信息,促使操作系統(tǒng)的設(shè)備文件具備接口設(shè)備文件;通過預(yù)定的功能指令,調(diào)用接口設(shè)備文件訪問對(duì)應(yīng)的輸入/輸出端口。其中,在通過預(yù)定的功能指令,調(diào)用接口設(shè)備文件訪問對(duì)應(yīng)的輸入/輸出端口時(shí),可通過分析預(yù)定的功能指令,確定功能指令對(duì)應(yīng)的輸入/輸出端口的位置和位寬;再根據(jù)位置和位寬,通過設(shè)備文件生成與輸入/輸出端口對(duì)應(yīng)的接口函數(shù);并對(duì)接口函數(shù)進(jìn)行編譯,生成與接口函數(shù)對(duì)應(yīng)的庫(kù)文件;然后將庫(kù)文件與含有與功能指令對(duì)應(yīng)的輸入/輸出端口的應(yīng)用程序進(jìn)行鏈接,促使應(yīng)用程序通過庫(kù)文件中的接口函數(shù)訪問對(duì)應(yīng)的輸入/輸出端口。此外,該輸入/輸出端口的訪問方法還包括:對(duì)接口函數(shù)進(jìn)行分析,確定接口函數(shù)對(duì)應(yīng)的函數(shù)聲明,函數(shù)聲明用于描述接口函數(shù)的配置信息;將函數(shù)聲明存儲(chǔ)至預(yù)先配置的頭文件中,并且,將頭文件加入到應(yīng)用程序中,促使應(yīng)用程序能夠顯示庫(kù)文件中的接口函數(shù)的配置信息。其中,功能指令包括in指令和/或out指令。其中,庫(kù)文件包括靜態(tài)庫(kù)文件和/或動(dòng)態(tài)庫(kù)文件。根據(jù)本發(fā)明的另一方面,提供了一種輸入/輸出端口的訪問裝置。該輸入/輸出端口的訪問裝置包括:判定模塊,用于分析當(dāng)前操作系統(tǒng)的設(shè)備文件,判定操作系統(tǒng)的設(shè)備文件中是否具有接口設(shè)備文件;添加模塊,用于在判定結(jié)果為否的情況下,向操作系統(tǒng)的系統(tǒng)內(nèi)核中添加設(shè)備接口進(jìn)程信息,促使操作系統(tǒng)的設(shè)備文件具備接口設(shè)備文件;訪問模塊,用于通過預(yù)定的功能指令,調(diào)用接口設(shè)備文件訪問對(duì)應(yīng)的輸入/輸出端口。其中,訪問模塊進(jìn)一步包括第一分析模塊、生成模塊和第一處理模塊,其中,第一分析模塊,用于分析預(yù)定的功能指令,確定功能指令對(duì)應(yīng)的輸入/輸出端口的位置和位寬;生成模塊,用于根據(jù)位置和位寬,通過設(shè)備文件生成與輸入/輸出端口對(duì)應(yīng)的接口函數(shù),并且,對(duì)接口函數(shù)進(jìn)行編譯,生成與接口函數(shù)對(duì)應(yīng)的庫(kù)文件;第一處理模塊,將庫(kù)文件與含有與功能指令對(duì)應(yīng)輸入/輸出端口的應(yīng)用程序進(jìn)行鏈接,促使應(yīng)用程序通過庫(kù)文件中的接口函數(shù)訪問對(duì)應(yīng)的輸入/輸出端口。并且,訪問模塊還包括第二分析模塊和第二處理模塊,其中,第二分析模塊,用于對(duì)接口函數(shù)進(jìn)行分析,確定接口函數(shù)對(duì)應(yīng)的函數(shù)聲明,函數(shù)聲明用于描述接口函數(shù)的配置信息;第二處理模塊,用于將函數(shù)聲明存儲(chǔ)至預(yù)先配置的頭文件中,并且,將頭文件加入到應(yīng)用程序中,促使應(yīng)用程序能夠顯示庫(kù)文件中的接口函數(shù)的配置信息。其中,功能指令包括in指令和/或out指令。其中,庫(kù)文件包括靜態(tài)庫(kù)文件和/或動(dòng)態(tài)庫(kù)文件。本發(fā)明通過在操作系統(tǒng)缺乏接口設(shè)備文件時(shí),添加設(shè)備接口進(jìn)程信息,促使操作系統(tǒng)具備接口設(shè)備文件,從而使得用戶能夠通過預(yù)先定的功能指令(例如,in指令、out指令)調(diào)用接口設(shè)備文件訪問端口,進(jìn)而避免了需要調(diào)用mmap函數(shù)以及映射等操作來實(shí)現(xiàn)在用戶空間訪問輸入/輸出端口的麻煩,降低了用戶的技術(shù)要求,使輸入/輸出端口訪問變的更簡(jiǎn)單、方便。附圖說明為了更清楚地說明本發(fā)明實(shí)施例或現(xiàn)有技術(shù)中的技術(shù)方案,下面將對(duì)實(shí)施例中所需要使用的附圖作簡(jiǎn)單地介紹,顯而易見地,下面描述中的附圖僅僅是本發(fā)明的一些實(shí)施例,對(duì)于本領(lǐng)域普通技術(shù)人員來講,在不付出創(chuàng)造性勞動(dòng)的前提下,還可以根據(jù)這些附圖獲得其他的附圖。圖1是根據(jù)本發(fā)明實(shí)施例的輸入/輸出端口的訪問方法的流程圖;圖2是根據(jù)本發(fā)明實(shí)施例的輸入/輸出端口的訪問裝置的框圖。具體實(shí)施方式下面將結(jié)合本發(fā)明實(shí)施例中的附圖,對(duì)本發(fā)明實(shí)施例中的技術(shù)方案進(jìn)行清楚、完整地描述,顯然,所描述的實(shí)施例僅僅是本發(fā)明一部分實(shí)施例,而不是全部的實(shí)施例。基于本發(fā)明中的實(shí)施例,本領(lǐng)域普通技術(shù)人員所獲得的所有其他實(shí)施例,都屬于本發(fā)明保護(hù)的范圍。根據(jù)本發(fā)明的實(shí)施例,提供了一種輸入/輸出端口的訪問方法。如圖1所示,根據(jù)本發(fā)明實(shí)施例的輸入/輸出端口的訪問方法包括:步驟S101,分析當(dāng)前操作系統(tǒng)的設(shè)備文件,判定操作系統(tǒng)的設(shè)備文件中是否具有接口設(shè)備文件;步驟S103,在判定的結(jié)果為否的情況下,向操作系統(tǒng)的系統(tǒng)內(nèi)核中添加設(shè)備接口進(jìn)程信息,促使操作系統(tǒng)的設(shè)備文件具備接口設(shè)備文件;步驟S105,通過預(yù)定的功能指令,調(diào)用接口設(shè)備文件訪問對(duì)應(yīng)的輸入/輸出端口。上述方案中,在通過功能指令訪問輸入/輸出端口時(shí),可先分析預(yù)定的功能指令,確定功能指令對(duì)應(yīng)的輸入/輸出端口的位置和位寬,并依此通過設(shè)備文件生成與輸入/輸出端口對(duì)應(yīng)的接口函數(shù),再將編譯接口函數(shù)生成的、與之對(duì)應(yīng)的庫(kù)文件與含有與功能指令對(duì)應(yīng)的輸入/輸出端口的應(yīng)用程序鏈接,促使應(yīng)用程序通過庫(kù)文件中的接口函數(shù)訪問對(duì)應(yīng)的輸入/輸出端口。而在對(duì)接口函數(shù)進(jìn)行分析時(shí),則需確定接口函數(shù)對(duì)應(yīng)的、用于描述接口函數(shù)的配置信息的函數(shù)聲明,并將之存儲(chǔ)至預(yù)先配置的頭文件,促使加入了此文件的應(yīng)用程序能夠顯示庫(kù)文件中的接口函數(shù)的配置信息。在實(shí)際應(yīng)用時(shí),上述方案中的功能指令可以是in指令,也可以是out指令,當(dāng)然,在實(shí)際應(yīng)用時(shí),該功能指令還可以是與當(dāng)前系統(tǒng)架構(gòu)對(duì)應(yīng)的其他功能指令。同樣的,上述方案中的庫(kù)文件可以是靜態(tài)的庫(kù)文件,也可以是動(dòng)態(tài)的庫(kù)文件,用戶在實(shí)際應(yīng)用時(shí),可根據(jù)當(dāng)前的系統(tǒng)架構(gòu)自行選擇。以下通過Linux系統(tǒng)環(huán)境下的具體實(shí)例對(duì)本發(fā)明的上述技術(shù)方案進(jìn)行詳細(xì)說明。在Linux系統(tǒng)環(huán)境下,當(dāng)需要在用戶空間訪問輸入/輸出端口時(shí),首先需要查看操作系統(tǒng)的/dev目錄下是否存在port設(shè)備文件;如果不存在此文件,則說明操作系統(tǒng)使用的內(nèi)核不支持,需要在配置內(nèi)核時(shí)加入CONFIGDEVPORT_選項(xiàng)(即設(shè)備接口進(jìn)程信息)以加入此功能,將編譯出的內(nèi)核集成到操作系統(tǒng)中,在系統(tǒng)啟動(dòng)后就存在/dev/port設(shè)備文件了。而為了使應(yīng)用程序自動(dòng)調(diào)用IO端口訪問接口功能,則可以在接口函數(shù)庫(kù)中加入in、out函數(shù),同時(shí)為了加快后續(xù)IO端口的訪問速度,還可以定義相關(guān)的全局變量來表示/dev/port設(shè)備文件相對(duì)應(yīng)的文件描述符,例如:voidinit(void)__attribute__((constructor));voiddestroy(void)__attribute__((destructor));此外,在通過init函數(shù)對(duì)相關(guān)環(huán)境進(jìn)行初始化時(shí),可打開/dev/port設(shè)備文件,將上述描述符保存到相對(duì)應(yīng)的全局變量中,比如fd,并在destroy函數(shù)中關(guān)閉該/dev/port設(shè)備文件,以釋放在init函數(shù)中申請(qǐng)的資源。另外,在根據(jù)in、out指令功能,利用/dev/port設(shè)備文件實(shí)現(xiàn)對(duì)應(yīng)的接口函數(shù)時(shí),可以使用in、out指令分別對(duì)某個(gè)端口進(jìn)行字節(jié)(8位)、半字(16位)、字(32位)進(jìn)行訪問,相應(yīng)的,也可以使用in、out指令實(shí)現(xiàn)進(jìn)行字節(jié)、半字、字訪問的對(duì)應(yīng)接口函數(shù)。下面以字節(jié)(8位)IO端口讀訪問接口函數(shù)為例進(jìn)行說明。//參數(shù)port表示IO端口,IO端口正常情況下為16位,所以此處使用unsignedshort表示;unsignedcharinb(unsignedshortport){//字節(jié)訪問,定義_v來存儲(chǔ)讀訪問的結(jié)果unsignedchar_v;//fd是表示/dev/port設(shè)備文件描述符的全局變量,lseek系統(tǒng)調(diào)用實(shí)現(xiàn)將讀請(qǐng)求定位到IO地址空間中由port變量指定的位置;lseek(fd,port,SEEK_SET);read(fd,&_v,1);return_v;}另外,為了更好的實(shí)現(xiàn)在用戶空間訪問IO端口,還可以在實(shí)現(xiàn)眾多接口函數(shù)后,將眾多接口函數(shù)的聲明集中放在某個(gè)文件中,并且將實(shí)現(xiàn)的眾多接口函數(shù)編譯成靜態(tài)庫(kù)或者動(dòng)態(tài)庫(kù),而在將包含IO端口訪問的應(yīng)用程序編譯前,則可以將描述接口函數(shù)的頭文件編譯成的靜態(tài)庫(kù)話或者動(dòng)態(tài)庫(kù)進(jìn)行鏈接。由上可見,通過本發(fā)明的上述方案,能夠在非X86系統(tǒng)架構(gòu)下,通過in、out指令來訪問輸入/輸出端口,從而避免了需要調(diào)用mmap函數(shù)以及映射等操作來實(shí)現(xiàn)在用戶空間訪問輸入/輸出端口的麻煩。根據(jù)本發(fā)明的實(shí)施例,還提供了一種輸入/輸出端口的訪問裝置。如圖2所示,根據(jù)本發(fā)明實(shí)施例的輸入/輸出端口的訪問裝置包括:判定模塊21,用于分析當(dāng)前操作系統(tǒng)的設(shè)備文件,判定操作系統(tǒng)的設(shè)備文件中是否具有接口設(shè)備文件;添加模塊22,用于在判定模塊21的判定結(jié)果為否的情況下,向操作系統(tǒng)的系統(tǒng)內(nèi)核中添加設(shè)備接口進(jìn)程信息,促使操作系統(tǒng)的設(shè)備文件具備接口設(shè)備文件;訪問模塊23,用于通過預(yù)定的功能指令,調(diào)用添加模塊22促使操作系統(tǒng)添加的接口設(shè)備文件訪問對(duì)應(yīng)的輸入/輸出端口。其中,訪問模塊23進(jìn)一步包括第一分析模塊(未示出)、生成模塊(未示出)和第一處理模塊(未示出),其中,第一分析模塊(未示出),用于分析預(yù)定的功能指令,確定功能指令對(duì)應(yīng)的輸入/輸出端口的位置和位寬;生成模塊(未示出),用于根據(jù)第一分析模塊(未示出)確定的位置和位寬,通過設(shè)備文件生成與輸入/輸出端口對(duì)應(yīng)的接口函數(shù),并且,對(duì)接口函數(shù)進(jìn)行編譯,生成與接口函數(shù)對(duì)應(yīng)的庫(kù)文件;第一處理模塊(未示出),將生成模塊(未示出)生成的庫(kù)文件與含有與功能指令對(duì)應(yīng)輸入/輸出端口的應(yīng)用程序進(jìn)行鏈接,促使應(yīng)用程序通過庫(kù)文件中的接口函數(shù)訪問對(duì)應(yīng)的輸入/輸出端口。并且,訪問模塊23還包括第二分析模塊(未示出)和第二處理模塊(未示出),其中,第二分析模塊(未示出),用于對(duì)生成模塊(未示出)生成的接口函數(shù)進(jìn)行分析,確定接口函數(shù)對(duì)應(yīng)的函數(shù)聲明,函數(shù)聲明用于描述接口函數(shù)的配置信息;第二處理模塊(未示出),用于將第二分析模塊(未示出)確定的函數(shù)聲明存儲(chǔ)至預(yù)先配置的頭文件中,并且,將頭文件加入到應(yīng)用程序中,促使應(yīng)用程序能夠顯示庫(kù)文件中的接口函數(shù)的配置信息。在實(shí)際應(yīng)用時(shí),上述方案中的功能指令可以是in指令,也可以是out指令,當(dāng)然,在實(shí)際應(yīng)用時(shí),該功能指令還可以是與當(dāng)前系統(tǒng)架構(gòu)對(duì)應(yīng)的其他功能指令。同樣的,上述方案中的庫(kù)文件可以是靜態(tài)的庫(kù)文件,也可以是動(dòng)態(tài)的庫(kù)文件,用戶在實(shí)際應(yīng)用時(shí),可根據(jù)當(dāng)前的系統(tǒng)架構(gòu)自行選擇。綜上所述,借助于本發(fā)明的上述技術(shù)方案,通過在操作系統(tǒng)缺乏接口設(shè)備文件時(shí),添加設(shè)備接口進(jìn)程信息,促使操作系統(tǒng)具備接口設(shè)備文件,從而使得用戶能夠通過預(yù)先定的功能指令(例如,in指令、out指令)調(diào)用接口設(shè)備文件訪問端口,進(jìn)而避免了需要調(diào)用mmap函數(shù)以及映射等操作來實(shí)現(xiàn)在用戶空間訪問輸入/輸出端口的麻煩,降低了用戶的技術(shù)要求,使輸入/輸出端口訪問變的更簡(jiǎn)單、方便。以上所述僅為本發(fā)明的較佳實(shí)施例而已,并不用以限制本發(fā)明,凡在本發(fā)明的精神和原則之內(nèi),所作的任何修改、等同替換、改進(jìn)等,均應(yīng)包含在本發(fā)明的保護(hù)范圍之內(nèi)。