在虛擬機ubuntu上修改framebuffer桌面不能顯示圖像

目錄

一、測試程序

二、排查原因

三、為什么 Xorg 會導致程序無法工作?


一、測試程序

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <sys/mman.h>
#include <linux/fb.h>static int width; //LCD X 分辨率
static int height; //LCD Y 分辨率
static unsigned int *screen_base = NULL; //映射后的顯存基地址
/********************************************************************
* 函數名稱: lcd_draw_point
* 功能描述: 打點
* 輸入參數: x, y, color
* 返 回 值: 無
********************************************************************/
static void lcd_draw_point(unsigned int x, unsigned int y, unsigned int color)
{/* 對傳入參數的校驗 */if (x >= width)x = width - 1;if (y >= height)y = height - 1;/* 填充顏色 */screen_base[y * width + x] = color;
}
/********************************************************************
* 函數名稱: lcd_draw_line
* 功能描述: 畫線(水平或垂直線)
* 輸入參數: x, y, dir, length, color
* 返 回 值: 無
********************************************************************/
static void lcd_draw_line(unsigned int x, unsigned int y, int dir,
unsigned int length, unsigned int color)
{unsigned int end;unsigned long temp;/* 對傳入參數的校驗 */if (x >= width)x = width - 1;if (y >= height)y = height - 1;/* 填充顏色 */temp = y * width + x;//定位到起點if (dir) { //水平線end = x + length - 1;if (end >= width)end = width - 1;for ( ; x <= end; x++, temp++)screen_base[temp] = color;}else { //垂直線end = y + length - 1;if (end >= height)end = height - 1;for ( ; y <= end; y++, temp += width)screen_base[temp] = color;}
}
/********************************************************************
* 函數名稱: lcd_draw_rectangle
* 功能描述: 畫矩形
* 輸入參數: start_x, end_x, start_y, end_y, color
* 返 回 值: 無
********************************************************************/
static void lcd_draw_rectangle(unsigned int start_x, unsigned int end_x,
unsigned int start_y, unsigned int end_y,
unsigned int color)
{int x_len = end_x - start_x + 1;int y_len = end_y - start_y - 1;lcd_draw_line(start_x, start_y, 1, x_len, color);//上邊lcd_draw_line(start_x, end_y, 1, x_len, color); //下邊lcd_draw_line(start_x, start_y + 1, 0, y_len, color);//左邊lcd_draw_line(end_x, start_y + 1, 0, y_len, color);//右邊
}
/********************************************************************
* 函數名稱: lcd_fill
* 功能描述: 將一個矩形區域填充為參數 color 所指定的顏色
* 輸入參數: start_x, end_x, start_y, end_y, color
* 返 回 值: 無
********************************************************************/
static void lcd_fill(unsigned int start_x, unsigned int end_x,
unsigned int start_y, unsigned int end_y,
unsigned int color)
{unsigned long temp;unsigned int x;/* 對傳入參數的校驗 */if (end_x >= width)end_x = width - 1;if (end_y >= height)end_y = height - 1;/* 填充顏色 */temp = start_y * width; //定位到起點行首for ( ; start_y <= end_y; start_y++, temp+=width) {for (x = start_x; x <= end_x; x++)screen_base[temp + x] = color;}
}int main(int argc, char *argv[])
{struct fb_fix_screeninfo fb_fix;struct fb_var_screeninfo fb_var;unsigned int screen_size;int fd;/* 打開 framebuffer 設備 */if (0 > (fd = open("/dev/fb0", O_RDWR))) {perror("open error");exit(EXIT_FAILURE);}/* 獲取參數信息 */ioctl(fd, FBIOGET_VSCREENINFO, &fb_var);ioctl(fd, FBIOGET_FSCREENINFO, &fb_fix);printf("Solution: %d*%d\n""pixel depth bpp: %d\n""Number of bytes in a row: %d\n""Pixel format: R<%d %d> G<%d %d> B<%d %d> A<%d %d>\n",fb_var.xres, fb_var.yres, fb_var.bits_per_pixel,fb_fix.line_length,fb_var.red.offset, fb_var.red.length,fb_var.green.offset, fb_var.green.length,fb_var.blue.offset, fb_var.blue.length, fb_var.transp.offset, fb_var.transp.length);screen_size = fb_fix.line_length * fb_var.yres;width = fb_fix.line_length / (fb_var.bits_per_pixel / 8);height = fb_var.yres;/* 將顯示緩沖區映射到進程地址空間 */screen_base = mmap(NULL, screen_size, PROT_WRITE, MAP_SHARED, fd, 0);if (MAP_FAILED == (void *)screen_base) {perror("mmap error");close(fd);exit(EXIT_FAILURE);}/* 畫正方形方塊 */int w = height * 0.25;//方塊的寬度為 1/4 屏幕高度lcd_fill(0, fb_var.xres-1, 0, height-1, 0x0); //清屏(屏幕顯示黑色)lcd_fill(0, w, 0, w, 0xFF0000); //紅色方塊lcd_fill(fb_var.xres-w, fb_var.xres-1, 0, w, 0xFF00); //綠色方塊lcd_fill(0, w, height-w, height-1, 0xFF); //藍色方塊lcd_fill(fb_var.xres-w, fb_var.xres-1, height-w, height-1, 0xFFFF00);//黃色方塊/* 畫線: 十字交叉線 */lcd_draw_line(0, height * 0.5, 1, fb_var.xres, 0xFFFFFF);//白色線lcd_draw_line(fb_var.xres * 0.5, 0, 0, height, 0xFFFFFF);//白色線/* 畫矩形 */unsigned int s_x, s_y, e_x, e_y;s_x = 0.25 * fb_var.xres;s_y = w;e_x = fb_var.xres - s_x;e_y = height - s_y;for ( ; (s_x <= e_x) && (s_y <= e_y);s_x+=5, s_y+=5, e_x-=5, e_y-=5)lcd_draw_rectangle(s_x, e_x, s_y, e_y, 0xFFFFFF);/* 退出 */munmap(screen_base, screen_size); //取消映射close(fd); //關閉文件exit(EXIT_SUCCESS); //退出進程
}

執行結果:

lientek@ubuntu:/home/linux_test/lcd$ sudo ./demo 
Solution: 800*600
pixel depth bpp: 32
Number of bytes in a row: 4704
Pixel format: R<16 8> G<8 8> B<0 8> A<0 0>

桌面無圖形繪制效果

二、排查原因

????????程序無法在虛擬機的 Ubuntu 桌面上繪制圖形,主要原因在于現代 Linux 桌面環境(如 Ubuntu 使用的 GNOME、Unity 等)通常運行在 X Window 系統或 Wayland 等顯示服務器上,而程序直接操作了/dev/fb0(幀緩沖設備),這在桌面環境中存在一些兼容性問題。

????????顯示服務器沖突:在桌面環境中,Xorg 或 Wayland 已經獨占了幀緩沖設備,普通用戶程序無法直接訪問/dev/fb0進行繪圖

確定當前使用的是 Xorg 還是 Wayland:

alientek@ubuntu:/home/linux_test/lcd$ echo $XDG_SESSION_TYPE
x11

三、為什么 Xorg 會導致程序無法工作?

Xorg 作為顯示服務器,會獨占?/dev/fb0?設備來管理桌面顯示。當 Xorg 運行時:

  1. 它會優先打開并鎖定?/dev/fb0,程序雖然可能成功?open("/dev/fb0")(取決于權限),但寫入的內容會被 Xorg 的桌面渲染覆蓋(因為 Xorg 會持續刷新屏幕)。

  2. 程序直接操作顯存的像素數據,但 Xorg 有自己的渲染管線(如通過顯卡驅動、窗口管理器等),兩者的繪制邏輯沖突,導致你的圖形無法顯示在桌面。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/93673.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/93673.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/93673.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

語言模型的評估指標整理

語言模型&#xff08;Language Models&#xff09;是自然語言處理&#xff08;NLP&#xff09;的核心組件&#xff0c;廣泛應用于機器翻譯、文本生成、對話系統等領域。隨著模型復雜度的提升&#xff0c;如何科學、系統地評估模型性能變得至關重要。評估指標不僅幫助我們理解模…

【開發技術】.Net中配置Serilog日志分級記錄

目錄 一、目的 二、解決方案 2.1 下載serilog包 2.2 Serilog配置 2.2.1 使用多個File sink配置不同的最小日志級別 2.2.2 使用Filter條件分流到不同文件 三、使用建議 四、文章總結 一、目的 在日常開發中&#xff0c;需要根據不同的場景去記錄日志&#xff0c;根據實際…

聊聊如何判斷發現的缺陷屬于前后端

目錄 一、觀察缺陷現象 二、檢查網絡請求&#xff08;核心方法&#xff09; 三、模擬請求驗證后端 四、查看日志 五、數據流分析 六、判斷前后端缺陷方法 判斷發現的缺陷是前后端&#xff0c;可以通過觀察缺陷現象&#xff0c;檢查網絡請求&#xff0c;查看后端日志&…

Python3與MySQL的PyMySQL連接與應用

Python3與MySQL的PyMySQL連接與應用 引言 隨著互聯網技術的飛速發展,數據庫在各個領域的應用日益廣泛。MySQL作為一種開源的關系型數據庫管理系統,因其穩定性和高效性,被廣泛應用于各種場景。Python作為一種高級編程語言,以其簡潔、易讀、易學等特點,受到了廣大開發者的…

智慧城市SaaS平臺|市政公用管理系統

【道路監測運維系統】1.數據可視化a) 實時監控支持對道路監測數據進行分析評估&#xff0c;為道路養護、交通管理、環境保護等提供數據支撐2.道路基礎設施監測支持對道路基礎設施的運行狀態進行實時監測&#xff0c;包括路面狀況3.交通流量監測支持對道路交通流量進行實時監測&…

Maven 配置阿里云鏡像加速

Maven 配置阿里云鏡像加速&#xff1a; 完整配置步驟&#xff08;Windows 系統&#xff09; 1. 找到 Maven 的 settings.xml 文件 全局配置&#xff1a;D:\software\apache-maven-3.9.11\conf\settings.xml用戶配置&#xff1a;C:\Users\Admin\.m2\settings.xml&#xff08;推薦…

去除視頻字幕 3 : 繼續研究 IOPaint,記錄幾個問題

1. 為什么單獨運行&#xff0c;效果很好&#xff0c;批量運行&#xff0c;效果很差。 1. 我運行 iopaint start --modellama --devicecuda --port8080在瀏覽器中單獨選擇圖片&#xff0c;涂選區域&#xff0c;然后處理&#xff0c;此時的效果非常好。2. 但是我進行 iopaint ru…

【深度之眼機器學習筆記】04-01-決策樹簡介、熵,04-02-條件熵及計算舉例,04-03-信息增益、ID3算法

1. 決策樹與熵 1.1 決策樹簡介 下面有一個貸申請樣本表&#xff0c;有許多特征 我們根據特征數據生成一棵樹&#xff0c;比如年齡有青年&#xff0c;中年&#xff0c;老年三個類別&#xff0c;那么就有三個分支&#xff0c;分別對應著三種類別。如果是青年那么就看工作&#xf…

八股文場景題

如何預估接口上線后的 QPS 問題引入 這個問題其實是一個非常實際的問題&#xff0c;因為我們在開發需求后&#xff0c;例如&#xff1a;新增了一個接口 有一個步驟是值得做的&#xff0c;那就是預估這個接口的QPS 因為我們是可以去調配對應服務器的數量和運行配置的 例如我…

【Web安全】深入淺出理解“SQL注入-偽靜態注入”及空格限制繞過技巧

文章目錄什么是偽靜態注入&#xff1f;偽靜態注入中如何繞過空格限制&#xff1f;1. 用注釋符替代空格2. 用不可見字符&#xff08;URL 編碼&#xff09;替代3. 用括號分隔語句4. 用特殊符號替代核心邏輯往期文章【Web安全】一次性搞懂 ReDOS 漏洞原理/檢測/防御 【Web安全】一…

【讀論文】Step-Audio 2 深度解讀:邁向工業級語音交互的「全能型選手」

引言:step-Audio升級 語音交互技術,作為人機交互最自然、最直接的方式之一,正以前所未有的速度發展。從簡單的語音指令到流暢的語音對話,我們對 AI 的期望越來越高。然而,要讓 AI 真正成為我們的“知心伙伴”,僅僅能“聽懂”和“說出”還遠遠不夠。 一個理想的語音 AI,…

java web 重定向

目錄結構 demo\day20\src\com\demo\service\Dome1.javademo\day20\src\com\demo\service\Dome2.javademo\day20\src\com\demo\service\Dome3.javademo\day20\src\com\demo\service\Dome4.javademo\day20\web\WEB-INF\lib\javax.servlet.jardemo\day20\web\index.jspdemo\day20\…

MySQL(配置)——MariaDB使用

一、簡介 MariaDB 和 MySQL 作為兩個流行的關系型數據庫管理系統&#xff0c;它們的區別可以從多個角度來探討。盡管 MariaDB 最初是 MySQL 的一個分支&#xff0c;但隨著時間的推移&#xff0c;它們逐漸在功能、性能和開發方向上有所不同。MariaDB 是 MySQL 的一個分支&#x…

Web3:賽道劃分與發展趨勢解析

區塊鏈技術現在已經從單一的加密貨幣支付系統發展為涵蓋金融、藝術、組織治理和社區文化的多元生態系統。這次我們將深入解析 DeFi&#xff08;去中心化金融&#xff09;、NFT&#xff08;非同質化代幣&#xff09;、DAO&#xff08;去中心化自治組織&#xff09;與 MEME&#…

LeetCode 283 - 移動零

思路 使用雙指針法&#xff0c;一次遍歷完成原地修改。 慢指針 slow&#xff1a;指向下一個非零元素應該被放置的位置。快指針 fast&#xff1a;遍歷整個數組&#xff0c;尋找非零元素。 當 fast 遇到非零數時&#xff0c;將其值賦給 slow 指向的位置&#xff0c;然后 slow 前進…

8. 網絡層

在復雜的網絡環境中確定一個合適的路徑.1. IP協議1. 基本概念IP協議&#xff1a;提供一種能力(有非常大的概率&#xff0c;做到某事)&#xff0c;把數據報從主機A&#xff0c;跨網絡&#xff0c;送到主機B --> 必須要有方式&#xff0c;標識通信兩端唯一性&#xff01;&…

【通識】線性代數(Linear Algebra)

線性代數被廣泛應用于抽象代數和泛函分析中&#xff1b;通過解析幾何&#xff0c;線性代數能被具體表示&#xff0c;線性代數被泛化為算子理論。而非線性模型被近似為線性模型&#xff0c;應用場景多為自然科學和社會科學。 費馬和笛卡爾的工作&#xff0c;線性代數出現于十七世…

Qt 嵌入式界面優化技術

在嵌入式系統中&#xff0c;界面性能直接影響用戶體驗和系統穩定性。由于嵌入式設備通常資源受限&#xff08;如低性能 CPU、有限內存、小尺寸屏幕&#xff09;&#xff0c;需針對性優化 Qt 界面以實現流暢顯示和高效交互。本文從渲染引擎、資源管理、布局優化到硬件加速&#…

去除視頻字幕 4 : 下一步,打算研究 Video Inpainting (視頻修復):

就是說&#xff0c;到現在&#xff0c;才算是真正開始&#xff0c;才發現真正的問題。 嘗試去除視頻上的字幕&#xff0c;使用 IOPaint, 效果很初級。。。問題描述 請幫我分析此時的效果。 此時的右側字幕區域&#xff0c;閃爍不停&#xff01;我原本以為效果會很好。實際非常…

代碼隨想錄算法訓練營第五十五天|圖論part5

并查集理論基礎 初始化: void init() {for (int i 0; i < n; i) {father[i] i;} } 尋根&#xff1a; // 并查集里尋根的過程 int find(int u) {return u father[u] ? u : father[u] find(father[u]); // 路徑壓縮 } 判斷u跟v是否同根 // 判斷 u 和 v是否找到同一個根 b…