




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
【移動應(yīng)用開發(fā)技術(shù)】深入iOS系統(tǒng)底層之指令集介紹
不以規(guī)矩.不能成方圓。--《孟子·離婁上》說到指令集以及CPU架構(gòu)體系,大家就會想到計算機專業(yè)課程里面的計算機體系結(jié)構(gòu)的方面的內(nèi)容。既然課程中已經(jīng)有了的內(nèi)容我就不想那么枯燥的去復(fù)述一遍,而是先看一個類的定義://定義寄存器編號
typedefenum:int{
Reg0,
Reg1,
Reg2,
Reg3
}RegNum;
//定義系統(tǒng)調(diào)用編號
typedefenum:int{
Int3//設(shè)備輸出,將寄存器Reg0中的內(nèi)容輸出到屏幕
}Interrupt;
//定義指令索引
typedefintInstruct;
/**
虛擬CPU類,模擬CPU所提供的指令。
虛擬CPU由4個寄存器和運算部件組成。四個寄存器的編號分別定義在RegNum中;運算部件提供了賦值、加減、比較、跳轉(zhuǎn)9個指令。
*/
@interfaceVCPU:NSObject
//將一個常量值賦值給編號為reg的寄存器中。
-(void)moveFromConst:(int)valtoReg:(RegNum)reg;
//將編號為reg1的寄存器中的值賦值給編號為reg2的寄存器中。
-(void)moveFromReg:(RegNum)reg1toReg:(RegNum)reg2;
//將編號為reg的寄存器中的值賦值給地址為addr的內(nèi)存中。
-(void)moveFromReg:(RegNum)regtoAddr:(Addr)addr;
//將地址為addr的內(nèi)存中的值賦值給編號為reg的寄存器中。
-(void)moveFromAddr:(Addr)addrtoReg:(RegNum)reg;
//將編號為reg1的寄存器中的值加上編號為reg2的寄存器中的值并將結(jié)果保存到編號為reg2的寄存器中。
-(void)addFromReg:(RegNum)reg1toReg:(RegNum)reg2;
//將編號為reg1的寄存器中的值減去編號為reg2的寄存器中的值并將結(jié)果保存到編號為reg2的寄存器中。
-(void)subFromReg:(RegNum)reg1toReg:(RegNum)reg2;
//如果兩個寄存器內(nèi)容相等則執(zhí)行instruct所指定的指令,否則什么也不做。
-(void)isEqualReg:(RegNum)reg1withReg:(RegNum)reg2thenGoto:(Instruct)instruct;
//跳轉(zhuǎn)到instruct所指定的指令中去。
-(void)jumpTo:(Instruct)instruct;
//系統(tǒng)返回
-(void)ret;
//系統(tǒng)調(diào)用,目前只支持屏幕輸出調(diào)用Int3,表示將寄存器編號為0中的值輸出到屏幕。
-(void)sys:(Interrupt)interrupt;
@end
上面是一個叫VCPU的類的定義部分,它是一個用OC語言實現(xiàn)的用來模擬CPU功能的類。我們再來看一個使用這個類的代碼片段:
-(void)main:(VCPU*)cpumemory:(VMemory*)memory
{
VINSTRUCT_BEGIN
VINSTRUCT(0,[cpumoveFromConst:10toReg:Reg0])//將常數(shù)10保存到CPU的寄存器Reg0中
VINSTRUCT(1,[cpumoveFromConst:15toReg:Reg1])//將常數(shù)15保存到CPU的寄存器Reg1中
VINSTRUCT(2,[cpuaddFromReg:Reg0toReg:Reg1])//將寄存器Reg0中的值于寄存器Reg1中的值相加并保存到Reg1中
VINSTRUCT(3,[cpumoveFromReg:Reg1toAddr:0x1000])//將保存在Reg1中的相加結(jié)果保存到內(nèi)存地址為0x1000處的內(nèi)存中
VINSTRUCT(4,[cpumoveFromAddr:0x1000toReg:Reg0])//將內(nèi)存地址0x1000處的內(nèi)存值保存到寄存器Reg0中
VINSTRUCT(5,[cpumoveFromConst:25toReg:Reg1])//將常數(shù)25保存到CPU的寄存器Reg1中
VINSTRUCT(6,[cpuisEqualReg:Reg0withReg:Reg1thenGoto:9])//如果Reg0中的值和Reg1中的值相等則執(zhí)行第9條指令:進行打印輸出
VINSTRUCT(7,[cpumoveFromReg:Reg1toAddr:0x1000])//將寄存器Reg1中的值保存到內(nèi)存地址為0x1000中。
VINSTRUCT(8,[cpujumpTo:10])//跳轉(zhuǎn)去執(zhí)行第10條指令
VINSTRUCT(9,[cpusys:Int3])//系統(tǒng)調(diào)用,輸出保存在Reg0中的值。
VINSTRUCT(10,[cpuret])//程序結(jié)束。
VINSTRUCT_END
}您能看懂上面代碼所實現(xiàn)的功能嗎(要想查看并運行完整的代碼請到我的github站點中的VirtualSystem處下載)?您是否在例子里面隱約的感受到了上面代碼里面涉及到的一些關(guān)于CPU、內(nèi)存、進程等方面的概念和知識了?它其實就是實現(xiàn)了如下的簡單功能:-(void)main
{
inta=10;
intb=15;
a=a+b;
if(a==25){
NSLog(@"output:%d",a);
}
}考察一下VCPU類,你會發(fā)現(xiàn)這個類提供了一些非常基礎(chǔ)的操作方法:加減處理、數(shù)據(jù)移動、比較、地址跳轉(zhuǎn)、系統(tǒng)調(diào)用等功能。調(diào)用者可以利用這個類提供的操作方法來編寫并完成某個特定的功能。這個類的內(nèi)部實現(xiàn)還提供了幾個臨時存儲空間,可以通過RegNum編號來讀寫里面的數(shù)值。VCPU實際上是一個對真實CPU所具有的能力的一個簡單的模擬類。我們來看一下CPU的組成:從上面的CPU結(jié)構(gòu)圖片中可以看出CPU主要分為存儲單元(SU)和運算單元(ALU)以及控制單元(CU)。如果將這些部件和結(jié)構(gòu)映射到VCPU這個類時你會發(fā)現(xiàn):存儲單元所對應(yīng)的就是里面的數(shù)據(jù)成員;而運算單元和控制單元則對應(yīng)里面的所有實例方法,運算單元提供了CPU指令的實現(xiàn)(VCPU類提供了眾多的方法實現(xiàn))。我們稱一個CPU里面所提供的所有的指令的集合稱之為指令集。我們可以用OC語言來實現(xiàn)一個VCPU類,也可以用Swift語言來實現(xiàn)一個Swift版本的VCPU類,也可以用Java語言來實現(xiàn)一個Java版本的VCPU類。這其中不同的語言所提供的方法的定義形式是完全不同的:就比如說OC里面可以提供直接操作內(nèi)存地址的方法,但是Java里面則無法提供直接操作內(nèi)存地址的方法;即使是OC語言中我們要實現(xiàn)VCPU類中的方法也可以有很多種不同的方式。不同的廠家以及不同的技術(shù)工藝和技術(shù)水平以及具體的設(shè)備上所實現(xiàn)的CPU的體系架構(gòu)以及提供的功能也是有差異的。比如ARM指令架構(gòu)體系的CPU、x86指令體系架構(gòu)的CPU、POWER-PC指令架構(gòu)體系的CPU。這些不同體系的CPU因為架構(gòu)完全不同導(dǎo)致所提供的指令和存儲單元也完全不同。我們不可能讓ARM指令直接在X86的CPU上執(zhí)行(就如OC的提供方法無法在Java中執(zhí)行是一個道理)。相同體系架構(gòu)下的CPU指令則在一定程度上是可以相互兼容的,因為相同架構(gòu)體系下的CPU的指令集是一致的(類比為接口一致,但是內(nèi)部實現(xiàn)則不相同),比如說Intel公司所生產(chǎn)的x86系列的CPU和AMD公司所生產(chǎn)的x86系列CPU所提供的指令集是相似和兼容的,他們之間的差別只是內(nèi)部的實現(xiàn)不同而已。CPU指令集定義的是一個中央處理器所應(yīng)該提供的基礎(chǔ)功能的集合,它是一個標準是一個接口也是一個協(xié)議。在軟件開發(fā)中具有協(xié)議和接口定義的概念,無論是消費者還是提供者都需要遵循這個標準來進行編程和交互:提供者要實現(xiàn)接口所具有的功能,至于如何實現(xiàn)則是內(nèi)部的事情,不對外暴露,消費者也不需要知道具體的實現(xiàn)細節(jié);消費者則總是要按接口提供的功能方法并組合使用來完成某種功能。這種設(shè)計的思維對于硬件系統(tǒng)也是一樣適用的。一般情況下某種CPU指令集通常都是由某些設(shè)計或者生產(chǎn)CPU的公司或者某標準組織共同定義而形成。那么目前市面上有哪些主流的CPU指令集或CPU架構(gòu)體系呢?
此處參考自:/item/Intel%20x86/1012845?fromtitle=x86&fromid=6150538
此處參考自:/item/Intel%20x86/1012845?fromtitle=x86&fromid=6150538x86架構(gòu)是Intel公司在1978年推出的Intel8086中央處理器中首度出現(xiàn),從Intel80386開始支持32位的系統(tǒng)。x86現(xiàn)在幾乎是個人計算機的標準平臺,成為了歷來最成功的CPU架構(gòu)。其他公司也有制造x86架構(gòu)的處理器:有AMD、Cyrix、NEC、IBM、IDT以及Transmeta等。64位架構(gòu)到2002年,由于32位特性的長度,x86的架構(gòu)開始到達某些設(shè)計的極限。這個導(dǎo)致要處理大量的信息儲存大于4GB會有困難。Intel原本已經(jīng)決定在64位的時代完全地舍棄x86兼容性,推出新的架構(gòu)稱為IA-64技術(shù)作為他的Itanium處理器產(chǎn)品線的基礎(chǔ)。IA-64與x86的軟件天生不兼容;它使用各種模擬形式來運行x86的軟件,不過,以模擬方式來運行的效率十分低下,并且會影響其他程序的運行。AMD公司則主動把32位x86(或稱為IA-32)擴充為64位。它以一個稱為AMD64的架構(gòu)出現(xiàn)(在重命名前也稱為x86-64),且以這個技術(shù)為基礎(chǔ)的第一個產(chǎn)品是單內(nèi)核的Opteron和Athlon64處理器家族。由于AMD的64位處理器產(chǎn)品線首先進入市場,且微軟也不愿意為Intel和AMD開發(fā)兩套不同的64位操作系統(tǒng),Intel也被迫采納AMD64指令集且增加某些新的擴充到他們自己的產(chǎn)品,命名為EM64T架構(gòu)(顯然他們不想承認這些指令集是來自它的主要對手),EM64T后來被Intel正式更名為Intel64(也就是x64指令集)。
在iOS編程時如果要運行在模擬器上,代碼生成的機器指令時就需要指定使用i386還是x64指令集,因為目前的mac電腦上基本采用了x86或者x64架構(gòu)的CPU。
在iOS編程時如果要運行在模擬器上,代碼生成的機器指令時就需要指定使用i386還是x64指令集,因為目前的mac電腦上基本采用了x86或者x64架構(gòu)的CPU。
此處參考自:/item/ARM/7518299
此處參考自:/item/ARM/7518299ARM處理器是英國Acorn有限公司設(shè)計的低功耗成本的第一款RISC微處理器。全稱為AdvancedRISCMachine。ARM處理器本身是32位設(shè)計,但也配備16位指令集。1978年12月5日,物理學(xué)家赫爾曼·豪澤(HermannHauser)和工程師ChrisCurry,在英國劍橋創(chuàng)辦了CPU公司(CambridgeProcessingUnit),主要業(yè)務(wù)是為當?shù)厥袌龉?yīng)電子設(shè)備。1979年,CPU公司改名為Acorn公司。起初,Acorn公司打算使用摩托羅拉公司的16位芯片,但是發(fā)現(xiàn)這種芯片太慢也太貴。"一臺售價500英鎊的機器,不可能使用價格100英鎊的CPU!"他們轉(zhuǎn)而向Intel公司索要80286芯片的設(shè)計資料,但是遭到拒絕,于是被迫自行研發(fā)。1985年,RogerWilson和SteveFurber設(shè)計了他們自己的第一代32位、6MHz的處理器,并用它做出了一臺RISC指令集的計算機,簡稱ARM(AcornRISCMachine)。這就是ARM這個名字的由來。
目前市面上的主流智能手機等移動設(shè)備配備的CPU都采用ARM架構(gòu)。iOS應(yīng)用真機編譯出來的機器指令都是ARM指令,因此需要在編譯時指定armv7或者arm64指令集。
目前市面上的主流智能手機等移動設(shè)備配備的CPU都采用ARM架構(gòu)。iOS應(yīng)用真機編譯出來的機器指令都是ARM指令,因此需要在編譯時指定armv7或者arm64指令集。
此處參考自:/item/MIPS架構(gòu)/1539401?fr=aladdin
此處參考自:/item/MIPS架構(gòu)/1539401?fr=aladdinMIPS架構(gòu)(英語:MIPSarchitecture,為Microprocessorwithoutinterlockedpipedstagesarchitecture的縮寫),是一種采取精簡指令集(RISC)的處理器架構(gòu),1981年出現(xiàn),由MIPS科技公司開發(fā)并授權(quán),廣泛被使用在許多電子產(chǎn)品、網(wǎng)絡(luò)設(shè)備、個人娛樂裝置與商業(yè)裝置上。最早的MIPS架構(gòu)是32位,最新的版本已經(jīng)變成64位。
目前國內(nèi)的龍芯CPU,采用的就是MIPS指令集。
目前國內(nèi)的龍芯CPU,采用的就是MIPS指令集。
此處參考自:/item/POWER%20PC/5963071?fr=aladdin
此處參考自:/item/POWER%20PC/5963071?fr=aladdinPOWER-PC由摩托羅拉公司和蘋果公司聯(lián)合開發(fā)的高性能32位和64位RISC微處理器系列,以與壟斷PC機市場的Intel微處理器和微軟公司的軟件相競爭。PowerPC微處理器1994年推出。IBM以前跟Intel競爭過桌面處理器市場,但由于市場策略不當?shù)仍颍琁BM沒賺到什么錢,于是決定退出桌面市場。POWER系列處理器是它退出桌面市場后才開發(fā)出來的服務(wù)器用處理器,蘋果電腦用的處理器只是Power系列里的一種,據(jù)說是IBM為蘋果特制的簡化版本,而蘋果獨一無二的經(jīng)營理念使蘋果電腦與其它PC都不兼容,所以目前的Power系列處理器不能用于桌面PC。目前蘋果電腦因PowerPC處理器不適合蘋果發(fā)展而轉(zhuǎn)而使用Intel處理器。
您是否在很多iOS庫的頭文件里面看到過POWER-PC的宏定義,早期的蘋果電腦都用POWER-PC的CPU,現(xiàn)在蘋果電腦基本都改為x64架構(gòu)的CPU了。
您是否在很多iOS庫的頭文件里面看到過POWER-PC的宏定義,早期的蘋果電腦都用POWER-PC的CPU,現(xiàn)在蘋果電腦基本都改為x64架構(gòu)的CPU了。CPU體系的分類上面列出了一些關(guān)于CPU架構(gòu)和指令集的介紹,不同的體系結(jié)構(gòu)具有各自的優(yōu)缺點,我們可以從不同的角度對CPU進行分類:所謂字長就是指CPU的指令在一個周期內(nèi)能夠處理的最大的數(shù)字或者理解為對內(nèi)存地址的最大的尋址能力。因此按這個長度可以做如下分類:一般情況下大字長的CPU指令集都會兼容小字長的CPU指令集。比如32位的應(yīng)用程序能夠在64位的CPU上執(zhí)行,而小字長的CPU指令集則無法直接提供大字長指令集的能力,如需要支撐則通常都是通過模擬來完成的,比如說一個64位字長CPU的讀取數(shù)據(jù)指令在32位字長CPU上就可以通過模擬兩次讀取來完成,現(xiàn)在有的CPU提供了指令模擬的功能,因此某些64位的應(yīng)用程序還是可以運行在32位的CPU上的,只不過性能和速度會存在很大的損耗。
此處參考自:/view/b5a138d43186bceb19e8bb62.html、/question/200786121943026445.html。
此處參考自:/view/b5a138d43186bceb19e8bb62.html、/question/200786121943026445.html。所謂指令的復(fù)雜度就是指CPU指令集中所提供的指令的數(shù)量、指令尋址模式、指令參數(shù)、以及CPU內(nèi)部的架構(gòu)設(shè)計的復(fù)雜度、以及指令本身所占據(jù)的字節(jié)數(shù)等來進行劃分的一種方式,一般有兩種類型的分類:CISC指令集。CISC的英文全稱為“ComplexInstructionSetComputer”,即“復(fù)雜指令系統(tǒng)計算機”,從計算機誕生以來,人們一直沿用CISC指令集方式。早期的桌面軟件是按CISC設(shè)計的,并一直沿續(xù)到現(xiàn)在。目前,桌面計算機流行的x86體系結(jié)構(gòu)即使用CISC。在CISC微處理器中,程序的各條指令是按順序串行執(zhí)行的,每條指令中的各個操作也是按順序串行執(zhí)行的。順序執(zhí)行的優(yōu)點是控制簡單,但計算機各部分的利用率不高,執(zhí)行速度慢。CISC架構(gòu)的服務(wù)器主要以x86/x64架構(gòu)(IntelArchitecture)為主,而且多數(shù)為中低檔服務(wù)器所采用。下面的表格舉出了CISC和RISC兩種體系結(jié)構(gòu)的差別:
此處參考自:/conowen/article/details/7256260
此處參考自:/conowen/article/details/7256260按指令流和數(shù)據(jù)流來進行分類的依據(jù)是CPU的一條指令可以同時處理多少條數(shù)據(jù),或者一條數(shù)據(jù)同時被多少條指令處理,以及在一個CPU時間周期內(nèi)可以同時執(zhí)行多少條指令等規(guī)則來劃分的。因此可以劃分為如下四種:單指令流單數(shù)據(jù)流機器(SISD)SISD機器是一種傳統(tǒng)的串行計算機,它的硬件不支持任何形式的并行計算,所有的指令都是串行執(zhí)行。并且在某個時鐘周期內(nèi),CPU只能處理一個數(shù)據(jù)流。因此這種機器被稱作單指令流單數(shù)據(jù)流機器。早期的計算機都是SISD機器,如馮諾.依曼架構(gòu),如IBMPC機,早期的巨型機和許多8位的家用機等。單指令流多數(shù)據(jù)流機器(SIMD)SIMD是采用一個指令流處理多個數(shù)據(jù)流。這類機器在數(shù)字信號處理、圖像處理、以及多媒體信息處理等領(lǐng)域非常有效。Intel處理器實現(xiàn)的MMXTM、SSE(StreamingSIMDExtensions)、SSE2及SSE3擴展指令集,都能在單個時鐘周期內(nèi)處理多個數(shù)據(jù)單元。也就是說我們現(xiàn)在用的單核計算機基本上都屬于SIMD機器。(個人覺得GPU也屬于這個范疇)多指令流單數(shù)據(jù)流機器(MISD)MISD是采用多個指令流來處理單個數(shù)據(jù)流。由于實際情況中,采用多指令流處理多數(shù)據(jù)流才是更有效的方法,因此MISD只是作為理論模型出現(xiàn),沒有投入到實際應(yīng)用之中。虛擬環(huán)境最后我們還是回到VCPU類來,VCPU是一個對CPU的簡單的模擬實現(xiàn)。我們知道用vmware軟件可以用來模擬出一個操作系統(tǒng)運行的硬件環(huán)境,而實現(xiàn)了虛擬設(shè)備的功能;微軟公司在2017年宣布他的Visualstudio2017上能夠開發(fā)并運行iOS應(yīng)用,并且可以無縫的將代碼拷貝到XCODE上編譯并運行。其實現(xiàn)的原理是Visualstudio2017本身提供了一個OC語言編譯器,同時他內(nèi)部也提供了一個CocoaUI框架的模擬實現(xiàn)版本,所以能在上面運行iOS應(yīng)用。從上面的幾個例子中我們可以發(fā)現(xiàn)一個特點就是:一個系統(tǒng)各個層次之間的調(diào)用總是通過某些約定的規(guī)則或者定義的接口來進行的,并且調(diào)用者是不知道也不需要知道提供者是如何實現(xiàn)這些能力的,總是一切皆是接口:正是因為有這些接口的定義以及標準的形成,我們才可以將原本真實的實現(xiàn)模擬出另外一個虛擬的實現(xiàn)出來。這也就是所謂的虛擬化的本質(zhì)。虛擬化可以發(fā)生在任何一個層面,也可以進行全局虛擬或者是部分虛擬。我們可以對CPU的指令以及硬件接口進行模擬從而構(gòu)建出一套類似vmware一樣的虛擬機軟件來運行任何操作系統(tǒng);我們也可以對操作系統(tǒng)提供的接口API進行模擬從而構(gòu)建出一套類似Wine一樣的虛擬Windows運行環(huán)境出來;我們還可以對操作系統(tǒng)所提供的文件系統(tǒng)或者存儲系統(tǒng)來進行模擬從而提供出一套類似Docker之類的應(yīng)用容器出來;我們也
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025-2030年中國聚酰亞胺(PI)薄膜行業(yè)運行現(xiàn)狀及發(fā)展前景分析報告
- 2025福建省建筑安全員C證考試題庫
- 南京師范大學(xué)《統(tǒng)計學(xué)專業(yè)前沿》2023-2024學(xué)年第二學(xué)期期末試卷
- 四川農(nóng)業(yè)大學(xué)《醫(yī)學(xué)論文寫作與學(xué)術(shù)誠信》2023-2024學(xué)年第二學(xué)期期末試卷
- 廣西體育高等??茖W(xué)?!兜厍蛭锢韺W(xué)》2023-2024學(xué)年第二學(xué)期期末試卷
- 甘肅畜牧工程職業(yè)技術(shù)學(xué)院《研究型綜合》2023-2024學(xué)年第二學(xué)期期末試卷
- 哈爾濱工程大學(xué)《學(xué)前教育專業(yè)英語》2023-2024學(xué)年第二學(xué)期期末試卷
- 2024-2025學(xué)年山東省百師聯(lián)考高三上學(xué)期11月考試歷史試卷
- 上海民遠職業(yè)技術(shù)學(xué)院《服裝市場調(diào)研》2023-2024學(xué)年第二學(xué)期期末試卷
- 山西信息職業(yè)技術(shù)學(xué)院《秘書學(xué)》2023-2024學(xué)年第二學(xué)期期末試卷
- 《材料工程基礎(chǔ)》教學(xué)大綱
- 介紹國家-巴西Brazil
- 國內(nèi)外材料牌號對照
- 建設(shè)工程施工合同培訓(xùn)PPT(49頁)
- 2010哈弗H5維修手冊
- (完整版)NRS數(shù)字分級法評分表
- LY∕T 2780-2016 松皰銹病菌檢疫技術(shù)規(guī)程
- 一文看懂全部變電站電氣主接線方式
- 蘇科版四年級勞動技術(shù)下冊教學(xué)計劃
- 應(yīng)答器報文定義《運基信號[2005]224號》
- 電網(wǎng)公司客戶資產(chǎn)接收管理細則
評論
0/150
提交評論