📄 关于frambuffer - ~ 悠悠风信子 ~ - csdnblog.htm
字号:
<TD style="WIDTH: 14%" align=middle>21</TD>
<TD style="WIDTH: 14%" align=middle>22</TD>
<TD style="WIDTH: 14%" align=middle>23</TD>
<TD style="WIDTH: 14%" align=middle>24</TD>
<TD class=CalWeekendDay style="WIDTH: 14%"
align=middle>25</TD></TR>
<TR>
<TD class=CalWeekendDay style="WIDTH: 14%"
align=middle>26</TD>
<TD style="WIDTH: 14%" align=middle>27</TD>
<TD style="WIDTH: 14%" align=middle>28</TD>
<TD style="WIDTH: 14%" align=middle>29</TD>
<TD style="WIDTH: 14%" align=middle>30</TD>
<TD style="WIDTH: 14%" align=middle>31</TD>
<TD class=CalOtherMonthDay style="WIDTH: 14%"
align=middle>1</TD></TR>
<TR>
<TD class=CalOtherMonthDay style="WIDTH: 14%"
align=middle>2</TD>
<TD class=CalOtherMonthDay style="WIDTH: 14%"
align=middle>3</TD>
<TD class=CalOtherMonthDay style="WIDTH: 14%"
align=middle>4</TD>
<TD class=CalOtherMonthDay style="WIDTH: 14%"
align=middle>5</TD>
<TD class=CalOtherMonthDay style="WIDTH: 14%"
align=middle>6</TD>
<TD class=CalOtherMonthDay style="WIDTH: 14%"
align=middle>7</TD>
<TD class=CalOtherMonthDay style="WIDTH: 14%"
align=middle>8</TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE>
<DIV class=left_title> 导航</DIV>
<UL class=list type=square>
<LI class=listitem><A class=mainmenu id=MyLinks1_csdnhome
href="http://www.csdn.net/">CSDN首页</A>
<LI class=listitem><A class=mainmenu id=MyLinks1_csdndev
href="http://dev.csdn.net/">CSDN技术中心</A>
<LI class=listitem><A class=mainmenu id=MyLinks1_HomeLink
title=到聚合站点 href="http://blog.csdn.net/">BLOG首页</A>
<LI class=listitem><A class=mainmenu id=MyLinks1_PersonalHome
title="访问 ~ 悠悠风信子 ~"
href="http://blog.csdn.net/youyoufengxinzi/">我的首页</A>
<LI><A id=MyLinks1_MyArticles title="查看 ~ 悠悠风信子 ~ 所有文章"
href="http://blog.csdn.net/youyoufengxinzi/MyArticles.aspx"
target=_blank>我的文章</A>
<LI class=listitem><A class=mainmenu id=MyLinks1_ContactLink
href="http://blog.csdn.net/youyoufengxinzi/contact.aspx">联系作者</A>
<LI class=listitem><A class=mainmenu id=MyLinks1_Syndication
href="http://blog.csdn.net/youyoufengxinzi/Rss.aspx">聚合</A> <A
id=MyLinks1_XMLLink
href="http://blog.csdn.net/youyoufengxinzi/Rss.aspx"><IMG
src="关于frambuffer - ~ 悠悠风信子 ~ - CSDNBlog.files/xml.gif"
border=0></A> <A id=MyLinks1_FeedLink
href="http://feeds.feedsky.com/csdn.net/youyoufengxinzi"
target=_blank><IMG
src="关于frambuffer - ~ 悠悠风信子 ~ - CSDNBlog.files/feedsky.gif"
border=0></A>
<LI class=listitem><A class=mainmenu id=MyLinks1_HyperLink5
href="http://search.csdn.net/search_blog.asp" target=_blank>搜索</A>
<LI class=listitem><A class=mainmenu id=MyLinks1_Admin
href="http://writeblog.csdn.net/">登录</A> </LI></UL>
<DIV class=blogStats>原创 - 26, 翻译 - 0, 转贴 - 0, 点击 - 3644, 评论 - 24,
Trackbacks -0 </DIV><SPAN id=RecentVisitors>
<H3 class=listtitle>最近访客</H3>
<TABLE border=0>
<TBODY>
<TR>
<TD align=middle><IMG
onmouseover="try{BlogShowme(event, 'eNsEmpire')}catch(ex){}"
style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px"
alt="eNsEmpire 的头像"
src="关于frambuffer - ~ 悠悠风信子 ~ - CSDNBlog.files/2.jpg"><BR><A
title="访问时间: 7/31/2007 10:32:01 AM"
href="http://blog.csdn.net/eNsEmpire/">eNsEmpire</A></TD>
<TD align=middle><IMG
onmouseover="try{BlogShowme(event, 'slic2004')}catch(ex){}"
style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px"
alt="slic2004 的头像"
src="C:\Documents and Settings\Administrator\桌面\wangluo\关于frambuffer - ~ 悠悠风信子 ~ - CSDNBlog.files\2(1).jpg"><BR><A
title="访问时间: 7/23/2007 10:25:05 AM"
href="http://blog.csdn.net/slic2004/">slic2004</A></TD></TR></TBODY></TABLE></SPAN>
<H3 class=listtitle>文章</H3>
<UL class=list>
<LI class=listitem><A
href="http://blog.csdn.net/youyoufengxinzi/category/280571.aspx">bmp</A><A
href="http://blog.csdn.net/youyoufengxinzi/category/280571.aspx/rss">(RSS)</A>
<LI class=listitem><A
href="http://blog.csdn.net/youyoufengxinzi/category/280476.aspx">framebuffer</A><A
href="http://blog.csdn.net/youyoufengxinzi/category/280476.aspx/rss">(RSS)</A>
<LI class=listitem><A
href="http://blog.csdn.net/youyoufengxinzi/category/280580.aspx">linux内核</A><A
href="http://blog.csdn.net/youyoufengxinzi/category/280580.aspx/rss">(RSS)</A>
<LI class=listitem><A
href="http://blog.csdn.net/youyoufengxinzi/category/281645.aspx">linux驱动</A><A
href="http://blog.csdn.net/youyoufengxinzi/category/281645.aspx/rss">(RSS)</A>
<LI class=listitem><A
href="http://blog.csdn.net/youyoufengxinzi/category/281906.aspx">常用</A><A
href="http://blog.csdn.net/youyoufengxinzi/category/281906.aspx/rss">(RSS)</A></LI></UL>
<H3 class=listtitle>收藏</H3>
<UL class=list></UL>
<H3 class=listtitle>相册</H3><!--category title-->
<UL class=list></UL>
<H3 class=listtitle>存档</H3>
<UL class=list>
<LI><A
href="http://blog.csdn.net/youyoufengxinzi/archive/2007/04.aspx">2007年04月(1)</A>
<LI><A
href="http://blog.csdn.net/youyoufengxinzi/archive/2007/03.aspx">2007年03月(4)</A>
<LI><A
href="http://blog.csdn.net/youyoufengxinzi/archive/2007/02.aspx">2007年02月(21)</A></LI></UL></TD></TR></TBODY></TABLE></TD>
<TD vAlign=top width="70%"
background="关于frambuffer - ~ 悠悠风信子 ~ - CSDNBlog.files/post_bg.gif">
<TABLE height=90 cellSpacing=0 cellPadding=5 width="100%" align=center
bgColor=white border=0>
<TBODY>
<TR>
<TD
background="关于frambuffer - ~ 悠悠风信子 ~ - CSDNBlog.files/post_bg.gif"><!--done-->
<DIV class=Tag>
<SCRIPT language=javascript
src="关于frambuffer - ~ 悠悠风信子 ~ - CSDNBlog.files/urltag.aspx"></SCRIPT>
<DIV style="CLEAR: both"></DIV></DIV><SPAN class=PreAndNext
id=viewpost.ascx_PreviousAndNextEntriesUp>
<DIV align=center><A
href="http://blog.csdn.net/youyoufengxinzi/archive/2007/02/27/1516229.aspx">上一篇: 00-INDEX、framebuffer.txt、internals.txt译文</A> | <A
href="http://blog.csdn.net/youyoufengxinzi/archive/2007/02/27/1516219.aspx">下一篇: Framebuffer
HOWTO </A></DIV></SPAN><BR>
<SCRIPT>function StorePage(){d=document;t=d.selection?(d.selection.type!='None'?d.selection.createRange().text:''):(d.getSelection?d.getSelection():'');void(keyit=window.open('http://www.365key.com/storeit.aspx?t='+escape(d.title)+'&u='+escape(d.location.href)+'&c='+escape(t),'keyit','scrollbars=no,width=475,height=575,left=75,top=20,status=no,resizable=yes'));keyit.focus();}</SCRIPT>
<DIV class=post>
<DIV class=postTitle><A
href="http://blog.csdn.net/youyoufengxinzi/archive/2007/02/27/1516224.aspx"><IMG
height=13
src="关于frambuffer - ~ 悠悠风信子 ~ - CSDNBlog.files/authorship.gif"
width=15 border=0> 关于frambuffer</A> </DIV>
<DIV class=postText>
<P>Linux是工作在保护模式下,所以用户态进程是无法象DOS那样使用显卡BIOS里提供的中断调用来实现直接写屏,Linux抽象出FrameBuffer这个设备来供用户态进程实现直接写屏。Framebuffer机制模仿显卡的功能,将显卡硬件结构抽象掉,可以通过Framebuffer的读写直接对显存进行操作。用户可以将Framebuffer看成是显示内存的一个映像,将其映射到进程地址空间之后,就可以直接进行读写操作,而写操作可以立即反应在屏幕上。这种操作是抽象的,统一的。用户不必关心物理显存的位置、换页机制等等具体细节。这些都是由Framebuffer设备驱动来完成的。</P>
<P>但Framebuffer本身不具备任何运算数据的能力,就只好比是一个暂时存放水的水池.CPU将运算后的结果放到这个水池,水池再将结果流到显示器.中间不会对数据做处理.
应用程序也可以直接读写这个水池的内容.在这种机制下,尽管Framebuffer需要真正的显卡驱动的支持,但所有显示任务都有CPU完成,因此CPU负担很重.</P>
<P>framebuffer的设备文件一般是 /dev/fb0、/dev/fb1 等等。</P>
<P>可以用命令: #dd if=/dev/zero of=/dev/fb 清空屏幕.</P>
<P>如果显示模式是 1024x768-8 位色,用命令:$ dd if=/dev/zero of=/dev/fb0 bs=1024
count=768 清空屏幕</P>
<P>用命令: #dd if=/dev/fb of=fbfile 可以将fb中的内容保存下来;</P>
<P>可以重新写回屏幕: #dd if=fbfile of=/dev/fb</P>
<P>在使用Framebuffer时,Linux是将显卡置于图形模式下的.</P>
<P>在应用程序中,一般通过将 FrameBuffer 设备映射到进程地址空间的方式使用,比如下面的程序就打开 /dev/fb0
设备,并通过 mmap 系统调用进行地址映射,随后用 memset 将屏幕清空(这里假设显示模式是 1024x768-8
位色模式,线性内存模式):</P>
<P>int fb;</P>
<P>unsigned char* fb_mem;</P>
<P>fb = open ("/dev/fb0", O_RDWR);</P>
<P>fb_mem = mmap (NULL, 1024*768,
PROT_READ|PROT_WRITE,MAP_SHARED,fb,0);</P>
<P>memset (fb_mem, 0, 1024*768);</P>
<P>FrameBuffer 设备还提供了若干 ioctl
命令,通过这些命令,可以获得显示设备的一些固定信息(比如显示内存大小)、与显示模式相关的可变信息(比如分辨率、象素结构、每扫描线的字节宽度),以及伪彩色模式下的调色板信息等等。</P>
<P>通过 FrameBuffer
设备,还可以获得当前内核所支持的加速显示卡的类型(通过固定信息得到),这种类型通常是和特定显示芯片相关的。比如目前最新的内核(2.4.9)中,就包含有对
S3、Matrox、nVidia、3Dfx 等等流行显示芯片的加速支持。在获得了加速芯片类型之后,应用程序就可以将 PCI
设备的内存I/O(memio)映射到进程的地址空间。这些 memio
一般是用来控制显示卡的寄存器,通过对这些寄存器的操作,应用程序就可以控制特定显卡的加速功能。</P>
<P>PCI
设备可以将自己的控制寄存器映射到物理内存空间,而后,对这些控制寄存器的访问,给变成了对物理内存的访问。因此,这些寄存器又被称为"memio"。一旦被映射到物理内存,Linux
的普通进程就可以通过 mmap 将这些内存 I/O 映射到进程地址空间,这样就可以直接访问这些寄存器了。</P>
<P>当然,因为不同的显示芯片具有不同的加速能力,对memio
的使用和定义也各自不同,这时,就需要针对加速芯片的不同类型来编写实现不同的加速功能。比如大多数芯片都提供了对矩形填充的硬件加速支持,但不同的芯片实现方式不同,这时,就需要针对不同的芯片类型编写不同的用来完成填充矩形的函数。</P>
<P>FrameBuffer
只是一个提供显示内存和显示芯片寄存器从物理内存映射到进程地址空间中的设备。所以,对于应用程序而言,如果希望在 FrameBuffer
之上进行图形编程,还需要自己动手完成其他许多工作。</P>
<P><!--[if !supportEmptyParas]--> <!--[endif]--></P>
<P><!--[if
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -