新聞中心
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


咨詢
建站咨詢
