linux系統操作視訊記憶體基礎知識了解

2021-08-21 05:39:27 字數 3095 閱讀 6079

裝置檔案是在/dev/目錄下

裝置檔案有主裝置號,次裝置號.

當操作裝置檔案, 系統會根據裝置檔案的裝置號找到相應的裝置驅動(驅動在核心註冊時已指定使用的裝置號),並呼叫相應的功能.

open ---> sys ----> driver ---> drv_open

read ---> sys ----> driver ---> drv_read

ioctl --> sys ----> driver ---> drv_ioctl

//一幅圖由很多行資料, 每行由很多個畫素點組成.

800x600: 表示600行, 每行800個畫素點

1024x768

1024x768x16: 表示共有768行, 每行1024個畫素點, 每個畫素點的資料占用16位

rgb565

1024x768x24: 表示共有768行, 每行1024個畫素點, 每個畫素點的資料占用24位

rgb888

1024x768x32: 表示共有768行, 每行1024個畫素點, 每個畫素點的資料占用32位

argb8888   a:透明度

每個畫素點表示乙個顏色, 乙個顏色由三基色(red, green, blue)組成. 也就是說乙個畫素點的資料位裡包含有r多少, g/b各是多少的資訊. r,g, b各占用不同的幾位來表示

256色:表示共有256種顏色, 每個畫素點資料占用乙個位元組(8位).

首先把圖里使用頻率最高的256種顏色做成乙個顏色表(每種顏色還是rgb888), 每個畫素點的資料不是記錄rgb的資料, 而是記錄對應顏色表裡的索引號

每個畫素點佔16bit(16位色):

rgb1555:  rgb各占用5bit, 1bit可用於表示透明

rgb565:   r占用高5位(11-15, g占用6位(5--10), b占用5位(0-4)

每個畫素點佔24bit(24位色):

rgb888:   rgb各用8位

每個畫素點佔32bit(32位色):

rgb8888:  rgb各占用8位, 最高8位用於透明度的表示

linux系統下, 沒有lcd驅動. 對應的驅動應叫framebuffer驅動(視訊記憶體).

驅動好後, 對應裝置檔案應是/dev/fb*

視訊記憶體: 就是在記憶體裡分出乙個區域,專用於畫出要顯示的影象(如視窗系統等). 而lcd的顯示是由dma控制器自動從這個區域裡把rgb資料搬到lcd控制器裡顯示的

dma控制器:就是資料的搬運工, 只要設好從**搬,搬到**去. 就可以自動迴圈工作.

我們要顯示乙個或乙個視窗,只需要改變視訊記憶體裡的資料就可以了

struct fb_info 的乙個物件表示乙個framebuffer裝置

struct fb_info結構體成員比較多, 最起碼需要初始化下面列出的幾個成員:

struct fb_info fbi ;

struct fb_var_screeninfo

struct fb_fix_screeninfo

ioctl函式用於從驅動裡獲取相應的配置資訊; 或者把配置資訊傳遞給驅動,讓驅動根據相應的配置資訊來設定硬體

int ioctl(int fd, int request, ...); //返回值為0表示執行成功,-1表示執行失敗

fd表示開啟裝置檔案獲取到的檔案描述符

request表示告訴驅動需要做什麼操作. 具體的值是由驅動與應用程式約定好的

...不定引數.

man 2 ioctl_list //檢視系統裡常用的ioctl命令

tes1:

struct fb_fix_screeninfo finfo;

ioctl(fd, fbioget_fscreeninfo, &finfo)

printf("id = %s\n", finfo.id);

printf("line length = %d\n", finfo.line_length);

結果:id = svgadrmfb

line length = 5120 //1280*4

test2:

struct fb_var_screeninfo vinfo;

ioctl(fd, fbioget_vscreeninfo, &vinfo); 

printf("x = %d, y = %d\n", vinfo.xres, vinfo.yres); 

printf("bits_per_pixel = %d\n", vinfo.bits_per_pixel);

printf("red : offset = %d, length = %d\n", vinfo.red.offset, vinfo.red.length);    

printf("green : offset = %d, length = %d\n", vinfo.green.offset, vinfo.green.length);    

printf("blue : offset = %d, length = %d\n", vinfo.blue.offset, vinfo.blue.length);    

printf("transp : offset = %d, length = %d\n", vinfo.transp.offset, vinfo.transp.length);

tetst2結果:

x = 1280, y = 768

bits_per_pixel = 32

red : offset = 16, length = 8

green : offset = 8, length = 8

blue : offset = 0, length = 8

transp : offset = 0, length = 0

///bmp檔案裡面除了256色的檔案外,  裡面每個畫素存放的都是rgb資料和乙個檔案頭.

24bit的bmp檔案大小:  檔案頭54位元組+解析度*3位元組每個畫素

注意:bmp檔案裡存放的資料是反著的, 要正確顯示,需要把圖中的第0行放到視訊記憶體裡的最後一行, 圖里的第一行放到視訊記憶體裡的倒數第一行, 圖里的第二行放到屏的倒數第二行....   

Linux作業系統基礎知識

linux作業系統 linux概述 是乙個開源的作業系統 linux一次代表的是linux核心 創始人 林納斯托瓦斯 linux 兩大髮型版本 red hat 一般在伺服器上使用 debian linux作業系統安裝 nat模式 把自己電腦看成路由器,然後只能自己本機和虛擬機器通訊,或者是多個虛擬機...

Linux作業系統基礎知識

一 linux的體系結構 核心空間 kernel space 核心空間又包括系統呼叫介面 system call inte ce 核心 kernel 平台架構相關的 architecture dependent kernel code 注 使用者空間和核心空間是程式執行的兩種不同的狀態,我們可以通過...

Linux 作業系統基礎知識

基於馮諾伊曼體系,將計算機分為5大組成部分 運算器 也叫算數邏輯單元,完成對資料的各種常規運算,如加減乘除,也包括邏輯運算,移位,比較等。要注意pc機32位或64位表示的是運算器計算能力,alu的寬度,一次計算能夠計算的資料的位數。控制器 它是整個計算機系統的控制中心,它指揮計算機各部分協調工作,保...