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

在鄧州等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供網(wǎng)站建設(shè)、做網(wǎng)站 網(wǎng)站設(shè)計制作按需定制設(shè)計,公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),品牌網(wǎng)站建設(shè),成都全網(wǎng)營銷推廣,成都外貿(mào)網(wǎng)站建設(shè)公司,鄧州網(wǎng)站建設(shè)費(fèi)用合理。
一、GEM和KMS的簡介
1. GEM(Graphics Execution Manager)
GEM是一個存在于內(nèi)核中的圖形內(nèi)存管理器,在Linux內(nèi)核版本2.6.28中被引入,并用于管理圖形內(nèi)存的分配和釋放。GEM具有以下特點:
(1)支持全局圖形存儲器。
(2)使用類似鎖的技術(shù)來防止內(nèi)存泄漏。
(3)提供更大化性能支持的同時最小化保留內(nèi)存的機(jī)制。
(4)可以增加內(nèi)存分配的可重復(fù)性。
2. KMS(Kernel Mode Setting)
KMS是另一個內(nèi)核級別的技術(shù),它主要用于處理顯示器和圖形卡之間的交互。KMS包括以下幾個方面的內(nèi)容:
(1)一組API來訪問和設(shè)置顯示器和顯卡。
(2)硬件獨(dú)立性,可以支持多種不同的圖形硬件,而不需要對其他子系統(tǒng)進(jìn)行更改。
(3)使用DRM(Direct Rendering Manager)用戶空間驅(qū)動代碼之后,KMS可以為用戶提供極高的3D性能。
二、GEM和KMS在Linux中的使用
在現(xiàn)代Linux系統(tǒng)中,GEM和KMS一般都會使用Mesa和DRM子系統(tǒng)進(jìn)行支持,它們分別裝載在用戶空間和內(nèi)核空間。這兩個組件共同支持Linux系統(tǒng)中的圖形功能,并使得其能夠支持多種不同的硬件平臺。下面簡單介紹一下這兩個組件的詳情:
1. Mesa
Mesa是一個用于實現(xiàn)OpenGL和其他圖形API的開源軟件庫。它在Linux系統(tǒng)中廣泛使用,可以在許多不同的圖形GPU架構(gòu)中實現(xiàn)硬件加速,包括AMD、Intel和Nvidia。Mesa中的DRM組件提供了一些與DRM核心的接口,從而為用戶空間中的OpenGL和其他圖形API提供了處理操作的途徑。Mesa一般被視為Linux系統(tǒng)圖形子系統(tǒng)的用戶空間組件。
2. DRM(Direct Rendering Manager)
DRM是一個內(nèi)核模塊,在內(nèi)核中起到許多不同的作用。它提供多種API和接口,使得用戶空間的OpenGL和其他圖形API能夠解決底層圖形硬件的問題。DRM的主要功能包括:
(1)使用內(nèi)核模式設(shè)置(KMS)技術(shù),將顯示器和GPU之間的連接操作轉(zhuǎn)移到內(nèi)核中。
(2)提供對圖形內(nèi)存的訪問和管理,包括GEM。
(3)實現(xiàn)OpenGL和其他API的硬件加速。
三、GEM和KMS的優(yōu)缺點
1. GEM的優(yōu)點
(1)提高內(nèi)存分配的可重復(fù)性。
(2)更大化性能支持的同時最小化保留內(nèi)存的機(jī)制。
(3)提供適當(dāng)?shù)膬?nèi)存鎖來防止內(nèi)存泄漏。
2. GEM的缺點
(1)難以維護(hù),因為它是比較新的技術(shù)。
(2)被認(rèn)為是Linux系統(tǒng)的核心部分,所以使用該技術(shù)可能會增加系統(tǒng)穩(wěn)定性方面的問題。
(3)沒有過多的教程和指南可以使用。
3. KMS的優(yōu)點
(1)支持純硬件渲染。
(2)支持多個顯示器。
(3)提供DRM后端硬件加速。
4. KMS的缺點
(1)如果使用不當(dāng),可能會導(dǎo)致延遲等問題。
(2)需要高質(zhì)量的軟件支持,以確保良好的穩(wěn)定性。
(3)需要開發(fā)人員具有深入的驅(qū)動程序知識。
四、GEM和KMS的使用案例
1. Gallium驅(qū)動程序
Gallium是一個基于Mesa的驅(qū)動程序開發(fā)框架,它允許開發(fā)者使用Mesa和DRM來實現(xiàn)開源驅(qū)動程序。Gallium一般用于高性能的3D渲染,但它也可以用于2D渲染工作。Gallium的主要特點是支持不同的視頻輸出和GEM內(nèi)存管理技術(shù)。
2. Weston窗口管理器
Weston是一個采用Wayland協(xié)議的窗口管理器,它適用于嵌入式系統(tǒng)和桌面環(huán)境之間的無縫集成。Weston利用KMS技術(shù)來設(shè)置顯示器和GPU之間的連接,并使用Mesa的DRM組件進(jìn)行用戶空間的相關(guān)操作。通過Weston管理器,開發(fā)者可以快速實現(xiàn)窗口管理器,并使用Mesa和DRM組件來處理底層GPU操作。
本文通過介紹GEM和KMS技術(shù)的基本概念、其在Linux系統(tǒng)中的應(yīng)用、優(yōu)缺點以及使用案例,展示了這兩個技術(shù)的重要性和廣泛應(yīng)用。盡管這兩個技術(shù)都有其優(yōu)缺點,但它們在Linux圖形子系統(tǒng)中的重要性不用置疑。對于想要在Linux系統(tǒng)上完成高性能圖形工作的開發(fā)者來說,必須掌握這兩項技術(shù)的基本知識。
成都網(wǎng)站建設(shè)公司-創(chuàng)新互聯(lián),建站經(jīng)驗豐富以策略為先導(dǎo)10多年以來專注數(shù)字化網(wǎng)站建設(shè),提供企業(yè)網(wǎng)站建設(shè),高端網(wǎng)站設(shè)計,響應(yīng)式網(wǎng)站制作,設(shè)計師量身打造品牌風(fēng)格,熱線:028-86922220如何調(diào)試linux的網(wǎng)絡(luò)驅(qū)動
如何根據(jù)oops定位代碼行
我們借用linux設(shè)備驅(qū)動第二篇:構(gòu)攔枯造和運(yùn)行模塊里面的hello world程序來演示出錯的情況,含有錯誤代碼的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行是一個空戚皮指針錯誤。inod后會出現(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
——
下面簡單分析下oops信息的內(nèi)容。
由BUG: unable to handle kernel NULL pointer dereference at(null)知道出錯的原因是使用了空指針。標(biāo)紅的部分確定了具體出錯的函數(shù)。Modules linked in: helloworld表明了引起oops問題的具體模塊。call trace列出了函數(shù)的調(diào)用信息。這些信息中其中標(biāo)紅的部分是最有用的,我們可以根據(jù)其信息找到具體出錯的代碼行。下面就來說下,如何定位到具體出錯的代碼行。
之一步我們需要使用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信息我們知道出錯的地方是hello_init的地址偏移0xd。而有dump信息知道,hello_init的地址即init_module的地址,因為hello_init即本模塊的初始化入口,如果在其他函數(shù)中出錯,dump信息中就會有相應(yīng)符號的地址。由此我們得到出錯的地址是0xd,下一步我們就可以使用addr2line來定位具體的代碼行:
addr2line -C -f -e helloworld.o d
此命令就可以得到行號了。以上就是通過oops信息來定位驅(qū)動崩潰的行號。
其他調(diào)試手段
以上就是通過oops信息來獲取具體的導(dǎo)致崩潰的代碼行,這種情況都是用在遇到比較嚴(yán)重的錯誤導(dǎo)致內(nèi)核掛掉的情況下使用的,另外比較常用的調(diào)試手段就是使用printk來輸出打印信息。printk的使用方法類似printf,只是要注意一下打印級別,詳細(xì)介紹在linux設(shè)備驅(qū)動第二篇:構(gòu)造和運(yùn)行模塊中已有描述,另外需要注意的是大量使用printk會嚴(yán)重拖慢系統(tǒng),所以使用過程中也要注意。
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)啟動,redis進(jìn)程一起啟動
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通過WinSCP上傳到虛擬機(jī)中的/usr/local目錄下
四、安裝單機(jī)版redis
4.1、把redis-3.2.8.tar.gz通過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)啟動,redis進(jìn)程一起啟動
5.1、將redis的utils目錄下的redis_init_script腳本拷貝到linux的/etc/init.d目錄中,將redis_init_script重命名為redis_6379,6379是我們希望這個redis實例監(jiān)聽的端口號
5.2、修改redis_6379腳本的第6行的REDISPORT,設(shè)置為相同的端口號(默認(rèn)就是6379)
protected-mode no 取消保護(hù)模式,保護(hù)模式只能127.0.0.1訪問
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)聽端口號老中耐
dir/var/redis/設(shè)置持久化文件的存儲位置
logfile/var/log/redis/6379.log設(shè)置日志文件位置
5.6、啟動redis,依次執(zhí)行:
cd /etc/init.d,
chmod 777 redis_6379,賦讀寫執(zhí)行的權(quán)限(chmod -R 777 * 是遞歸把該目錄下的所有文件和其子文件全部賦權(quán)限)
./redis_6379 start 啟動
5.7、確認(rèn)redis進(jìn)程是否啟動,ps -ef | grep redis
5.8、讓redis跟隨系統(tǒng)啟動自動啟動
5.9、重啟系統(tǒng),不手動啟動redis,直接連接redis,可以連接上,表示配置成功
此時一個單機(jī)版的redis的生產(chǎn)環(huán)境已經(jīng)搭建好了,每次服務(wù)器重啟,redis都會自動的啟動
六、安裝redis cluster
(redis cluster集群,要求至少3個master,去組成一個高可用,健壯的分布式的集群,每個master都建議侍春至少給一個slave,3個master,3個slave)
6.1、前提,我在其它機(jī)器上啟動了六個redis(安裝步驟都如下)
2.2、創(chuàng)建三個目錄:
mkdir -p /etc/redis-cluster 存放集群配置信息,自動生成配置
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是我們希望這個redis實例監(jiān)聽的端口號,并修改redis_7001配置文件中的REDISPORT=7001
6.4、修改/etc/redis/7001.conf中的部分配置為生產(chǎn)環(huán)境
6.5、完成了一個redis環(huán)境的配置,依次再配置其余五個,分別為7002、7003、7004、7005、7006,每個啟動腳本內(nèi),都修改對應(yīng)的端口號
6.6、啟動6個redis實例
6.7、創(chuàng)建集群(需要安裝ruby、rubygems)
上述命令在部分機(jī)器上是可以直接運(yùn)行完成,成功安裝的,但在部分機(jī)器上運(yùn)行第三條命令時會提示ruby版本太低、openssl找不到的問題,下面依次解決這兩個問題:
6.8、再次運(yùn)行g(shù)em install redis命令,報出兩個錯誤
6.9、再次運(yùn)行g(shù)em install redis命令,報出一個錯誤
6.10、再次運(yùn)行g(shù)em install redis命令,報出一個錯誤
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)行成功
此時Redis安裝好,此三個工具也安裝好了,這時我們來做一個Redis集群測試,在一臺服務(wù)器中創(chuàng)建了6個Redis實例,開啟6個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
此時一個redis集群環(huán)境就已經(jīng)搭建好了,可以通過redis-trib.rb check 192.168.3.105:7003命令查看集群幾點的信息
# redis-trib.rb check 192.168.3.105:7004
redis cluster的優(yōu)點:讀寫分離+高可用+多master
讀寫分離:每個master都有一個slave
高可用:master宕機(jī),slave自動被切換過去
linux gem kms的介紹就聊到這里吧,感謝你花時間閱讀本站內(nèi)容,更多關(guān)于linux gem kms,探索Linux中的GEM和KMS技術(shù),如何調(diào)試linux的網(wǎng)絡(luò)驅(qū)動,linux 的環(huán)境搭建(二)–redis單機(jī)環(huán)境、生產(chǎn)環(huán)境、集群環(huán)境的搭建的信息別忘了在本站進(jìn)行查找喔。
成都創(chuàng)新互聯(lián)科技有限公司,經(jīng)過多年的不懈努力,公司現(xiàn)已經(jīng)成為一家專業(yè)從事IT產(chǎn)品開發(fā)和營銷公司。廣泛應(yīng)用于計算機(jī)網(wǎng)絡(luò)、設(shè)計、SEO優(yōu)化、關(guān)鍵詞排名等多種行業(yè)!
網(wǎng)頁名稱:探索Linux中的GEM和KMS技術(shù)(linuxgemkms)
文章分享:http://m.5511xx.com/article/dhsdipp.html


咨詢
建站咨詢
