欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
對FrameBuffer的一夜hack。。。
大家都知道Unix/Linux系統是由命令驅動(dòng)的。那么最基本的系統是命令行的(就是想DOS一樣的界面)。X-Window-System是Unix/Linux上的圖形系統,它是通過(guò)X-Server來(lái)控制硬件的。但有一些Linux的發(fā)行版在引導的時(shí)候就會(huì )在屏幕上出現圖形,這時(shí)的圖形是不可能由X來(lái)完成的,那是什么機制呢?答案是FrameBuffer。
FrameBuffer不是一個(gè)圖形系統,更不是窗口系統。它比X要低級,簡(jiǎn)單來(lái)說(shuō)FrameBuffer就是一種機制的實(shí)現。這種機制是把屏幕上的每個(gè)點(diǎn)映射成一段線(xiàn)性?xún)却婵臻g,程序可以簡(jiǎn)單的改變這段內存的值來(lái)改變屏幕上某一點(diǎn)的顏色。X的高度可移植性就是來(lái)自于這種機制,不管是在那種圖形環(huán)境下,只要有這種機制的實(shí)現就可以運行X。所以在幾乎所有的平臺上都有相應的X版本的移植。
好了,閑話(huà)少說(shuō),下面我們來(lái)看看可以利用FrameBuffer來(lái)干點(diǎn)什么。首先看看你是否有了相應的驅動(dòng):找一下在/dev/下是否有fb*這個(gè)設備文件,這是個(gè)字符類(lèi)的特殊文件。
代碼:
ls -l /dev/fb0 (Enter)
crw-rw---- 1 root video 29, 0 Jan 27 15:32 /dev/fb0
如果沒(méi)有這個(gè)文件也可以找找其他的比如:/dev/fb1,/dev/fb2...如果找不到這些文件,那就得重新編譯內核了。下面假設存在這個(gè)文件/dev/fb0,這就是FrameBuffer的設備文件。
有了這個(gè)我們可以play with FrameBuffer了。(一下的操作不一定要在X下,可以在啟動(dòng)了FrameBuffer的虛擬控制臺下)
代碼:
cat /dev/fb0 > sreensnap

ls -l sreensnap

-rw-r--r-- 1 wsw wsw 6291456 Jan 27 21:30 sreensnap
我們得到了一個(gè)恰好6M的文件,再做下面的操作:
代碼:
clear /*清楚屏幕的輸出*/
cat sreensnap > /dev/fb0
是不是奇怪的事情發(fā)生了?好像是中了病毒一般?屏幕又恢復了以前的狀態(tài)?不用著(zhù)急,
代碼:
clear
這樣屏幕就正常了。

通過(guò)以上的操作,我想你也猜到了。文件/dev/fb0就是控制屏幕上的每一點(diǎn)的顏色的文件。我們可以寫(xiě)程序來(lái)改變這個(gè)文件的內容,就可以方便的在屏幕上畫(huà)圖了:-)

我下面就來(lái)寫(xiě)一個(gè)小程序,探測一下屏幕的屬性。

代碼:
#include <unistd.h>
#include <stdio.h>
#include <fcntl.h>
#include <linux/fb.h>
#include <sys/mman.h>

int main () {
int fp=0;
struct fb_var_screeninfo vinfo;
struct fb_fix_screeninfo finfo;
fp = open ("/dev/fb0",O_RDWR);

if (fp < 0){
printf("Error : Can not open framebuffer device\n");
exit(1);
}

if (ioctl(fp,FBIOGET_FSCREENINFO,&finfo)){
printf("Error reading fixed information\n");
exit(2);
}

if (ioctl(fp,FBIOGET_VSCREENINFO,&vinfo)){
printf("Error reading variable information\n");
exit(3);
}

printf("The mem is :%d\n",finfo.smem_len);
printf("The line_length is :%d\n",finfo.line_length);
printf("The xres is :%d\n",vinfo.xres);
printf("The yres is :%d\n",vinfo.yres);
printf("bits_per_pixel is :%d\n",vinfo.bits_per_pixel);
close (fp);
}
struct fb_var_screeninfo 和 struct fb_fix_screeninfo 兩個(gè)數據結構是在/usr/include/linux/fb.h中定義的,里面有些有趣的值:(都是無(wú)符號32位的整數)
在fb_fix_screeninfo中有
__u32 smem_len 是這個(gè)/dev/fb0的大小,也就是內存大小。
__u32 line_length 是屏幕上一行的點(diǎn)在內存中占有的空間,不是一行上的點(diǎn)數。
在fb_var_screeninfo 中有
__u32 xres ,__u32 yres 是x和y方向的分辨率,就是兩個(gè)方向上的點(diǎn)數。
__u32 bits_per_pixel 是每一點(diǎn)占有的內存空間。

把上面的程序編譯以后運行,在我的機器上的結果如下:
代碼:
The mem is :6291456
The line_length is :4096
The xres is :1024
The yres is :768
bits_per_pixel is :32
內存長(cháng)度恰好是6M,每行占有4M的空間,分辨率是1024x768,色彩深度是32位。細心的你可能已經(jīng)發(fā)現有些不對。屏幕上的點(diǎn)有1024x768=786432個(gè),每個(gè)點(diǎn)占有32比特。屏幕一共的占有內存數為32x786432=25165824就是3145728字節,恰好是3M但是上面的程序告訴我們有6M的存儲空間。這是因為在現代的圖形系統中大多有緩沖技術(shù),顯存中存有兩頁(yè)屏幕數據,這是方便快速的改變屏幕內容實(shí)現動(dòng)畫(huà)之類(lèi)比較高的要求。關(guān)于這種緩沖技術(shù)有點(diǎn)復雜,我們目前先不討論。對于我們來(lái)說(shuō)只有這3M內存來(lái)存放這一個(gè)屏幕的顏色數據。
好了,現在你應該對FrameBuffer有一個(gè)大概的了解了吧。那么接下來(lái)你一定會(huì )想在屏幕上畫(huà)一些東西,讓我們先從畫(huà)一個(gè)點(diǎn)開(kāi)始吧。先說(shuō)說(shuō)我的想法:在類(lèi)Unix系統中,一切東西都是文件。我們對屏幕的讀寫(xiě)就可以轉換成對/dev/fb0的讀寫(xiě)。那么就把/dev/fb0用open打開(kāi),再用lseek定位要讀寫(xiě)的位置,最后調用read或者write來(lái)操作。通過(guò)這么一大段的操作我們才完成了對一個(gè)點(diǎn)的讀或者寫(xiě)。這種方法開(kāi)銷(xiāo)太大了。還有一種方法,我們把/dev/fb0映射到程序進(jìn)程的內存空間中來(lái),然后得到一個(gè)指向這段存儲空間的指針,這樣就可以方便的讀寫(xiě)了。但是我們要知道能映射多少和該映射多少,這能很方便的從上面一個(gè)程序得出的參數來(lái)決定。
下面是程序代碼:
代碼:
#include <unistd.h>
#include <stdio.h>
#include <fcntl.h>
#include <linux/fb.h>
#include <sys/mman.h>

int main () {
int fp=0;
struct fb_var_screeninfo vinfo;
struct fb_fix_screeninfo finfo;
long screensize=0;
char *fbp = 0;
int x = 0, y = 0;
long location = 0;
fp = open ("/dev/fb0",O_RDWR);

if (fp < 0){
printf("Error : Can not open framebuffer device\n");
exit(1);
}

if (ioctl(fp,FBIOGET_FSCREENINFO,&finfo)){
printf("Error reading fixed information\n");
exit(2);
}

if (ioctl(fp,FBIOGET_VSCREENINFO,&vinfo)){
printf("Error reading variable information\n");
exit(3);
}

screensize = vinfo.xres * vinfo.yres * vinfo.bits_per_pixel / 8;
/*這就是把fp所指的文件中從開(kāi)始到screensize大小的內容給映射出來(lái),得到一個(gè)指向這塊空間的指針*/
fbp =(char *) mmap (0, screensize, PROT_READ | PROT_WRITE, MAP_SHARED, fp,0);
if ((int) fbp == -1)
{
printf ("Error: failed to map framebuffer device to memory.\n");
exit (4);
}
/*這是你想畫(huà)的點(diǎn)的位置坐標,(0,0)點(diǎn)在屏幕左上角*/
x = 100;
y = 100;
location = x * (vinfo.bits_per_pixel / 8) + y * finfo.line_length;

*(fbp + location) = 100; /* 藍色的色深 */ /*直接賦值來(lái)改變屏幕上某點(diǎn)的顏色*/
*(fbp + location + 1) = 15; /* 綠色的色深*/
*(fbp + location + 2) = 200; /* 紅色的色深*/
*(fbp + location + 3) = 0; /* 是否透明*/
munmap (fbp, screensize); /*解除映射*/
close (fp); /*關(guān)閉文件*/
return 0;

}
因為這是對線(xiàn)性存儲空間的讀寫(xiě),所以代碼有點(diǎn)不清晰,不易理解。但是有了這個(gè)基本的代碼實(shí)現,我們可以很容易寫(xiě)一些DrawPoint之類(lèi)的函數去包裝一下低層的對線(xiàn)性存儲空間的讀寫(xiě)。但是有了畫(huà)點(diǎn)的程序,再寫(xiě)出畫(huà)線(xiàn)畫(huà)圓的函數就不是非常困難了。

這些就是我對FrameBuffer的初步研究,匆忙之間寫(xiě)些東西不成文章,以后要寫(xiě)些更高級一點(diǎn)的函數的實(shí)現。
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
Framebuffer - 應用篇
LCD驅動(dòng) framebuffer機制
在Framebuffer下編程顯示BMP圖象
FrameBuffer編程二(簡(jiǎn)單程序下)
framebuffer編程顯示真彩圖片
直接寫(xiě)framebuffer
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久