為linux是工作在保護模式下,所以使用者態程序是無法象dos那樣使用顯示卡bios裡
提供的中斷呼叫來實現直接寫屏,故linux抽象出framebuffer這個裝置來供使用者態
程序實現直接寫屏。
在繼續下面的之前,先說明幾個背景知識:
1、framebuffer主要是根據vesa標準的實現的,所以只能實現最簡單的功能。
2、由於涉及核心的問題,framebuffer是不允許在系統起來後修改顯示模式等一系
列操作。(好象很多人都想要這樣幹,這是不被允許的,當然如果你自己與驅動
的話,是可以實現的)
3、對framebuffer的操作,會直接影響到本機的所有控制台的輸出,包括xwin的圖
形介面。
好,現在可以讓我們開始實現直接寫屏:
1、開啟乙個framebuffer裝置
2、通過mmap呼叫把顯示卡的物理記憶體空間對映到使用者空間
3、直接寫記憶體。
好象很簡單哦~
fbtools.h
**:#ifndef _fbtools_h_
#define _fbtools_h_
#include
//a framebuffer device structure;
typedef struct fbdev fbdev, *pfbdev;
//open & init a frame buffer
//to use this function,
//you must set fbdev.dev="/dev/fb0"
//or "/dev/fbx"
//it's your frame buffer.
int fb_open(pfbdev pfbdev);
//close a frame buffer
int fb_close(pfbdev pfbdev);
//get display depth
int get_display_depth(pfbdev pfbdev);
//full screen clear
void fb_memset(void *addr, int c, size_t len);
#endif
fbtools.c
**:#include
#include
#include
#include
#include
#include
#include
#include
#include "fbtools.h"
#define true 1
#define false 0
#define max(x,y) ((x)>(y)?(x):(y))
#define min(x,y) ((x)<(y)?(x):(y))
//open & init a frame buffer
int fb_open(pfbdev pfbdev)
if (-1 == ioctl(pfbdev->fb,fbioget_vscreeninfo,&(pfbdev->fb_var)))
if (-1 == ioctl(pfbdev->fb,fbioget_fscreeninfo,&(pfbdev->fb_fix)))
//map physics address to virtual address
pfbdev->fb_mem_offset = (unsigned long)(pfbdev->fb_fix.**em_start) & (~page_mask);
pfbdev->fb_mem = (unsigned long int)mmap(null, pfbdev->fb_fix.**em_len +
pfbdev->fb_mem_offset,
prot_read | prot_write, map_shared, pfbdev->fb, 0);
if (-1l == (long) pfbdev->fb_mem)
return true;
}//close frame buffer
int fb_close(pfbdev pfbdev)
//get display depth
int get_display_depth(pfbdev pfbdev);
return pfbdev->fb_var.bits_per_pixel;
}//full screen clear
void fb_memset (void *addr, int c, size_t len)
//use by test
#define debug
#ifdef debug
main()
fb_memset(fbdev.fb_mem + fbdev.fb_mem_offset, 0, fbdev.fb_fix.**em_len);
fb_close(&fbdev);
}
Linux下Redis下安裝
redis安裝 檢查是否安裝redis ps ef grep redis2.檢查gcc服務是否安裝成功 rpm qa grep gcc注 安裝成功則顯示 mkdir redis5.解壓redis安裝包 tar zxvf redis 2.8.17 tar.gz c usr local redis 解壓...
Linux下程式設計
windows下我的環境為 windows10 vs2015 opencv3.4.0 opencv3.4.0 contrib python linux下我的環境為 ubuntu16004 也有ubuntu1804 opencv3.4.0 opencv3.4.0 contrib python gnu ...
linux下萬用字元
萬用字元是一類鍵盤字元,有星號 和問號 當查詢檔案呀資料夾時,可以使用它來代替乙個或多個真正字元 當不知道真正字元或者不想建入完整名字時,常常使用萬用字元代替乙個或多個真正字元。星號 可以使用星號代替0個或多個字元。如果正在查詢以aew開頭的乙個檔案,但不記得檔名其餘部分,可以輸入aew,查詢以ae...