日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
探索Linux中的GEM和KMS技術(shù)(linuxgemkms)

Linux操作系統(tǒng)一直以來(lái)因?yàn)槠浒踩?、穩(wěn)定性和開(kāi)放性而備受推崇,特別是在嵌入式領(lǐng)域中占據(jù)著重要地位。Linux提供了許多高級(jí)技術(shù)和框架,其中最重要的是GEM和KMS技術(shù)。這兩項(xiàng)技術(shù)旨在提高Linux圖形子系統(tǒng)的性能和能力,本文將從以下幾個(gè)方面進(jìn)行探索:GEM和KMS的簡(jiǎn)介、它們?cè)贚inux圖形系統(tǒng)中的使用、優(yōu)點(diǎn)和缺點(diǎn)以及GEM和KMS的使用案例。

在鄧州等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場(chǎng)前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供網(wǎng)站建設(shè)、做網(wǎng)站 網(wǎng)站設(shè)計(jì)制作按需定制設(shè)計(jì),公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),品牌網(wǎng)站建設(shè),成都全網(wǎng)營(yíng)銷推廣,成都外貿(mào)網(wǎng)站建設(shè)公司,鄧州網(wǎng)站建設(shè)費(fèi)用合理。

一、GEM和KMS的簡(jiǎn)介

1. GEM(Graphics Execution Manager)

GEM是一個(gè)存在于內(nèi)核中的圖形內(nèi)存管理器,在Linux內(nèi)核版本2.6.28中被引入,并用于管理圖形內(nèi)存的分配和釋放。GEM具有以下特點(diǎn):

(1)支持全局圖形存儲(chǔ)器。

(2)使用類似鎖的技術(shù)來(lái)防止內(nèi)存泄漏。

(3)提供更大化性能支持的同時(shí)最小化保留內(nèi)存的機(jī)制。

(4)可以增加內(nèi)存分配的可重復(fù)性。

2. KMS(Kernel Mode Setting)

KMS是另一個(gè)內(nèi)核級(jí)別的技術(shù),它主要用于處理顯示器和圖形卡之間的交互。KMS包括以下幾個(gè)方面的內(nèi)容:

(1)一組API來(lái)訪問(wèn)和設(shè)置顯示器和顯卡。

(2)硬件獨(dú)立性,可以支持多種不同的圖形硬件,而不需要對(duì)其他子系統(tǒng)進(jìn)行更改。

(3)使用DRM(Direct Rendering Manager)用戶空間驅(qū)動(dòng)代碼之后,KMS可以為用戶提供極高的3D性能。

二、GEM和KMS在Linux中的使用

在現(xiàn)代Linux系統(tǒng)中,GEM和KMS一般都會(huì)使用Mesa和DRM子系統(tǒng)進(jìn)行支持,它們分別裝載在用戶空間和內(nèi)核空間。這兩個(gè)組件共同支持Linux系統(tǒng)中的圖形功能,并使得其能夠支持多種不同的硬件平臺(tái)。下面簡(jiǎn)單介紹一下這兩個(gè)組件的詳情:

1. Mesa

Mesa是一個(gè)用于實(shí)現(xiàn)OpenGL和其他圖形API的開(kāi)源軟件庫(kù)。它在Linux系統(tǒng)中廣泛使用,可以在許多不同的圖形GPU架構(gòu)中實(shí)現(xiàn)硬件加速,包括AMD、Intel和Nvidia。Mesa中的DRM組件提供了一些與DRM核心的接口,從而為用戶空間中的OpenGL和其他圖形API提供了處理操作的途徑。Mesa一般被視為L(zhǎng)inux系統(tǒng)圖形子系統(tǒng)的用戶空間組件。

2. DRM(Direct Rendering Manager)

DRM是一個(gè)內(nèi)核模塊,在內(nèi)核中起到許多不同的作用。它提供多種API和接口,使得用戶空間的OpenGL和其他圖形API能夠解決底層圖形硬件的問(wèn)題。DRM的主要功能包括:

(1)使用內(nèi)核模式設(shè)置(KMS)技術(shù),將顯示器和GPU之間的連接操作轉(zhuǎn)移到內(nèi)核中。

(2)提供對(duì)圖形內(nèi)存的訪問(wèn)和管理,包括GEM。

(3)實(shí)現(xiàn)OpenGL和其他API的硬件加速。

三、GEM和KMS的優(yōu)缺點(diǎn)

1. GEM的優(yōu)點(diǎn)

(1)提高內(nèi)存分配的可重復(fù)性。

(2)更大化性能支持的同時(shí)最小化保留內(nèi)存的機(jī)制。

(3)提供適當(dāng)?shù)膬?nèi)存鎖來(lái)防止內(nèi)存泄漏。

2. GEM的缺點(diǎn)

(1)難以維護(hù),因?yàn)樗潜容^新的技術(shù)。

(2)被認(rèn)為是Linux系統(tǒng)的核心部分,所以使用該技術(shù)可能會(huì)增加系統(tǒng)穩(wěn)定性方面的問(wèn)題。

(3)沒(méi)有過(guò)多的教程和指南可以使用。

3. KMS的優(yōu)點(diǎn)

(1)支持純硬件渲染。

(2)支持多個(gè)顯示器。

(3)提供DRM后端硬件加速。

4. KMS的缺點(diǎn)

(1)如果使用不當(dāng),可能會(huì)導(dǎo)致延遲等問(wèn)題。

(2)需要高質(zhì)量的軟件支持,以確保良好的穩(wěn)定性。

(3)需要開(kāi)發(fā)人員具有深入的驅(qū)動(dòng)程序知識(shí)。

四、GEM和KMS的使用案例

1. Gallium驅(qū)動(dòng)程序

Gallium是一個(gè)基于Mesa的驅(qū)動(dòng)程序開(kāi)發(fā)框架,它允許開(kāi)發(fā)者使用Mesa和DRM來(lái)實(shí)現(xiàn)開(kāi)源驅(qū)動(dòng)程序。Gallium一般用于高性能的3D渲染,但它也可以用于2D渲染工作。Gallium的主要特點(diǎn)是支持不同的視頻輸出和GEM內(nèi)存管理技術(shù)。

2. Weston窗口管理器

Weston是一個(gè)采用Wayland協(xié)議的窗口管理器,它適用于嵌入式系統(tǒng)和桌面環(huán)境之間的無(wú)縫集成。Weston利用KMS技術(shù)來(lái)設(shè)置顯示器和GPU之間的連接,并使用Mesa的DRM組件進(jìn)行用戶空間的相關(guān)操作。通過(guò)Weston管理器,開(kāi)發(fā)者可以快速實(shí)現(xiàn)窗口管理器,并使用Mesa和DRM組件來(lái)處理底層GPU操作。

本文通過(guò)介紹GEM和KMS技術(shù)的基本概念、其在Linux系統(tǒng)中的應(yīng)用、優(yōu)缺點(diǎn)以及使用案例,展示了這兩個(gè)技術(shù)的重要性和廣泛應(yīng)用。盡管這兩個(gè)技術(shù)都有其優(yōu)缺點(diǎn),但它們?cè)贚inux圖形子系統(tǒng)中的重要性不用置疑。對(duì)于想要在Linux系統(tǒng)上完成高性能圖形工作的開(kāi)發(fā)者來(lái)說(shuō),必須掌握這兩項(xiàng)技術(shù)的基本知識(shí)。

成都網(wǎng)站建設(shè)公司-創(chuàng)新互聯(lián),建站經(jīng)驗(yàn)豐富以策略為先導(dǎo)10多年以來(lái)專注數(shù)字化網(wǎng)站建設(shè),提供企業(yè)網(wǎng)站建設(shè),高端網(wǎng)站設(shè)計(jì),響應(yīng)式網(wǎng)站制作,設(shè)計(jì)師量身打造品牌風(fēng)格,熱線:028-86922220

如何調(diào)試linux的網(wǎng)絡(luò)驅(qū)動(dòng)

如何根據(jù)oops定位代碼行

我們借用linux設(shè)備驅(qū)動(dòng)第二篇:構(gòu)攔枯造和運(yùn)行模塊里面的hello world程序來(lái)演示出錯(cuò)的情況,含有錯(cuò)誤代碼的hello world如下:

#include

#include

MODULE_LICENSE(“Dual BSD/GPL”);

static int hello_init(void)

{

char *p = NULL;

memcpy(p, “test”, 4);

printk(KERN_ALERT “Hello, world\n”);

return 0;

}

static void hello_exit(void)

{

printk(KERN_ALERT “Goodbye, cruel world\n”);

}

module_init(hello_init);

module_exit(hello_exit);

  Makefile文件如下:

ifneq ($(KERNELRELEASE),)

obj-m := helloworld.o

else

KERNELDIR ?= /lib/modules/$(shell uname -r)/build

PWD := $(shell pwd)

default:

$(MAKE) -C $(KERNELDIR) M=$(PWD) modules

endif

clean:

rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions modules.order Module.symvers

  高衡差很明顯,以上代碼的第8行是一個(gè)空戚皮指針錯(cuò)誤。inod后會(huì)出現(xiàn)下面的oops信息:

BUG: unable to handle kernel NULL pointer dereference at(null)

PGD 0

Oops: 0002 P

Modules linked in: helloworld(OE+) vmw_vsock_vmci_transport vsock coretemp crct10dif_pclmul crc32_pclmul ghash_clmulni_intel aesni_intel vmw_balloon snd_ens1371 aes_x86_64 lrw snd_ac97_codec gf128mul glue_helper ablk_helper cryptd ac97_bus gameport snd_pcm serio_raw snd_seq_midi snd_seq_midi_event snd_rawmidi snd_seq snd_seq_device snd_timer vmwgfx btu ttm snd drm_kms_helper drm soundcore shpchp vmw_vmci i2c_piix4 rfcomm bnep bluetooth 6lowpan_iphc parport_pc ppdev mac_hid lp parport hid_generic uhid hid pouse ahci libahci floppy e1000 vmw_pvscsi vmxnet3 mptspi mptscsih mptbase scsi_transport_spi pata_acpi

CPU: 0 PID: 4531 Comm: inod Tainted: GOE 3.16.0-33-generic #44~14.04.1-Ubuntu

Hardware name: VMware, Inc. VMware Virtual Platform/440BX Desktop Reference Platform, BIOS 6.00 05/20/2023

task: fffff010 ti: ffff880038fa0000 task.ti: ffff880038fa0000

RIP: 0010: hello_init+0xd/0x30

RSP: 0018:ffff880038fa3d40 EFLAGS:

RAX: ffff88000c31d901 RBX: ffffffff81c1a020 RCX:b29f

RDX:b29e RSI:017 RDI: ffffffffc

RBP: ffff880038fa3db8 R08:e80 R09: ffff88003d615e80

R10: ffffea000030c740 R11: ffffffffR12: ffff88000c31d0c0

R13:000 R14: ffffffffcR15: ffffffffc

FS:f8a6fa86740(0000) GS:ffff88003d600000(0000) knlGS:00

CS:DS: 0000 ES: 0000 CR0:033

CR2:000 CR3:000 CR4:7f0

DR0:000 DR1:000 DR2:000

DR3:000 DR6:fffe0ff0 DR7:400

Stack:

ffff880038fa3db8 ffffffff

0001 ffff880028abffff880038fa3da0

ffffffff8119d0b2 ffffffffc00bd1141ac ffffffffc

Call Trace:

? do_one_initcall+0xd4/0x210

? __vunmap+0xb2/0x100

load_module+0x13c1/0x1b80

? store_uevent+0x40/0x40

SyS_finit_module+0x86/0xb0

system_call_fastpath+0x1a/0x1f

Code:ce5 e8 ac1 31

RIP hello_init+0xd/0x30

RSP

CR2:000

——

  

下面簡(jiǎn)單分析下oops信息的內(nèi)容。

由BUG: unable to handle kernel NULL pointer dereference at(null)知道出錯(cuò)的原因是使用了空指針。標(biāo)紅的部分確定了具體出錯(cuò)的函數(shù)。Modules linked in: helloworld表明了引起oops問(wèn)題的具體模塊。call trace列出了函數(shù)的調(diào)用信息。這些信息中其中標(biāo)紅的部分是最有用的,我們可以根據(jù)其信息找到具體出錯(cuò)的代碼行。下面就來(lái)說(shuō)下,如何定位到具體出錯(cuò)的代碼行。

之一步我們需要使用objdump把編譯生成的bin文件反匯編,我們這里就是helloworld.o,如下命令把反匯編信息保存到err.txt文件中:

objdump helloworld.o -D > err.txt

  err.txt內(nèi)容如下:

helloworld.o: file format elf64-x86-64

Disassembly of section .text:

00 :

0: ecallq 5

5:push %rbp

6: 48 c7 c mov $0x0,%rdi

d: cmovl $0x,0x0

14:

18: 31 c xor %eax,%eax

1a:e mov %rsp,%rbp

1d: ecallq 22

22: 31 c xor %eax,%eax

24: 5dpop %rbp

25: cretq

26:e 0f 1fnopw %cs:0x0(%rax,%rax,1)

2d:

30 :

30: ecallq 35

35:push %rbp

36: 48 c7 c mov $0x0,%rdi

3d: 31 c xor %eax,%eax

3f:e mov %rsp,%rbp

42: ecallq 47

47: 5dpop %rbp

48: cretq

Disassembly of section .rodata.str1.1:

00 :

0:add %esi,(%rcx)

2:rex.W

3:gs

4: 6cin (%dx),%es:(%rdi)

5: 6cin (%dx),%es:(%rdi)

6: 6foutsl %ds:(%rsi),(%dx)

7: 2csub $0x20,%al

9:f ja 7a

b:c jb

d:a or %fs:(%rax),%al

10:add %esi,(%rcx)

12:f rex.RXB outsl %ds:(%rsi),(%dx)

14: 6foutsl %ds:(%rsi),(%dx)

15:fs

16:(bad)

17:jns 7e

19: 2csub $0x20,%al

1b:movslq 0x75(%rdx),%esi

1e:gs

1f: 6cin (%dx),%es:(%rdi)

20:f and %dh,0x6f(%rdi)

23:c jb

25:a or %fs:(%rax),%al

Disassembly of section .modinfo:

00 :

0: 6cin (%dx),%es:(%rdi)

1:ed imul $0x3d65736e,0x65(%rbx),%esp

8:rex.R jne 6c

b: 6cin (%dx),%es:(%rdi)

c:and %al,0x53(%rdx)

f:f rex.R (bad)

11:rex.RXB push %r8

13: 4crex.WR

Disassembly of section .comment:

00 :

0:add %al,0x43(%rdi)

3:a rex.XB cmp (%r8),%spl

6:sub %dl,0x62(%rbp)

9:e jne

b:je

d:e and %dh,(%rsi,%rbp,1)

10:e cmp %ch,(%rsi)

12:d xor 0x(%rip),%ch#

18:e jne

1a:je

1c:xor %ebp,(%rcx)

1e:e and %dh,(%rsi,%rbp,1)

21:e cmp %ch,(%rsi)

23:xor (%rax),%al

Disassembly of section __mcount_loc:

00 :

  由oops信息我們知道出錯(cuò)的地方是hello_init的地址偏移0xd。而有dump信息知道,hello_init的地址即init_module的地址,因?yàn)閔ello_init即本模塊的初始化入口,如果在其他函數(shù)中出錯(cuò),dump信息中就會(huì)有相應(yīng)符號(hào)的地址。由此我們得到出錯(cuò)的地址是0xd,下一步我們就可以使用addr2line來(lái)定位具體的代碼行:

addr2line -C -f -e helloworld.o d

此命令就可以得到行號(hào)了。以上就是通過(guò)oops信息來(lái)定位驅(qū)動(dòng)崩潰的行號(hào)。

其他調(diào)試手段

以上就是通過(guò)oops信息來(lái)獲取具體的導(dǎo)致崩潰的代碼行,這種情況都是用在遇到比較嚴(yán)重的錯(cuò)誤導(dǎo)致內(nèi)核掛掉的情況下使用的,另外比較常用的調(diào)試手段就是使用printk來(lái)輸出打印信息。printk的使用方法類似printf,只是要注意一下打印級(jí)別,詳細(xì)介紹在linux設(shè)備驅(qū)動(dòng)第二篇:構(gòu)造和運(yùn)行模塊中已有描述,另外需要注意的是大量使用printk會(huì)嚴(yán)重拖慢系統(tǒng),所以使用過(guò)程中也要注意。

linux 的環(huán)境搭建(二)–redis單機(jī)環(huán)境、生產(chǎn)環(huán)境、集群環(huán)境的搭建

一、目錄

1、工具

2、安裝tcl

3、安裝單機(jī)版redis

4、把redis設(shè)置為daemon進(jìn)程,每次系統(tǒng)啟動(dòng),redis進(jìn)程一起啟動(dòng)

5、安裝redis cluster

二、工具

2.1、tcl8.6.1-src.tar.gz

2.2、ruby-2.3.1.tar.gz

2.3、redis-4.1.1.gem

2.4、redis-3.2.8.tar.gz

2.5、openssl-1.0.2r.tar.gz

三、安裝tcl(安裝redis必須先要安裝tcl)

3.1、把tcl8.6.1-src.tar.gz通過(guò)WinSCP上傳到虛擬機(jī)中的/usr/local目錄下

四、安裝單機(jī)版redis

4.1、把redis-3.2.8.tar.gz通過(guò)WinSCP上傳到虛擬機(jī)中的/usr/local目錄培乎下

4.2、依次運(yùn)行如下命令:

tar -zxvf redis-3.2.8.tar.gz 解壓文件

cd redis-3.2.8

make && make test && make install

五、把redis設(shè)置為daemon進(jìn)程,每次系統(tǒng)啟動(dòng),redis進(jìn)程一起啟動(dòng)

5.1、將redis的utils目錄下的redis_init_script腳本拷貝到linux的/etc/init.d目錄中,將redis_init_script重命名為redis_6379,6379是我們希望這個(gè)redis實(shí)例監(jiān)聽(tīng)的端口號(hào)

5.2、修改redis_6379腳本的第6行的REDISPORT,設(shè)置為相同的端口號(hào)(默認(rèn)就是6379)

protected-mode no 取消保護(hù)模式,保護(hù)模式只能127.0.0.1訪問(wèn)

daemonize yes 讓redis以daemon進(jìn)程運(yùn)行

pidfile /var/run/redis_6379.pid 設(shè)置redis的pid文件位置

bind2.168.3.110

port 設(shè)置redis的監(jiān)聽(tīng)端口號(hào)老中耐

dir/var/redis/設(shè)置持久化文件的存儲(chǔ)位置

logfile/var/log/redis/6379.log設(shè)置日志文件位置

5.6、啟動(dòng)redis,依次執(zhí)行:

cd /etc/init.d,

chmod 777 redis_6379,賦讀寫執(zhí)行的權(quán)限(chmod -R 777 * 是遞歸把該目錄下的所有文件和其子文件全部賦權(quán)限)

./redis_6379 start 啟動(dòng)

5.7、確認(rèn)redis進(jìn)程是否啟動(dòng),ps -ef | grep redis

5.8、讓redis跟隨系統(tǒng)啟動(dòng)自動(dòng)啟動(dòng)

5.9、重啟系統(tǒng),不手動(dòng)啟動(dòng)redis,直接連接redis,可以連接上,表示配置成功

此時(shí)一個(gè)單機(jī)版的redis的生產(chǎn)環(huán)境已經(jīng)搭建好了,每次服務(wù)器重啟,redis都會(huì)自動(dòng)的啟動(dòng)

六、安裝redis cluster

(redis cluster集群,要求至少3個(gè)master,去組成一個(gè)高可用,健壯的分布式的集群,每個(gè)master都建議侍春至少給一個(gè)slave,3個(gè)master,3個(gè)slave)

6.1、前提,我在其它機(jī)器上啟動(dòng)了六個(gè)redis(安裝步驟都如下)

2.2、創(chuàng)建三個(gè)目錄:

mkdir -p /etc/redis-cluster 存放集群配置信息,自動(dòng)生成配置

mkdir -p /var/log/redis redis日志

mkdir -p /var/redis/7001 存放redis的rdb文件和aof文件

6.3、將redis的utils目錄下的redis_init_script腳本拷貝到linux的/etc/init.d目錄中,將redis_init_script重命名為redis_7001,7001是我們希望這個(gè)redis實(shí)例監(jiān)聽(tīng)的端口號(hào),并修改redis_7001配置文件中的REDISPORT=7001

6.4、修改/etc/redis/7001.conf中的部分配置為生產(chǎn)環(huán)境

6.5、完成了一個(gè)redis環(huán)境的配置,依次再配置其余五個(gè),分別為7002、7003、7004、7005、7006,每個(gè)啟動(dòng)腳本內(nèi),都修改對(duì)應(yīng)的端口號(hào)

6.6、啟動(dòng)6個(gè)redis實(shí)例

6.7、創(chuàng)建集群(需要安裝ruby、rubygems)

上述命令在部分機(jī)器上是可以直接運(yùn)行完成,成功安裝的,但在部分機(jī)器上運(yùn)行第三條命令時(shí)會(huì)提示ruby版本太低、openssl找不到的問(wèn)題,下面依次解決這兩個(gè)問(wèn)題:

6.8、再次運(yùn)行g(shù)em install redis命令,報(bào)出兩個(gè)錯(cuò)誤

6.9、再次運(yùn)行g(shù)em install redis命令,報(bào)出一個(gè)錯(cuò)誤

6.10、再次運(yùn)行g(shù)em install redis命令,報(bào)出一個(gè)錯(cuò)誤

6.11、再次運(yùn)行g(shù)em install redis命令

# gem install redis

Successfully installed redis-4.1.1

Parsing documentation for redis-4.1.1

Done installing documentation for redis after 1 seconds

WARNING: Unable to pull data from ‘

‘ : SSL_connect returned=1 errno=0 state=error: certificate verify failed (

)

1 gem installed

運(yùn)行成功

此時(shí)Redis安裝好,此三個(gè)工具也安裝好了,這時(shí)我們來(lái)做一個(gè)Redis集群測(cè)試,在一臺(tái)服務(wù)器中創(chuàng)建了6個(gè)Redis實(shí)例,開(kāi)啟6個(gè)Redis服務(wù)

redis-trib.rb create –replicas 1 192.168.3.104:.168.3.104:.168.3.105:.168.3.105:.168.3.106:.168.3.106:7006

# redis-trib.rb create –replicas 1 192.168.3.104:.168.3.104:.168.3.105:.168.3.105:.168.3.106:.168.3.106:7006

此時(shí)一個(gè)redis集群環(huán)境就已經(jīng)搭建好了,可以通過(guò)redis-trib.rb check 192.168.3.105:7003命令查看集群幾點(diǎn)的信息

# redis-trib.rb check 192.168.3.105:7004

redis cluster的優(yōu)點(diǎn):讀寫分離+高可用+多master

讀寫分離:每個(gè)master都有一個(gè)slave

高可用:master宕機(jī),slave自動(dòng)被切換過(guò)去

linux gem kms的介紹就聊到這里吧,感謝你花時(shí)間閱讀本站內(nèi)容,更多關(guān)于linux gem kms,探索Linux中的GEM和KMS技術(shù),如何調(diào)試linux的網(wǎng)絡(luò)驅(qū)動(dòng),linux 的環(huán)境搭建(二)–redis單機(jī)環(huán)境、生產(chǎn)環(huán)境、集群環(huán)境的搭建的信息別忘了在本站進(jìn)行查找喔。

成都創(chuàng)新互聯(lián)科技有限公司,經(jīng)過(guò)多年的不懈努力,公司現(xiàn)已經(jīng)成為一家專業(yè)從事IT產(chǎn)品開(kāi)發(fā)和營(yíng)銷公司。廣泛應(yīng)用于計(jì)算機(jī)網(wǎng)絡(luò)、設(shè)計(jì)、SEO優(yōu)化、關(guān)鍵詞排名等多種行業(yè)!


文章題目:探索Linux中的GEM和KMS技術(shù)(linuxgemkms)
轉(zhuǎn)載源于:http://www.dlmjj.cn/article/dhsdipp.html