- 嵌入式軟件基礎(chǔ)
- 張倪編著
- 141字
- 2018-12-27 18:20:26
2.3 多內(nèi)核嵌入式操作系統(tǒng)和虛擬機(jī)
多內(nèi)核嵌入式操作系統(tǒng)指有多個(gè)內(nèi)核的嵌入式操作系統(tǒng)。這些內(nèi)核同時(shí)在硬件平臺(tái)上面運(yùn)行,共同管理著系統(tǒng)中的軟件和硬件資源。多內(nèi)核的嵌入式操作系統(tǒng)按照其組織結(jié)構(gòu)可以分為兩類:一類叫做一體化結(jié)構(gòu)的多內(nèi)核嵌入式操作系統(tǒng),另一類叫做基于虛擬機(jī)的多內(nèi)核嵌入式操作系統(tǒng)。
2.3.1 為什么要引入多內(nèi)核嵌入式操作系統(tǒng)和虛擬機(jī)
實(shí)際應(yīng)用有時(shí)會(huì)對(duì)嵌入式操作系統(tǒng)提出一些多元化的需求(如有非常強(qiáng)的實(shí)時(shí)性能;能在資源極為有限的硬件平臺(tái)上運(yùn)行;可以運(yùn)行基于Linux系統(tǒng)開發(fā)的應(yīng)用軟件),使得現(xiàn)有的任何一種嵌入式操作系統(tǒng)都不能直接滿足這些需求。解決這個(gè)問題的方法通常有兩種:一種是新開發(fā)一種功能更強(qiáng)的嵌入式操作系統(tǒng);另一種是將兩個(gè)甚至多個(gè)嵌入式操作系統(tǒng)組合在一起,通過相互彌補(bǔ)不足的方式滿足應(yīng)用需求。第一種方法看似直截了當(dāng),但受很多因素的制約,實(shí)際上往往行不通。例如,使用者對(duì)現(xiàn)有的操作系統(tǒng)已經(jīng)非常習(xí)慣,難以舍棄;現(xiàn)有操作系統(tǒng)的研發(fā)者出于商業(yè)利益的考慮,暫時(shí)不愿意開發(fā)新的系統(tǒng);開發(fā)新操作系統(tǒng)所需的某種關(guān)鍵技術(shù)未得到解決等。所以在很多情況下還是選擇第二種解決方法。這就是為什么要引入多內(nèi)核嵌入式操作系統(tǒng)的原因。
當(dāng)多個(gè)嵌入式操作系統(tǒng)在同一個(gè)硬件平臺(tái)上運(yùn)行時(shí),必然出現(xiàn)如何協(xié)調(diào)各操作系統(tǒng)之間關(guān)系的問題。這有兩種解決方法,一種是由各操作系統(tǒng)自己解決相互協(xié)調(diào)的問題,另一種是由一個(gè)位于硬件之上,操作系統(tǒng)之下的獨(dú)立功能模塊來(lái)解決相互協(xié)調(diào)的問題。這個(gè)位于硬件之上,操作系統(tǒng)之下的獨(dú)立功能模塊就是所謂的虛擬機(jī)。
對(duì)嵌入式操作系統(tǒng)的多元化需求,適合采用多內(nèi)核嵌入式操作系統(tǒng)予以解決,下面來(lái)看兩個(gè)比較典型的實(shí)例。
第一個(gè)實(shí)例來(lái)自于智能手機(jī)。智能手機(jī)相當(dāng)于普通手機(jī)與PDA的融合。在它的CPU上面既要運(yùn)行通信處理軟件,也要運(yùn)行普通PDA軟件(如個(gè)人信息管理軟件)。因此對(duì)智能手機(jī)上的操作系統(tǒng)提出了兩個(gè)不同的需求。從通信處理的角度出發(fā),要求操作系統(tǒng)有很強(qiáng)的實(shí)時(shí)處理能力。從便于PDA應(yīng)用軟件開發(fā)和移植的角度出發(fā),要求操作系統(tǒng)應(yīng)當(dāng)與Linux甚至更多的常用嵌入式操作系統(tǒng)兼容。這兩個(gè)需求是相互矛盾的,很難在基于一個(gè)嵌入式操作系統(tǒng)的前提下解決,但采用一個(gè)雙內(nèi)核的嵌入式操作系統(tǒng)就能夠比較好地解決這一問題。在這個(gè)雙內(nèi)核嵌入式操作系統(tǒng)中,一個(gè)內(nèi)核有很強(qiáng)的實(shí)時(shí)性能,可用于支持通信方面的實(shí)時(shí)任務(wù)。另一個(gè)則是Linux的內(nèi)核,可以支持非實(shí)時(shí)的應(yīng)用任務(wù),大量符合POSIX標(biāo)準(zhǔn)的應(yīng)用程序幾乎不加修改地就可以在這個(gè)內(nèi)核上運(yùn)行。
第二個(gè)實(shí)例來(lái)自于無(wú)線傳感網(wǎng)。在無(wú)線傳感網(wǎng)中有微傳感器和網(wǎng)關(guān)兩類網(wǎng)絡(luò)結(jié)點(diǎn)。微傳感器的資源極為有限,因此運(yùn)行于微傳感器上的嵌入式操作系統(tǒng)所占內(nèi)存應(yīng)當(dāng)非常小,對(duì)微處理器的要求應(yīng)當(dāng)非常低。當(dāng)然,需要這種嵌入式操作系統(tǒng)提供的功能也不是很復(fù)雜,都是一些支持任務(wù)運(yùn)行所必需的功能。相對(duì)微傳感器而言,網(wǎng)關(guān)結(jié)點(diǎn)的資源豐富得多。它的主要功能是將由微傳感器所組成的網(wǎng)絡(luò)接入其他網(wǎng)絡(luò),如GSM的無(wú)線蜂窩網(wǎng)。網(wǎng)關(guān)結(jié)點(diǎn)通常還可以提供其他一些功能,如網(wǎng)絡(luò)管理功能,甚至充當(dāng)一般的微傳感器。因此網(wǎng)關(guān)上的操作系統(tǒng)要比微傳感器上的操作系統(tǒng)有更強(qiáng)的功能。對(duì)于微傳感器和網(wǎng)關(guān)之間的這種差別,一種解決辦法是在微傳感器和網(wǎng)關(guān)上分別采用不同的嵌入式操作系統(tǒng),但這顯然不是一個(gè)好的解決方案,對(duì)無(wú)線傳感網(wǎng)應(yīng)用軟件的開發(fā)和移植都有不良的影響。還有一種方案是在微傳感器上采用一種功能精簡(jiǎn)的嵌入式操作系統(tǒng),而在網(wǎng)關(guān)上采用一個(gè)雙內(nèi)核的嵌入式操作系統(tǒng),其中一個(gè)內(nèi)核與運(yùn)行在微傳感器上的操作系統(tǒng)內(nèi)核相同,另一個(gè)操作系統(tǒng)內(nèi)核則功能較強(qiáng),可以支持復(fù)雜應(yīng)用。
2.3.2 一體化結(jié)構(gòu)多內(nèi)核嵌入式操作系統(tǒng)原理與組成
一體化結(jié)構(gòu)的多內(nèi)核嵌入式操作系統(tǒng)由同在一個(gè)硬件平臺(tái)上運(yùn)行的內(nèi)核自己解決相互協(xié)調(diào)的問題。理論上,在一個(gè)硬件平臺(tái)上雖然可以同時(shí)運(yùn)行多個(gè)嵌入式操作系統(tǒng)內(nèi)核,但實(shí)際中使用的一般都是雙內(nèi)核系統(tǒng)。這種雙內(nèi)核嵌入式操作系統(tǒng)的典型用途是彌補(bǔ)嵌入式Linux操作系統(tǒng)在實(shí)時(shí)性方面的缺失。RTLinux和RTAI是這種雙內(nèi)核操作系統(tǒng)的典型代表。它們都是把Linux內(nèi)核與一個(gè)實(shí)時(shí)內(nèi)核合并在了一起。
如圖2.38所示,這種雙內(nèi)核操作系統(tǒng)的原理是將Linux內(nèi)核(也可以是其他某種實(shí)時(shí)性較低的操作系統(tǒng)內(nèi)核)作為實(shí)時(shí)內(nèi)核的一個(gè)低優(yōu)先級(jí)任務(wù)。系統(tǒng)中的任務(wù)被分為了實(shí)時(shí)任務(wù)和非實(shí)時(shí)任務(wù)兩類,實(shí)時(shí)內(nèi)核調(diào)度和處理實(shí)時(shí)任務(wù),Linux內(nèi)核調(diào)度和處理非實(shí)時(shí)任務(wù)。由于Linux內(nèi)核是實(shí)時(shí)內(nèi)核的一個(gè)優(yōu)先級(jí)最低的任務(wù),所以只有當(dāng)系統(tǒng)中沒有實(shí)時(shí)任務(wù)時(shí),Linux內(nèi)核才可能被運(yùn)行,并開始處理系統(tǒng)中的非實(shí)時(shí)任務(wù),因此實(shí)時(shí)任務(wù)總是能夠優(yōu)先得到運(yùn)行。通過這種簡(jiǎn)單的方法,雙內(nèi)核操作系統(tǒng)在保證實(shí)時(shí)性的前提下實(shí)現(xiàn)了兩個(gè)操作系統(tǒng)內(nèi)核的融合。

圖2.38 一體化結(jié)構(gòu)的雙內(nèi)核嵌入式操作系統(tǒng)的組成
當(dāng)有中斷請(qǐng)求到來(lái)時(shí),由虛擬中斷管理模塊負(fù)責(zé)接收,并按先實(shí)時(shí)內(nèi)核后Linux內(nèi)核的次序,將中斷請(qǐng)求傳遞給兩個(gè)操作系統(tǒng)內(nèi)核,使兩個(gè)操作系統(tǒng)內(nèi)核都有機(jī)會(huì)按照自己方式對(duì)中斷進(jìn)行處理。(RTLinux中沒有虛擬中斷管理模塊,它將該模塊承擔(dān)的功能合并到了實(shí)時(shí)內(nèi)核中。所以在RTLinux中,當(dāng)有中斷請(qǐng)求到來(lái)時(shí),是由實(shí)時(shí)內(nèi)核負(fù)責(zé)接收,并對(duì)其進(jìn)行處理,然后再傳遞給Linux內(nèi)核。)
一體化結(jié)構(gòu)的多內(nèi)核嵌入式操作系統(tǒng)有以下5個(gè)特點(diǎn)。
① 在保留原有操作系統(tǒng)內(nèi)核構(gòu)架的前提下,實(shí)現(xiàn)多個(gè)內(nèi)核的有機(jī)融合,使它們可以相互配合工作,發(fā)揮各自的優(yōu)勢(shì),向應(yīng)用軟件開發(fā)者提供一個(gè)功能更強(qiáng)的操作系統(tǒng)。
② 操作系統(tǒng)內(nèi)核間的協(xié)調(diào)、通信等問題由各個(gè)內(nèi)核自己解決。
③ 系統(tǒng)采用主次的結(jié)構(gòu),多個(gè)操作系統(tǒng)內(nèi)核的地位不平等。系統(tǒng)一般以一個(gè)操作系統(tǒng)內(nèi)核為主,由它負(fù)責(zé)一些管理性的工作,如操作系統(tǒng)內(nèi)核間的通信。
④ 系統(tǒng)的層次關(guān)系及其各操作系統(tǒng)內(nèi)核間的接口不清晰,因此在采用一體化結(jié)構(gòu)將多個(gè)嵌入式操作系統(tǒng)組合在一起形成一個(gè)多內(nèi)核嵌入式操作系統(tǒng)時(shí),需要根據(jù)具體情況對(duì)原有的操作系統(tǒng)內(nèi)核做比較多的修改和調(diào)整,這給系統(tǒng)的維護(hù)帶來(lái)了一定麻煩。有時(shí)這種修改和調(diào)整所產(chǎn)生的變化甚至?xí)绊懙綉?yīng)用軟件的開發(fā)。
⑤ 實(shí)時(shí)任務(wù)在核心態(tài)運(yùn)行,給操作系統(tǒng)的穩(wěn)定性帶來(lái)了一定隱患。多內(nèi)核操作系統(tǒng)將非實(shí)時(shí)內(nèi)核(如嵌入式Linux的內(nèi)核)作為實(shí)時(shí)操作系統(tǒng)內(nèi)核的一個(gè)低優(yōu)先級(jí)任務(wù)。這種做法雖然簡(jiǎn)化了系統(tǒng)設(shè)計(jì),但是由于非實(shí)時(shí)內(nèi)核必須在核心態(tài)運(yùn)行,所以迫使所有的實(shí)時(shí)任務(wù)也要在核心態(tài)運(yùn)行。實(shí)時(shí)任務(wù)作為一種應(yīng)用程序,出錯(cuò)可能性遠(yuǎn)高于操作系統(tǒng)代碼,因此降低了系統(tǒng)的穩(wěn)定性。
2.3.3 虛擬機(jī)的原理與組成
虛擬機(jī)是在一體化結(jié)構(gòu)多內(nèi)核嵌入式操作系統(tǒng)的基礎(chǔ)上發(fā)展起來(lái)的一種技術(shù)。一體化結(jié)構(gòu)的多內(nèi)核嵌入式操作系統(tǒng)存在著內(nèi)核間的接口不清晰、系統(tǒng)的穩(wěn)定性存在隱患等問題。虛擬機(jī)的引入在很大程度上解決了這些問題。
如圖2.39所示,虛擬機(jī)是一個(gè)直接位于硬件之上的底層軟件。在虛擬機(jī)之上可以運(yùn)行多個(gè)嵌入式操作系統(tǒng)內(nèi)核(雖然在實(shí)際中使用較多的也是雙內(nèi)核的系統(tǒng))。這些內(nèi)核和虛擬機(jī)一起共同組成了一個(gè)基于虛擬機(jī)的多內(nèi)核嵌入式操作系統(tǒng)。虛擬機(jī)提供支持在同一個(gè)硬件平臺(tái)上運(yùn)行多個(gè)操作系統(tǒng)內(nèi)核所需的一系列功能模塊。主要包括虛擬中斷管理模塊、虛擬管道模塊、內(nèi)存管理模塊3個(gè)功能模塊。除此之外,原來(lái)硬件抽象層所具有的功能也應(yīng)被包括在虛擬機(jī)之中。

圖2.39 基于虛擬機(jī)的多內(nèi)核嵌入式操作系統(tǒng)的組成
1. 虛擬中斷管理模塊
虛擬中斷管理模塊對(duì)來(lái)自計(jì)算機(jī)硬件的中斷請(qǐng)求進(jìn)行處理。它提供了保障多個(gè)操作系統(tǒng)內(nèi)核同時(shí)在一個(gè)硬件平臺(tái)之上運(yùn)行所需要的最基本功能,使多個(gè)操作系統(tǒng)內(nèi)核可以獨(dú)立運(yùn)行、互不影響。如圖2.40所示,虛擬中斷管理模塊自底向上可以劃分硬件監(jiān)控層、中斷分發(fā)層、內(nèi)核服務(wù)層3個(gè)層次。硬件監(jiān)控層監(jiān)聽來(lái)自硬件的中斷請(qǐng)求。中斷分發(fā)層按照優(yōu)先級(jí)將來(lái)自硬件的中斷請(qǐng)求發(fā)送給運(yùn)行在虛擬機(jī)之上的操作系統(tǒng)內(nèi)核,并回調(diào)操作系統(tǒng)注冊(cè)的中斷服務(wù)程序。內(nèi)核服務(wù)層負(fù)責(zé)中斷服務(wù)程序的注冊(cè)、注銷和開中斷、關(guān)中斷等項(xiàng)工作。

圖2.40 虛擬中斷管理模塊的結(jié)構(gòu)
如圖2.41所示,運(yùn)行在虛擬機(jī)上的操作系統(tǒng)內(nèi)核有不同的優(yōu)先級(jí),這個(gè)優(yōu)先級(jí)決定了來(lái)自硬件的中斷請(qǐng)求傳給各個(gè)操作系統(tǒng)內(nèi)核的次序。優(yōu)先級(jí)最高的操作系統(tǒng)內(nèi)核總是最先接收到來(lái)自硬件的中斷請(qǐng)求,該請(qǐng)求然后依次被傳遞給運(yùn)行在虛擬機(jī)上的其他操作系統(tǒng)內(nèi)核。一個(gè)操作系統(tǒng)內(nèi)核可以選擇是否接收和處理某種中斷請(qǐng)求。有一些中斷請(qǐng)求,如時(shí)鐘中斷,所有的操作系統(tǒng)內(nèi)核必須接收和處理,但某些中斷請(qǐng)求可能僅與某個(gè)操作系統(tǒng)有關(guān)系,所以其他的操作系統(tǒng)內(nèi)核就不必對(duì)其進(jìn)行接收和處理,這樣可以減少許多不必要的工作。一個(gè)操作系統(tǒng)內(nèi)核如果接收和處理某種中斷請(qǐng)求,虛擬中斷管理模塊就會(huì)調(diào)用這個(gè)操作系統(tǒng)的中斷服務(wù)程序,并在處理結(jié)束之后,將該中斷請(qǐng)求向下傳遞,直至到達(dá)優(yōu)先級(jí)最低的操作系統(tǒng)內(nèi)核。

圖2.41 中斷請(qǐng)求按優(yōu)先級(jí)在各操作系統(tǒng)內(nèi)核間傳遞
2. 虛擬管道管理模塊
虛擬管道管理模塊用于解決多個(gè)操作系統(tǒng)內(nèi)核間的通信問題。它所支持的功能主要是供運(yùn)行在虛擬機(jī)上的嵌入式操作系統(tǒng)內(nèi)核使用,但在某些時(shí)候也可以被應(yīng)用任務(wù)所使用,以便和其他操作系統(tǒng)中的任務(wù)相互通信。一體化結(jié)構(gòu)的多內(nèi)核嵌入式操作系統(tǒng)中一般有某個(gè)操作系統(tǒng)內(nèi)核起主導(dǎo)作用,不同內(nèi)核之間的通信由它來(lái)負(fù)責(zé),因此不需要用一個(gè)專門的功能模塊來(lái)解決多個(gè)內(nèi)核間的通信問題。
虛擬管道管理模塊的API接口目前尚未標(biāo)準(zhǔn)化,可以采用很多方式。Socket接口和專用設(shè)備是兩種可行的方式,它們都比較好地解決了與現(xiàn)有編程習(xí)慣的兼容問題。Socket接口方式是標(biāo)準(zhǔn)Socket接口的擴(kuò)充。標(biāo)準(zhǔn)Socket接口規(guī)定:在調(diào)用Socket函數(shù)準(zhǔn)備建立通信連接的時(shí)候,須給出3個(gè)參數(shù),其中一個(gè)參數(shù)用于指明通信協(xié)議。為了支持虛擬管道,可在Socket支持的原有通信協(xié)議之外再擴(kuò)充一種與虛擬管道相對(duì)應(yīng)的協(xié)議,使用這種協(xié)議建立通信連接就可以通過虛擬管道與其他操作系統(tǒng)相通信。專用設(shè)備方式的原理是用一種設(shè)備代表虛擬管道。對(duì)這種設(shè)備可以像其他設(shè)備一樣進(jìn)行打開、關(guān)閉、讀、寫等各種操作。這樣,使用虛擬管道進(jìn)行通信的雙方只要一方向該設(shè)備寫入數(shù)據(jù),另一方從該設(shè)備讀出數(shù)據(jù)就可以達(dá)到相互通信的目的。
3. 內(nèi)存管理模塊
內(nèi)存管理模塊用于處理在一個(gè)硬件平臺(tái)之上同時(shí)運(yùn)行多個(gè)操作系統(tǒng)內(nèi)核時(shí)在內(nèi)存管理方面所產(chǎn)生的問題。當(dāng)多個(gè)操作系統(tǒng)內(nèi)核運(yùn)行于一個(gè)硬件平臺(tái)上時(shí),必須妥善地解決內(nèi)存管理問題,否則就不可避免地發(fā)生混亂。但解決這個(gè)問題并不總是依靠虛擬機(jī)中的內(nèi)存管理模塊。按照是否需要由內(nèi)存管理模塊參與解決內(nèi)存管理,可以把解決內(nèi)存管理問題的方法分為兩類:一類是由內(nèi)存管理模塊解決或幫助解決內(nèi)存管理問題,另一類則完全是由各操作系統(tǒng)內(nèi)核自己解決內(nèi)存管理問題,不需要依靠?jī)?nèi)存管理模塊。
在采用第一類方法解決內(nèi)存使用問題時(shí),并不是由內(nèi)存管理模塊完全接管內(nèi)存的管理工作。它所起的作用只是讓各操作系統(tǒng)內(nèi)核中的內(nèi)存管理功能能夠互不干擾地正常工作。例如,若一個(gè)多內(nèi)核操作系統(tǒng)采取的內(nèi)存管理方案是把物理內(nèi)存按照一定的比例分配給各個(gè)操作系統(tǒng),由各操作系統(tǒng)分別管理分配給自己的物理內(nèi)存。那么在進(jìn)行操作系統(tǒng)內(nèi)核切換時(shí)就需要由內(nèi)存管理模塊對(duì)MMU中的頁(yè)表進(jìn)行刷新或進(jìn)行局部的修改。
在采用第二類方法解決內(nèi)存的管理問題時(shí),內(nèi)存管理模塊的功能完全退化,虛擬機(jī)中的內(nèi)存管理模塊實(shí)際上已不存在。這類方法的共同特點(diǎn)是解決內(nèi)存管理問題的措施都與各操作系統(tǒng)所采用的具體內(nèi)存管理技術(shù)密切相關(guān)。Hopen雙內(nèi)核操作系統(tǒng)采用的就是這類方法。下面來(lái)看該操作系統(tǒng)的內(nèi)存管理方案。
Hopen雙內(nèi)核操作系統(tǒng)是Hopen操作系統(tǒng)系列產(chǎn)品中的一個(gè)成員。它的兩個(gè)內(nèi)核分別是Hopen-RT操作系統(tǒng)內(nèi)核和嵌入式Linux操作系統(tǒng)內(nèi)核。Hopen-RT是一個(gè)實(shí)時(shí)性很強(qiáng)的嵌入式操作系統(tǒng),它可以彌補(bǔ)嵌入式Linux在實(shí)時(shí)性方面的不足。
如圖2.42所示,在32位的計(jì)算機(jī)中有4GB的虛擬地址空間。嵌入式Linux將這4GB的地址空間分成了兩部分。低地址的3GB(從虛擬地址0X0至0XBFFFFFFF)作為各任務(wù)的用戶空間。高地址的1GB(從虛擬地址0XC0000000~0XFFFFFFFF)作為操作系統(tǒng)內(nèi)核所用的空間,即系統(tǒng)空間。當(dāng)一個(gè)任務(wù)通過系統(tǒng)調(diào)用進(jìn)入內(nèi)核之后,也在系統(tǒng)空間中運(yùn)行。

圖2.42 嵌入式Linux操作系統(tǒng)虛擬地址空間的劃分
如圖2.43所示,為了解決雙內(nèi)核共同運(yùn)行時(shí)的內(nèi)存管理問題,Hopen雙內(nèi)核操作系統(tǒng)將Linux任務(wù)的用戶空間壓縮到了0~2GB(從虛擬地址0X0~0X7FFFFFFF)。減少1GB的用戶空間對(duì)任何Linux任務(wù)都不會(huì)產(chǎn)生不良影響。節(jié)省出來(lái)的1GB地址空間沒有給Linux內(nèi)核使用,而是給了Hopen-RT的實(shí)時(shí)任務(wù)。Hopen-RT為每個(gè)實(shí)時(shí)任務(wù)提供32MB的用戶空間,并且最多可支持20個(gè)實(shí)時(shí)任務(wù)同時(shí)運(yùn)行。這樣一共需要640MB的地址空間。剩余的384MB的地址空間留給了共享庫(kù)。在Linux操作系統(tǒng)中1GB的地址空間雖然不歸Linux內(nèi)核使用,但被映射到系統(tǒng)空間中。在Hopen-RT操作系統(tǒng)中則是把任務(wù)的用戶空間映射到這1GB地址空間中某個(gè)32MB的區(qū)間內(nèi)。由于系統(tǒng)空間中的內(nèi)容常駐內(nèi)存,不會(huì)被換進(jìn)換出,所以大大提高了Hopen-RT實(shí)時(shí)任務(wù)的實(shí)時(shí)性。

圖2.43 Hopen雙內(nèi)核操作系統(tǒng)虛擬地址空間的劃分
4. 硬件抽象層模塊
硬件抽象層模塊之中封裝了一般意義上的硬件抽象層應(yīng)當(dāng)提供的功能。這些功能的作用是隱藏硬件平臺(tái)的一些細(xì)節(jié),增強(qiáng)操作系統(tǒng)的硬件無(wú)關(guān)性。
- 大學(xué)生進(jìn)階職場(chǎng)一本通(第2版)
- 移動(dòng)購(gòu)物行為及其執(zhí)行意向機(jī)制研究
- 山東師范大學(xué)外國(guó)語(yǔ)學(xué)院211翻譯碩士[專業(yè)碩士]英語(yǔ)歷年考研真題及詳解
- 投資學(xué)原理及應(yīng)用(第5版)
- 高教版《中國(guó)近現(xiàn)代史綱要》(2013年修訂)配套題庫(kù)【名校考研真題+課后習(xí)題+章節(jié)題庫(kù)+模擬試題】
- 電商視覺營(yíng)銷(微課版·第2版)
- 戴桂菊《俄羅斯地理》課后習(xí)題詳解
- 應(yīng)用寫作教程
- 北京服裝產(chǎn)業(yè)發(fā)展研究報(bào)告(品牌篇)
- 天津外國(guó)語(yǔ)大學(xué)211翻譯碩士英語(yǔ)[專業(yè)碩士]歷年考研真題及詳解
- 創(chuàng)新管理:計(jì)劃、組織、領(lǐng)導(dǎo)與控制
- 對(duì)外經(jīng)濟(jì)貿(mào)易大學(xué)公共管理學(xué)院781公共管理學(xué)歷年考研真題及詳解
- 環(huán)境設(shè)計(jì):手繪表現(xiàn)效果圖
- Python程序設(shè)計(jì)(微課版)
- 動(dòng)畫角色設(shè)計(jì)