新聞中心
如果您是一個(gè)Linux開(kāi)發(fā)者或者想要成為一個(gè)Linux開(kāi)發(fā)者,那么一個(gè)高效的開(kāi)發(fā)環(huán)境是必不可少的。有時(shí)候,搭建一個(gè)理想的環(huán)境可能讓人感到困惑和超出預(yù)算。但是,如果您知道正確的步驟和工具,創(chuàng)建一個(gè)功能齊全的Linux開(kāi)發(fā)環(huán)境并不需要太多的時(shí)間和精力。

在本文中,我們將介紹如何快速搭建本地Linux開(kāi)發(fā)環(huán)境。
步驟1:選擇適合您的Linux發(fā)行版
您需要選擇適合您的Linux發(fā)行版,以便滿(mǎn)足您的開(kāi)發(fā)需求。有幾種流行的Linux發(fā)行版可供選擇,此外,您還可以根據(jù)偏好選擇其他特殊發(fā)行版。
例如,如果您是一個(gè)Java開(kāi)發(fā)者,那么您更好選擇基于Debian的發(fā)行版以便于使用apt-get安裝Java。如果您是一個(gè)C ++開(kāi)發(fā)者,那么您可能需要使用GCC。
步驟2:安裝必備軟件
接下來(lái),您需要安裝必備的軟件才能建立這種Linux開(kāi)發(fā)環(huán)境。以下是建立環(huán)境所需的一些必要組件:
1. 編輯器和IDE:您可能需要安裝編寫(xiě)和調(diào)試代碼的編輯器和IDE。在Linux發(fā)行版中,有許多可供選擇的工具,包括VIM,Atom,VS Code,Eclipse等。
2. 版本控制系統(tǒng):您將在開(kāi)發(fā)過(guò)程中使用版本控制工具來(lái)跟蹤代碼更改。Git是最常用的版本控制系統(tǒng)之一。
3. 虛擬機(jī):使用虛擬機(jī)可以方便地測(cè)試不同的操作系統(tǒng)和軟件環(huán)境。常見(jiàn)的虛擬機(jī)軟件包括VirtualBox和VMWare。
4. 其他開(kāi)發(fā)工具:根據(jù)您的需求,您可能需要使用其他工具,如編譯器,調(diào)試器等。
步驟3:配置您的開(kāi)發(fā)環(huán)境
一旦您下載并安裝了所需的軟件,您需要配置這些工具以構(gòu)建理想的開(kāi)發(fā)環(huán)境。
例如,您可以在自己的目錄下創(chuàng)建一個(gè)名為“code”的文件夾,以存儲(chǔ)自己的所有代碼。
您還需要配置您的編輯器和IDE,以便它們滿(mǎn)足您的特定需求。例如,您可以安裝一些插件或更改一些默認(rèn)設(shè)置。
步驟4:集成開(kāi)發(fā)環(huán)境
一旦您已經(jīng)安裝了所需的軟件并配置了您的編輯器和IDE,您需要將它們集成在一起,以便它們能夠順暢地工作。
例如,您可以配置您的編輯器來(lái)使用與Git一起工作的插件,使您可以在同步代碼時(shí)輕松跟蹤代碼更改。您也可以將您的編輯器與命令行工具集成,以便您可以在不離開(kāi)編輯器的情況下直接接受終端命令。
步驟5:測(cè)試
在您開(kāi)始使用Linux開(kāi)發(fā)環(huán)境之前,您應(yīng)該測(cè)試它以確保所有軟件和工具都可以順利運(yùn)行。在這個(gè)階段,您可以編寫(xiě)一些測(cè)試代碼,并使用您的編輯器和IDE調(diào)試您的代碼。
如果您不確定您已經(jīng)成功地搭建了開(kāi)發(fā)環(huán)境,有許多在線資源和論壇可以幫助您獲得支持。不要猶豫,積極尋找咨詢(xún)意見(jiàn)。
結(jié)論
我們已經(jīng)對(duì)此進(jìn)行了簡(jiǎn)單的介紹。至關(guān)重要的是,根據(jù)您的需求,選擇適合您的Linux發(fā)行版以實(shí)現(xiàn)您的開(kāi)發(fā)需求。
您還需要下載和配置所需的軟件,以便在開(kāi)發(fā)過(guò)程中滿(mǎn)足您的特定需求。進(jìn)行測(cè)試以確保環(huán)境能夠滿(mǎn)足您的需求。
成都網(wǎng)站建設(shè)公司-創(chuàng)新互聯(lián)為您提供網(wǎng)站建設(shè)、網(wǎng)站制作、網(wǎng)頁(yè)設(shè)計(jì)及定制高端網(wǎng)站建設(shè)服務(wù)!
關(guān)于Linux環(huán)境搭建的那些坑—簡(jiǎn)易安裝\創(chuàng)建用戶(hù)
由于測(cè)試原因,需要用虛機(jī)搭建了一個(gè)Linux環(huán)境,本以為憑著度娘的指導(dǎo),小事一樁,萬(wàn)萬(wàn)沒(méi)想到~~
總所周知,vmware軟件安裝好后,新建虛機(jī)安裝centos鏡像,按照網(wǎng)上教程,一步一步來(lái)就ok。那么問(wèn)題來(lái)了,在首次創(chuàng)建虛機(jī)系統(tǒng)時(shí)我們跟著教程直接選擇安裝鏡像,你是不是忽略了安裝iso文件下的那行小字(
該系統(tǒng)將使用簡(jiǎn)易安裝,詳見(jiàn)圖3
),對(duì)于開(kāi)發(fā)人員測(cè)試人桐升員來(lái)說(shuō),不能配置需要的參數(shù),這環(huán)境就是個(gè)雞肋呀。所以如何取消簡(jiǎn)易安裝呢?方法很簡(jiǎn)單,在第三步安裝操作系統(tǒng)時(shí),我們選擇
稍后安裝操作系統(tǒng)
,虛機(jī)創(chuàng)建完成后,重新編輯虛機(jī),添加我們需要的鏡像,重啟虛機(jī)后,就可以自己配置參數(shù)啦,詳見(jiàn)圖4 圖5.
好不容易跳過(guò)之一旦輪旦個(gè)坑,參數(shù)配置完成后開(kāi)始安裝,這時(shí)候,第二個(gè)坑悄然而至,驚不驚喜,意不意外!如圖6所示,系統(tǒng)會(huì)提示你創(chuàng)建用戶(hù),如果這個(gè)時(shí)候你乖乖的去新建了一個(gè)用戶(hù),已然可知你未來(lái)的悲慘生活。要知道,我們linux系統(tǒng)本身有個(gè)超級(jí)管理員root,此時(shí)你創(chuàng)建的用戶(hù)類(lèi)似于普通用戶(hù),普通用戶(hù)的權(quán)限和超級(jí)管理員的差別,就不需要我多說(shuō)了吧。當(dāng)然如果你不小心創(chuàng)建了普通用戶(hù),也不要慌,度娘上還是有很多優(yōu)秀的大佬提供的解決方式,但是具體實(shí)踐起來(lái),請(qǐng)自行體會(huì)。
以上,就是在安裝linux系統(tǒng)時(shí),需要特別注意的地方,如有遺漏,模擾請(qǐng)大家多多補(bǔ)充
如何搭建一個(gè)Linux驅(qū)動(dòng)編寫(xiě)環(huán)境
如何編寫(xiě)Linux設(shè)備驅(qū)動(dòng)程序
回想學(xué)習(xí)Linux操作系統(tǒng)已經(jīng)有近一年的時(shí)間了,前前后后,零零碎碎的一路學(xué)習(xí)過(guò)來(lái),也該試著寫(xiě)的東西了。也算是給自己能留下一點(diǎn)記憶和回憶吧!由于完全是自學(xué)的,以下內(nèi)容若有不當(dāng)之處,還請(qǐng)大家多指教。
Linux是Unix操作系統(tǒng)的一種變種,在Linux下編寫(xiě)驅(qū)動(dòng)程序的原理和思想完全類(lèi)似于其他的Unix系統(tǒng),但它dos或window環(huán)境下的驅(qū)動(dòng)程序有很大的區(qū)別。在Linux環(huán)境下設(shè)計(jì)驅(qū)動(dòng)慧肢程序,思想簡(jiǎn)潔,操作方便,功能也很強(qiáng)大,但是支持函數(shù)少,只能依賴(lài)kernel中的函數(shù),有些常用的操作要自己來(lái)編寫(xiě),而且調(diào)試也不方便。
以下的一些文字主要來(lái)源于khg,johnsonm的Write linux device driver,Brennan’s Guide to Inline Assembly,The Linux A-Z,還有清華BBS上的有關(guān)device driver的一些資料。
一、Linux device driver 的概念
系統(tǒng)調(diào)用是操作系統(tǒng)內(nèi)核和應(yīng)用程序之間的接口,設(shè)備驅(qū)動(dòng)程序是操作系統(tǒng)內(nèi)核和機(jī)器硬件之間的接口。設(shè)備驅(qū)動(dòng)程序?yàn)閼?yīng)用程序屏蔽了硬件的細(xì)節(jié),這樣在應(yīng)用程序看來(lái),硬件設(shè)備只是一個(gè)設(shè)備文件,應(yīng)用程序可以象操作普通文件一樣對(duì)硬件設(shè)備進(jìn)行操作。設(shè)備驅(qū)動(dòng)程序是內(nèi)核的一部分,它完成以下的功能:
1、對(duì)設(shè)備初始化和釋放。
2、把數(shù)據(jù)從內(nèi)核傳送到硬件和從硬件讀取數(shù)據(jù)。
3、讀取應(yīng)用程序傳送給設(shè)備文件的數(shù)據(jù)和回送應(yīng)用程序請(qǐng)求的數(shù)據(jù)。
4、檢測(cè)和處理設(shè)備出現(xiàn)的錯(cuò)誤。
在Linux操作系統(tǒng)下有三類(lèi)主要的設(shè)備文件類(lèi)型,一是字符設(shè)備,二是塊設(shè)備,三是網(wǎng)絡(luò)設(shè)備。字符設(shè)備和塊設(shè)備的主要區(qū)別是:在對(duì)字符設(shè)備發(fā)出讀/寫(xiě)請(qǐng)求時(shí),實(shí)際的硬件I/O一般就緊接著發(fā)生了,塊設(shè)備則不然,它利用一塊系統(tǒng)內(nèi)存作緩沖區(qū),當(dāng)用戶(hù)進(jìn)程對(duì)設(shè)備請(qǐng)求能滿(mǎn)足用戶(hù)的要求,就返回請(qǐng)求的數(shù)據(jù),如果不能,就調(diào)用請(qǐng)求函數(shù)來(lái)進(jìn)行實(shí)際的I/O操作。塊設(shè)備是主要針對(duì)磁盤(pán)等慢速設(shè)備設(shè)計(jì)的,以免耗費(fèi)過(guò)多的CPU時(shí)間來(lái)等待。
已經(jīng)提到,用戶(hù)進(jìn)程是通過(guò)設(shè)備文件來(lái)與慧唯實(shí)際的硬件打交道。每個(gè)設(shè)備文件都都有其文件屬性(c/b),表示是字符設(shè)備還是塊設(shè)備?另外前碧世每個(gè)文件都有兩個(gè)設(shè)備號(hào),之一個(gè)是主設(shè)備號(hào),標(biāo)識(shí)驅(qū)動(dòng)程序,第二個(gè)是從設(shè)備號(hào),標(biāo)識(shí)使用同一個(gè)設(shè)備驅(qū)動(dòng)程序的不同的硬件設(shè)備,比如有兩個(gè)軟盤(pán),就可以用從設(shè)備號(hào)來(lái)區(qū)分他們。設(shè)備文件的的主設(shè)備號(hào)必須與設(shè)備驅(qū)動(dòng)程序在登記時(shí)申請(qǐng)的主設(shè)備號(hào)一致,否則用戶(hù)進(jìn)程將無(wú)法訪問(wèn)到驅(qū)動(dòng)程序。
最后必須提到的是,在用戶(hù)進(jìn)程調(diào)用驅(qū)動(dòng)程序時(shí),系統(tǒng)進(jìn)入核心態(tài),這時(shí)不再是搶先式調(diào)度。也就是說(shuō),系統(tǒng)必須在你的驅(qū)動(dòng)程序的子函數(shù)返回后才能進(jìn)行其他的工作。如果你的驅(qū)動(dòng)程序陷入死循環(huán),不幸的是你只有重新啟動(dòng)機(jī)器了,然后就是漫長(zhǎng)的fsck。
讀/寫(xiě)時(shí),它首先察看緩沖區(qū)的內(nèi)容,如果緩沖區(qū)的數(shù)據(jù)未被處理,則先處理其中的內(nèi)容。
如何編寫(xiě)Linux操作系統(tǒng)下的設(shè)備驅(qū)動(dòng)程序
二、實(shí)例剖析
我們來(lái)寫(xiě)一個(gè)最簡(jiǎn)單的字符設(shè)備驅(qū)動(dòng)程序。雖然它什么也不做,但是通過(guò)它可以了解Linux的設(shè)備驅(qū)動(dòng)程序的工作原理。把下面的C代碼輸入機(jī)器,你就會(huì)獲得一個(gè)真正的設(shè)備驅(qū)動(dòng)程序。
#define __NO_VERSION__
#include
#include
char kernel_version = UTS_RELEASE;
這一段定義了一些版本信息,雖然用處不是很大,但也必不可少。Johnsonm說(shuō)所有的驅(qū)動(dòng)程序的開(kāi)頭都要包含,一般來(lái)講更好使用。
由于用戶(hù)進(jìn)程是通過(guò)設(shè)備文件同硬件打交道,對(duì)設(shè)備文件的操作方式不外乎就是一些系統(tǒng)調(diào)用,如 open,read,write,close…, 注意,不是fopen, fread,但是如何把系統(tǒng)調(diào)用和驅(qū)動(dòng)程序關(guān)聯(lián)起來(lái)呢?這需要了解一個(gè)非常關(guān)鍵的數(shù)據(jù)結(jié)構(gòu):
struct file_operations
{
int (*seek) (struct inode * ,struct file *, off_t ,int);
int (*read) (struct inode * ,struct file *, char ,int);
int (*write) (struct inode * ,struct file *, off_t ,int);
int (*readdir) (struct inode * ,struct file *, struct dirent * ,int);
int (*select) (struct inode * ,struct file *, int ,select_table *);
int (*ioctl) (struct inode * ,struct file *, unsined int ,unsigned long);
int (*mmap) (struct inode * ,struct file *, struct vm_area_struct *);
int (*open) (struct inode * ,struct file *);
int (*release) (struct inode * ,struct file *);
int (*fsync) (struct inode * ,struct file *);
int (*fasync) (struct inode * ,struct file *,int);
int (*check_media_change) (struct inode * ,struct file *);
int (*revalidate) (dev_t dev);
}
這個(gè)結(jié)構(gòu)的每一個(gè)成員的名字都對(duì)應(yīng)著一個(gè)系統(tǒng)調(diào)用。用戶(hù)進(jìn)程利用系統(tǒng)調(diào)用在對(duì)設(shè)備文件進(jìn)行諸如read/write操作時(shí),系統(tǒng)調(diào)用通過(guò)設(shè)備文件的主設(shè)備號(hào)找到相應(yīng)的設(shè)備驅(qū)動(dòng)程序,然后讀取這個(gè)數(shù)據(jù)結(jié)構(gòu)相應(yīng)的函數(shù)指針,接著把控制權(quán)交給該函數(shù)。這是linux的設(shè)備驅(qū)動(dòng)程序工作的基本原理。既然是這樣,則編寫(xiě)設(shè)備驅(qū)動(dòng)程序的主要工作就是編寫(xiě)子函數(shù),并填充file_operations的各個(gè)域。
下面就開(kāi)始寫(xiě)子程序。
#include
#include
#include
#include
#include
#include
unsigned int test_major = 0;
static int read_test(struct inode *node,struct file *file,char *buf,int count)
{
int left;
if (verify_area(VERIFY_WRITE,buf,count) == -EFAULT )
return -EFAULT;
for(left = count ; left > 0 ; left–)
{
__put_user(1,buf,1);
buf++;
}
return count;
}
這個(gè)函數(shù)是為read調(diào)用準(zhǔn)備的。當(dāng)調(diào)用read時(shí),read_test()被調(diào)用,它把用戶(hù)的緩沖區(qū)全部寫(xiě)1。buf 是read調(diào)用的一個(gè)參數(shù)。它是用戶(hù)進(jìn)程空間的一個(gè)地址。但是在read_test被調(diào)用時(shí),系統(tǒng)進(jìn)入核心態(tài)。所以不能使用buf這個(gè)地址,必須用__put_user(),這是kernel提供的一個(gè)函數(shù),用于向用戶(hù)傳送數(shù)據(jù)。另外還有很多類(lèi)似功能的函數(shù)。請(qǐng)參考Robert著的《Linux內(nèi)核設(shè)計(jì)與實(shí)現(xiàn)》(第二版)。然而,在向用戶(hù)空間拷貝數(shù)據(jù)之前,必須驗(yàn)證buf是否可用。這就用到函數(shù)verify_area。
static int write_(struct inode *inode,struct file *file,const char *buf,int count)
{
return count;
}
static int open_(struct inode *inode,struct file *file )
{
MOD_INC_USE_COUNT;
return 0;
}
static void release_(struct inode *inode,struct file *file )
{
MOD_DEC_USE_COUNT;
}
這幾個(gè)函數(shù)都是空操作。實(shí)際調(diào)用發(fā)生時(shí)什么也不做,他們僅僅為下面的結(jié)構(gòu)提供函數(shù)指針。
struct file_operations test_fops = {
NULL,
read_test,
write_test,
NULL, /* test_readdir */
NULL,
NULL, /* test_ioctl */
NULL, /* test_mmap */
open_test,
release_test,
NULL, /* test_fsync */
NULL, /* test_fasync */
/* nothing more, fill with NULLs */
};
這樣,設(shè)備驅(qū)動(dòng)程序的主體可以說(shuō)是寫(xiě)好了?,F(xiàn)在要把驅(qū)動(dòng)程序嵌入內(nèi)核。驅(qū)動(dòng)程序可以按照兩種方式編譯。一種是編譯進(jìn)kernel,另一種是編譯成模塊(modules),如果編譯進(jìn)內(nèi)核的話(huà),會(huì)增加內(nèi)核的大小,還要改動(dòng)內(nèi)核的源文件,而且不能動(dòng)態(tài)的卸載,不利于調(diào)試,所以推薦使用模塊方式。
int init_module(void)
{
int result;
result = register_chrdev(0, “test”, &test_fops);
if (result
#include
#include
#include
main()
{
int testdev;
int i;
char buf;
testdev = open(“/dev/test”,O_RDWR);
if ( testdev == -1 )
{
printf(“Cann’t open file \n”);
exit(0);
}
read(testdev,buf,10);
for (i = 0; i
printf(“%d\n”,buf);
close(testdev);
}
編譯運(yùn)行,看看是不是打印出全1 ?
以上只是一個(gè)簡(jiǎn)單的演示。真正實(shí)用的驅(qū)動(dòng)程序要復(fù)雜的多,要處理如中斷,DMA,I/O port等問(wèn)題。這些才是真正的難點(diǎn)。請(qǐng)看下節(jié),實(shí)際情況的處理。
如何編寫(xiě)Linux操作系統(tǒng)下的設(shè)備驅(qū)動(dòng)程序
三、設(shè)備驅(qū)動(dòng)程序中的一些具體問(wèn)題
1。 I/O Port。
和硬件打交道離不開(kāi)I/O Port,老的ISA設(shè)備經(jīng)常是占用實(shí)際的I/O端口,在linux下,操作系統(tǒng)沒(méi)有對(duì)I/O口屏蔽,也就是說(shuō),任何驅(qū)動(dòng)程序都可對(duì)任意的I/O口操作,這樣就很容易引起混亂。每個(gè)驅(qū)動(dòng)程序應(yīng)該自己避免誤用端口。
有兩個(gè)重要的kernel函數(shù)可以保證驅(qū)動(dòng)程序做到這一點(diǎn)。
1)check_region(int io_port, int off_set)
這個(gè)函數(shù)察看系統(tǒng)的I/O表,看是否有別的驅(qū)動(dòng)程序占用某一段I/O口。
參數(shù)1:I/O端口的基地址,
參數(shù)2:I/O端口占用的范圍。
返回值:0 沒(méi)有占用, 非0,已經(jīng)被占用。
2)request_region(int io_port, int off_set,char *devname)
如果這段I/O端口沒(méi)有被占用,在我們的驅(qū)動(dòng)程序中就可以使用它。在使用之前,必須向系統(tǒng)登記,以防止被其他程序占用。登記后,在/proc/ioports文件中可以看到你登記的I/O口。
參數(shù)1:io端口的基地址。
參數(shù)2:io端口占用的范圍。
參數(shù)3:使用這段io地址的設(shè)備名。
在對(duì)I/O口登記后,就可以放心地用inb(), outb()之類(lèi)的函來(lái)訪問(wèn)了。
在一些pci設(shè)備中,I/O端口被映射到一段內(nèi)存中去,要訪問(wèn)這些端口就相當(dāng)于訪問(wèn)一段內(nèi)存。經(jīng)常性的,我們要獲得一塊內(nèi)存的物理地址。
2。內(nèi)存操作
在設(shè)備驅(qū)動(dòng)程序中動(dòng)態(tài)開(kāi)辟內(nèi)存,不是用malloc,而是kmalloc,或者用get_free_pages直接申請(qǐng)頁(yè)。釋放內(nèi)存用的是kfree,或free_pages。 請(qǐng)注意,kmalloc等函數(shù)返回的是物理地址!
注意,kmalloc更大只能開(kāi)辟128k-16,16個(gè)字節(jié)是被頁(yè)描述符結(jié)構(gòu)占用了。
內(nèi)存映射的I/O口,寄存器或者是硬件設(shè)備的RAM(如顯存)一般占用F以上的地址空間。在驅(qū)動(dòng)程序中不能直接訪問(wèn),要通過(guò)kernel函數(shù)vremap獲得重新映射以后的地址。
另外,很多硬件需要一塊比較大的連續(xù)內(nèi)存用作DMA傳送。這塊程序需要一直駐留在內(nèi)存,不能被交換到文件中去。但是kmalloc最多只能開(kāi)辟128k的內(nèi)存。
這可以通過(guò)犧牲一些系統(tǒng)內(nèi)存的方法來(lái)解決。
3。中斷處理
同處理I/O端口一樣,要使用一個(gè)中斷,必須先向系統(tǒng)登記。
int request_irq(unsigned int irq ,void(*handle)(int,void *,struct pt_regs *),
unsigned int long flags, const char *device);
irq: 是要申請(qǐng)的中斷。
handle:中斷處理函數(shù)指針。
flags:SA_INTERRUPT 請(qǐng)求一個(gè)快速中斷,0 正常中斷。
device:設(shè)備名。
如果登記成功,返回0,這時(shí)在/proc/interrupts文件中可以看你請(qǐng)求的中斷。
4。一些常見(jiàn)的問(wèn)題。
對(duì)硬件操作,有時(shí)時(shí)序很重要(關(guān)于時(shí)序的具體問(wèn)題就要參考具體的設(shè)備芯片手冊(cè)啦!比如網(wǎng)卡芯片RTL8139)。但是如果用C語(yǔ)言寫(xiě)一些低級(jí)的硬件操作的話(huà),gcc往往會(huì)對(duì)你的程序進(jìn)行優(yōu)化,這樣時(shí)序會(huì)發(fā)生錯(cuò)誤。如果用匯編寫(xiě)呢,gcc同樣會(huì)對(duì)匯編代碼進(jìn)行優(yōu)化,除非用volatile關(guān)鍵字修飾。最保險(xiǎn)的辦法是禁止優(yōu)化。這當(dāng)然只能對(duì)一部分你自己編寫(xiě)的代碼。如果對(duì)所有的代碼都不優(yōu)化,你會(huì)發(fā)現(xiàn)驅(qū)動(dòng)程序根本無(wú)法裝載。這是因?yàn)樵诰幾g驅(qū)動(dòng)程序時(shí)要用到gcc的一些擴(kuò)展特性,而這些擴(kuò)展特性必須在加了優(yōu)化選項(xiàng)之后才能體現(xiàn)出來(lái)。
關(guān)于搭建本地linux環(huán)境的介紹到此就結(jié)束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關(guān)注本站。
香港服務(wù)器選創(chuàng)新互聯(lián),香港虛擬主機(jī)被稱(chēng)為香港虛擬空間/香港網(wǎng)站空間,或者簡(jiǎn)稱(chēng)香港主機(jī)/香港空間。香港虛擬主機(jī)特點(diǎn)是免備案空間開(kāi)通就用, 創(chuàng)新互聯(lián)香港主機(jī)精選cn2+bgp線路訪問(wèn)快、穩(wěn)定!
當(dāng)前標(biāo)題:如何快速搭建本地Linux開(kāi)發(fā)環(huán)境?(搭建本地linux環(huán)境)
文章來(lái)源:http://m.fisionsoft.com.cn/article/dhecech.html


咨詢(xún)
建站咨詢(xún)
