要:
為了滿足高精度軟件接收機對衛(wèi)星導(dǎo)航中頻信號傳輸系統(tǒng)的新要求,設(shè)計了一種基于PCIe總線的傳輸系統(tǒng)。該系統(tǒng)以Virtex-5 FPGA為核心控制器件,以DMA方式通過4通道PCIe接口傳輸導(dǎo)航衛(wèi)星數(shù)據(jù)。詳細介紹傳輸系統(tǒng)AD模塊、DMA控制模塊、中斷模塊等核心模塊的FPGA實現(xiàn)方法。經(jīng)過測試與驗證,系統(tǒng)讀寫速率分別達到了800 MB/s和650 MB/s,可以滿足不同層次導(dǎo)航軟件接收機對原始導(dǎo)航數(shù)據(jù)的需求。
中文引用格式:蔡曉暉,鄭植,李浩.基于PCIe總線的衛(wèi)星導(dǎo)航信號傳輸系統(tǒng)設(shè)計[J].電子技術(shù)應(yīng)用,2015,41(06):24-26+30.
?
0 引言
近年來,隨著軟件無線電技術(shù)的快速發(fā)展,GNSS軟件接收機因其高度的靈活性、通用性、開放性等優(yōu)點,成為GNSS接收機的發(fā)展主流[1]。GNSS數(shù)據(jù)傳輸系統(tǒng)作為軟件接收機的硬件部分,通過射頻接收、A/D轉(zhuǎn)換、數(shù)字采集與傳輸?shù)饶K為GNSS軟件接收機提供原始的觀察數(shù)據(jù),原始數(shù)據(jù)的質(zhì)量在一定程度上影響著軟件接收機對原始數(shù)據(jù)的要求。
目前導(dǎo)航中頻信號的傳輸系統(tǒng)大都基于USB、PCI總線[2-3],采樣速率、數(shù)據(jù)傳輸速率都越來越無法滿足高性能軟件接收機的需求,PCIe作為第三代的高性能I/O串行總線,在總線帶寬、傳輸速率、靈活性等方面都有了較大的提升,根據(jù)實際系統(tǒng)的不同,它可以靈活配置成X1、X4、X8和X16通道,單通道在每個方向上的發(fā)送與接收速率可以達到2.5 Gb/s,可以滿足各種軟件接收機對原始導(dǎo)航數(shù)據(jù)的需求。
1 系統(tǒng)組成
本文所設(shè)計的導(dǎo)航數(shù)字中頻信號傳輸系統(tǒng)由A/D模塊、Xilinx、PCIe IP硬核+PCIe-DMA控制模塊、數(shù)據(jù)緩存模塊組成,系統(tǒng)基本結(jié)構(gòu)如圖1所示。A/D模塊接收射頻前端產(chǎn)生的模擬中頻型號,對其進行240 MS/s的采樣;FPGA完成A/D的控制邏輯及采樣后信號的數(shù)字處理,同時FPGA還產(chǎn)生PCIe硬核的DMA控制邏輯,將最終的導(dǎo)航數(shù)據(jù)通過PCIe接口傳輸?shù)缴衔粰C。
2 系統(tǒng)關(guān)鍵模塊設(shè)計
2.1 A/D模塊設(shè)計
模數(shù)轉(zhuǎn)換器(ADC)是采集系統(tǒng)的關(guān)鍵器件之一。系統(tǒng)采用AD9467實現(xiàn)數(shù)據(jù)轉(zhuǎn)換功能,AD9467是一款量化精度為16 bit、采樣時鐘頻率高達250 MHz的模數(shù)轉(zhuǎn)換器,具有優(yōu)異的性能。該模塊接收射頻前端模塊經(jīng)下變頻產(chǎn)生的模擬中頻信號,考慮到GNSS各頻段導(dǎo)航信號(包括GPS、GLONSS、GALILEO以及北斗)為大約210 MHz[4]的帶通信號(見表1)以及整數(shù)倍頻率抽取兩個因素,將A/D采樣頻率設(shè)置為240 MS/s,采樣后的數(shù)據(jù)經(jīng)過FPGA數(shù)字處理模塊后變成IQ數(shù)據(jù),采樣率變?yōu)?0 Mb/s,通過數(shù)據(jù)緩存,經(jīng)PCIe接口傳輸?shù)缴衔粰C。
2.2 PCIe-DMA控制模塊設(shè)計
本系統(tǒng)采用Xilinx公司的Virtex5-XC5VFX70T芯片,該芯片集成了PCIe硬核,實現(xiàn)了X4通道的PCIe接口。系統(tǒng)的DMA控制邏輯原理框圖如圖2所示,其主要包含PCIe配置空間接口設(shè)計、發(fā)送模塊、接收模塊以及中斷控制模塊。
2.2.1 PCIE接口的配置空間
PCI Express配置空間與驅(qū)動程序設(shè)計密切相關(guān),它是PCI Express傳輸卡與上位機的接口管理部分。配置寄存器空間用來與上位機進行交流,上位機驅(qū)動程序主要通過這組寄存器對傳輸卡進行控制。而FPGA端則根據(jù)上位機在配置寄存器中的具體參數(shù)來完成DMA傳輸。表2列出了這組寄存器的具體名稱及偏移地址。
2.2.2 數(shù)據(jù)發(fā)送模塊
在本設(shè)計中,發(fā)送數(shù)據(jù)模塊(TX_ENGING)接收經(jīng)A/D采樣、數(shù)字處理后的導(dǎo)航信號,根據(jù)上位機的DMA讀請求,將導(dǎo)航數(shù)據(jù)組織成相應(yīng)的TLP包[5]發(fā)送至上位機。其幀頭格式如圖3所示。
初始狀態(tài)下狀態(tài)機處于TX_RXT復(fù)位狀態(tài),如圖4所示,其有效轉(zhuǎn)換狀態(tài)可以概括為以下幾點:
(1)發(fā)送CPLD包:TX端帶數(shù)據(jù)的完成包主要響應(yīng)上位機對配置空間的讀請求,當(dāng)板卡RX端收到上位機的DMA讀請求后,會由開始狀態(tài)進入發(fā)送CPLD包的狀態(tài),根據(jù)讀請求包中的地址信息,將配置空間對應(yīng)寄存器中數(shù)據(jù)返回給上位機。
(2)發(fā)送存儲器寫數(shù)據(jù)包(MWR包):在配置寄存器中存儲著每次DMA寫操作的相關(guān)參數(shù),當(dāng)DMA寫開始后,TX端會根據(jù)上述寄存器參數(shù)來組織發(fā)送相應(yīng)的MWR包。
(3)發(fā)送存儲器讀數(shù)據(jù)包(MRD包):該數(shù)據(jù)包用來讀取上位機的回傳數(shù)據(jù),當(dāng)DMA讀開始后,TX端會根據(jù)配置寄存器參數(shù)組織發(fā)送相應(yīng)的MRD包。
2.2.3 數(shù)據(jù)接收模塊
接收端(RX_ENGING)接收上位機經(jīng)PCIe IP硬核傳輸過來的TLP包,其狀態(tài)機設(shè)計如圖5所示,可以大致分為以下幾種狀態(tài)跳轉(zhuǎn):
(1)接收完成包(CPLD包):當(dāng)TX端發(fā)出對上位機的讀請求后,RX端會收到上位機發(fā)出的CPLD完成包,其中包內(nèi)的數(shù)據(jù)即為所要讀取的PC端數(shù)據(jù),此時狀態(tài)機進入CPLD狀態(tài),開始接收PC端的數(shù)據(jù)。
(2)接收存儲器寫數(shù)據(jù)包(MWR包)和存儲器讀數(shù)據(jù)包(MRD包):PC端能夠讀寫板卡的范圍只能是配置空間的配置寄存器,并且每次讀寫只能是一個雙字。PC端通過讀寫B(tài)AR空間來實現(xiàn)板卡與上位機的“交流”,大致可以概括為以下兩點:
①對于DMA寫操作:PC端通過MWR包來設(shè)置相應(yīng)寄存器的值,主要包含:WriteDMATLPAddress、WriteDMATLPSize、WriteDMATLPCount、DCSR2、INT。通過MRD包來讀取相應(yīng)寄存器的值,在DMA寫過程中主要讀取DMA寫結(jié)束寄存器來判斷DMA寫是否結(jié)束。
②對于DMA讀操作:PC端通過MWR包來設(shè)置相應(yīng)寄存器的值,主要包含:ReadDMATLPAddress、ReadDMATLPSize、WriteDMATLPCount、DCSR2、INT。通過MRD包來讀取相應(yīng)寄存器的值,在DMA讀過程中主要讀取DMA讀結(jié)束寄存器來判斷DMA讀是否結(jié)束。
其操作配置空間寄存器流程如圖6所示。
2.2.4 中斷控制模塊
中斷是為計算機處理緊急事件或非預(yù)測事件而設(shè)計的,也是PCIe傳輸系統(tǒng)設(shè)計的重要組成部分[6],優(yōu)良的中斷設(shè)計可以有效提高整個系統(tǒng)的性能。在Xilinx平臺中,發(fā)出中斷主要操作核的4個信號,其時序圖如圖7所示,cfg_interrupt_n為中斷信號,在整個中斷周期內(nèi)拉低兩次,第一次表示發(fā)出中斷,第二次表示清除中斷。
設(shè)置配置空間偏移地址0x50為中斷寄存器,其具體格式如表3所示。當(dāng)DMA讀或者寫完成后,F(xiàn)PGA發(fā)出相應(yīng)的讀寫完成中斷到上位機,同時將中斷寄存器中的中斷有效位和讀/寫位置1,上位機驅(qū)動收到該中斷后,讀取BAR空間中斷寄存器的值,判斷中斷類型,進入相應(yīng)中斷處理程序,此后FPGA端發(fā)出清除中斷信號,同時將中斷寄存器各位置0,當(dāng)上位機收到該信號后,跳出中斷控制程序,數(shù)據(jù)傳輸結(jié)束。
3 實驗與測試
數(shù)據(jù)采集傳輸卡設(shè)計完成后,在基于PCIe的總線的上位機上進行測試,A/D端接入射頻前端的模擬中頻信號,經(jīng)數(shù)據(jù)處理、緩存后送入PCIe總線并傳入上位機,F(xiàn)PGA程序使用Verilog語言編寫,在ISE開發(fā)環(huán)境進行設(shè)計和測試,上位機驅(qū)動采用微軟的驅(qū)動開發(fā)環(huán)境WDF(Windows Driver Foundation)。系統(tǒng)集成后首先利用ISE ChipScope工具對硬件邏輯設(shè)計部分進行驗證,圖8所示為一次導(dǎo)航數(shù)據(jù)DMA傳輸?shù)臅r序圖,為了便于觀察時序,設(shè)置一次傳輸DMA的包個數(shù)為100。時序分析可知,中斷控制信號cfg_interrupt_n在數(shù)據(jù)發(fā)送端口trn_td發(fā)送完數(shù)據(jù)包后,連續(xù)兩次有效,最終完成一次DMA的傳輸。
考慮到上位機對FPGA發(fā)出的PCIe的中斷處理需要一定時間,而這個時間在DMA傳輸數(shù)據(jù)量較小時對系統(tǒng)性能影響較大,因此在速度測試時參考了3個速度,分別是傳輸卡、設(shè)備驅(qū)動以及應(yīng)用程序,傳輸卡速度為PCIe傳輸接口上的總線速度,不考慮上位機的中斷響應(yīng)時間,測試結(jié)果如圖9、圖10所示。結(jié)果表明,在傳輸數(shù)據(jù)較小時由于上位機中斷處理所需時間,驅(qū)動層與應(yīng)用層讀寫速度較慢;當(dāng)傳輸數(shù)據(jù)逐漸增大后,三者傳輸速度趨于一致,DMA寫速度為800 MB/s,DMA讀速度為630 MB/s。
4 結(jié)論
本文設(shè)計了一種基于Virtex-5 FPGA的4通道PCIe導(dǎo)航中頻信號傳輸系統(tǒng),經(jīng)過測試與驗證,該系統(tǒng)能夠滿足了高精度軟件接收機對導(dǎo)航原始數(shù)據(jù)的需求,與目前主流的基于USB、PCI總線的導(dǎo)航中頻信號傳輸系統(tǒng)相比,本系統(tǒng)在信號采集速率、傳輸速度方面都具有明顯的優(yōu)勢。同時該系統(tǒng)的設(shè)計方法也可以推廣到雷達、通信、圖像處理等高速數(shù)據(jù)傳輸領(lǐng)域。
參考文獻
[1] 謝鋼.GPS原理與接收機設(shè)計[M].北京:電子工業(yè)出版社,2009.
[2] 胡濱,王慶,嚴偉.基于USB和FPGA的GPS中頻信號采集平臺設(shè)計[J].艦船電子對抗,2009(9):63-66.
[3] 賈志宏,崔曉偉.室內(nèi)GPS的數(shù)字化采集設(shè)計[J].科學(xué)技術(shù)與工程,2012(9):7031-7034.
[4] 鄧仕海,姚錚.全頻段多系統(tǒng)全球?qū)Ш叫l(wèi)星系統(tǒng)數(shù)據(jù)采集系統(tǒng)的設(shè)計與實現(xiàn)[J].科學(xué)技術(shù)與工程,2014(1):191-194.
[5] 候杭呈,王憶文,李輝.一種基于PCI Express總線的DMA高速傳輸系統(tǒng)[J].微電子學(xué),2013(6):383-386.
[6] 唐雷雷,賀占莊.PCI Express總線中消息中斷的研究[J].微電子學(xué)與計算機,2013(7):137-140.
經(jīng)過Linux基礎(chǔ) 個人VPS安全的相關(guān)設(shè)置,相信你的VPS的安全性已經(jīng)大在地提升了。同時你對linux命令的使用應(yīng)該也更加熟悉了!如果你使用的是國外的VPS和域名,甚至不需要備案就可以開始搭建互聯(lián)網(wǎng)服務(wù)了,比如個人圖床、個人博客了。
這一回我們簡單地講一下使用Linux系統(tǒng)時有關(guān)目錄管理的實踐。目錄管理個性化很強的,沒有什么天經(jīng)地義的規(guī)矩。這里我會講一些自己的習(xí)慣,僅供大家參考。
uname -a # Linux VM-12-8-ubuntu 5.4.0-42-generic #46-Ubuntu SMP Fri Jul 10 00:24:02 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
我們先進入一下用戶的home目錄:
cd ~
我們看看有哪些東西:
ls -hl
比如我的輸出就是這樣:
total 4.0K
drwxr-xr-x 2 test_user test 4.0K Apr 20 21:13 softwares
顧名思義,這個目錄是用來存在軟件的。因為有一些軟件是無法通過apt-get來安裝的,所以一般要通過某種方法下載到本地。如果你用的時間長了,可能會有不少軟件,這時候如果這里一個那里一個,就顯得很混亂了。這里我自定義兩個小程序,來說明一下這個問題。
比如,我要創(chuàng)建兩個程序,第1個運行時會說“我愛你”。第2個程序運行時會說“你知道嗎?”。OK,我們開始!
我們一次性創(chuàng)建幾個程序的目錄:
mkdir -p ~/software/{test_love/v1.0.0,test_know/v1.0.0}
好像有點眼花,哈哈!沒事,我們用一下tree命令:
tree -phDu
我的輸出是這樣的:
.
├── [drwxr-xr-x 4.0K Apr 20 21:26] software
│ ├── [drwxr-xr-x 4.0K Apr 20 21:26] test_know
│ │ └── [drwxr-xr-x 4.0K Apr 20 21:26] v1.0.0
│ └── [drwxr-xr-x 4.0K Apr 20 21:26] test_love
│ └── [drwxr-xr-x 4.0K Apr 20 21:26] v1.0.0
└── [drwxr-xr-x 4.0K Apr 20 21:13] softwares
6 directories, 0 files
一般我安裝軟件的時候,會加多一層目錄用來表示軟件的版本。因為我發(fā)現(xiàn)有一些軟件會有很多個版本。如果你要安裝新版本但又不想馬上消除舊版本,這個方法就可以讓新舊版本可以比較整齊地擺放。
和上面的命令仔細地對比一下,體會一下mkdir的用法哈!注意,{}里不能有任何空格喔!
如果你沒有安裝tree,可以用sudo apt-get install tree來安裝。我覺得它很好用呢!
現(xiàn)在進入程序的目錄:
cd ~/software/test_love/v1.0.0
創(chuàng)建一個新的小程序:
vim test_love.sh
我們輸入以下內(nèi)容:
#! /usr/bin/bash
# 創(chuàng)建者:苯苯
# 用法
# bash test_love.sh
# 日志
# 2022-04-20:第一次創(chuàng)建程序
# 程序
echo '我愛你!'
# End
當(dāng)然,這里面很多東西都是被注釋的,只是為了說明情況,哈哈!就算沒有也不影響運行的。記得按:wq保存并退出。
這時,我們用一下這個剛剛寫的小程序,就會輸出我愛你!的字樣了:
bash test_love.sh
現(xiàn)在我們看一下這個文件的詳細信息:
cd ~/software/test_love/v1.0.0 && ls -hl
輸出如下:
total 4.0K
-rw-r--r-- 1 test_user test 153 Apr 20 21:38 test_love.sh
看,現(xiàn)在你對它只有rw兩種權(quán)限。我們加一個x權(quán)限,就是讓它成為一個可執(zhí)行文件:
sudo chmod +x test_love.sh
再運行命令ls -hl,輸出如下:
total 4.0K
-rwxr-xr-x 1 test_user test 153 Apr 20 21:38 test_love.sh
而且文件名變成了綠色喔!我們不加bash直接運行它:
./test_love.sh
這時會直接輸出我愛你!噢。
更進一步的,我們可以給這個文件映射一個軟鏈接到一個環(huán)境路徑。我們看看有哪些默認的環(huán)境路徑:
echo $PATH
輸出為:
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
我就選其中一個常見的吧,叫/usr/bin。
sudo ln -s /home/test_user/software/test_love/v1.0.0/test_love.sh /usr/bin/test_love
這個時候我們回home目錄:
cd ~
下面神奇的事情就要發(fā)生了!請輸入:
test_love
有沒有發(fā)現(xiàn)輸出了我愛你!再來檢查一下:
which test_love
這個時候會輸出/usr/bin/test_love。我們再來探索一下:
ls -hl /usr/bin/test_love
輸出為:
lrwxrwxrwx 1 root root 54 Apr 20 21:47 /usr/bin/test_love -> /home/test_user/software/test_love/v1.0.0/test_love.sh
前面有個l,說明這是一個軟鏈接。我個人覺得它和windows的快捷鍵差不多。你刪除這個軟鏈接也不會影響到源文件。值得一提的是,如果你用ln命令時不加-s,它會創(chuàng)建一個硬鏈接。我個人覺得硬鏈接和影分身差不多,只要有一個存在,宿主就不會消失,而且它還不消耗整個文件的大小,在PT下載和管理中很好用。這里不展開說了。
好了,這就是自己的第一個Linux小程序了。我還創(chuàng)建了另外一個目錄,自己也試著去實現(xiàn)我所講的效果,即運行時會說“你知道嗎?”。
不少軟件都是這樣使用的,即有一個原始目錄,然后有一些軟鏈接指向$PATH。
以后下載更多的程序時,就用類似程序名/版本號的方式保存文件和管理。蠻簡單吧!當(dāng)然,這只是一種個人建議。
其實,目錄管理對于Docker的使用也是很關(guān)鍵。這主要是與Docker的備份有關(guān)。我們可以先安裝一下Docker。
首先看看自己的VPS有沒有安裝好Docker了:
which docker # /usr/bin/docker
國內(nèi)VPS的Ubuntu用戶可以根據(jù)菜鳥教程來安裝。
我們可以先創(chuàng)建一個文件夾(可能沒什么用,哈哈)
mkdir -p ~/docker/@install/ && cd ~/docker/@install/
如果你已經(jīng)安裝了docker,就不要運行下面的命令!如果你沒有安裝docker,可以運行:
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
國外VPS的用戶也可以參考官方安裝方法,就是用不同的鏡像嘛。
等安裝完后,看一下docker:
which docker # /usr/bin/docker
我們下面安裝一下docker-compose,這個是一個布署docker服務(wù)的神器。你可以在這里查看docker-compose的最新發(fā)行版。選一個最新的版本下載即可。比如我寫此博文的時候,是v2.4.1。運行以下命令
sudo curl -L "https://github.com/docker/compose/releases/download/v2.4.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
國內(nèi)的VPS可以用:
sudo curl -L https://get.daocloud.io/docker/compose/releases/download/v2.4.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
然后進行一些設(shè)置:
sudo chmod +x /usr/local/bin/docker-compose
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
最后,看一下docker-compose的版本:
docker-compose --version # docker-compose version 1.28.6, build 5db8d86f
現(xiàn)在我們嘗試一下用布署一個docker服務(wù)。我選了一個叫做Ward的程序。
首先,我們創(chuàng)建目錄:
work=~/docker/ward/ && mkdir -p $work && cd $work
仔細體會一下這個創(chuàng)建和進入目錄的寫法喔!總之就是建立一個臨時的變量叫做work,我們暫時可以用$work來替代~/docker/ward/。特別是你的目錄名很長時,這個方法看上去比較簡潔。要注意,一旦你退出終端,這個變量就會消失。
我們新建一個docker-compose.yml:
vim docker-compose.yml
輸入以下內(nèi)容:
version: '3.3'
services:
ward:
restart: unless-stopped
container_name: ward
ports:
- '4000:4000'
environment:
- WARD_PORT=4000
- WARD_THEME=dark
- WARD_NAME=leons-server
privileged: true
image: antonyleons/ward
按:wq保存并退出。
這里分享一個Vim的小技巧。比如我想全部刪除剛剛輸入的內(nèi)容,只要這樣:
如果你在以前玩Vim的時候就試過,就知道它有多好用了!這個操作在以后部署docker-compose.yml文件時會很經(jīng)常用到,因為我們經(jīng)常要在markdown上做一些微調(diào),然后copy到vim里修改VPS上的文件。
當(dāng)然,這個Docker程序沒有掛載Volume到這個目錄里。在以后使用Docker的時候,掛載目錄是很常見的。我們備份docker一般就是備份這些目錄,它們通常是一些網(wǎng)頁根目錄或者是數(shù)據(jù)庫文件夾。
我們安裝一下這個應(yīng)用吧!只需要:
sudo docker-compose up -d
輸出類似于:
Creating network "ward_default" with the default driver
Pulling ward (antonyleons/ward:)...
latest: Pulling from antonyleons/ward
4d32b49e2995: Pull complete
2e7405b632dc: Pull complete
82681fa0d627: Pull complete
3425bfab69e8: Pull complete
8e73379da14f: Pull complete
7031d37fc351: Pull complete
Digest: sha256:209587b7f0d4cb2ffc7bf992cd280829e61c6add4f2948a4edd98790e5d2dd08
Status: Downloaded newer image for antonyleons/ward:latest
Creating ward ... done
我們看看它的基本狀態(tài):
sudo docker ps -a | grep ward
輸出如下:
33d53eb8dafc antonyleons/ward "/bin/sh -c 'java -j…" 48 seconds ago Up 47 seconds 0.0.0.0:4000->4000/tcp, :::4000->4000/tcp ward
如果你要正常地使用它,通常還要在ufw中請允許它的端口:
sudo ufw allow 4000 comment 'Ward dashboard' && sudo ufw reload
如果你用騰訊云之類的,還要在后臺打開一下4000端口:
這時候,打開http://<VPS公網(wǎng)ip>:4000看看這個應(yīng)用。界面是這樣的:
這個小東西可以在網(wǎng)上實時觀察你的服務(wù)器負載狀態(tài)喔!就像我的博客一樣:
https://wardrn2.hwb0307.com
看著有點花里胡哨的,哈哈!
下面我們下線這個服務(wù)。只需要:
sudo docker-compose down
輸出為:
Stopping ward ... done
Removing ward ... done
Removing network ward_default
如果你用的是較新版本的docker-compose,可能界面會略有不同。以后我們要備份這個應(yīng)用,只要備份~/docker/ward/這個目錄即可。是不是很帥呢!
如果你裝了很多docker應(yīng)用在~/docker這個目錄里,你甚至只要備份~/docker這一個目錄就可以了!是不是很帥呢!關(guān)于Docker備份的技巧以后出出博文討論嘍,也是蠻簡單的,這里按下不表。
經(jīng)過玩幾個小程序和一個小Docker應(yīng)用,你應(yīng)該大概了解目錄管理的重要性。以后記得要整理好自己的目錄,讓它干干凈凈喔!
轉(zhuǎn)至我的個人博客:https://blognas.hwb0307.com。
歡迎關(guān)注!