2010年9月17~

来源:互联网 发布:平板电脑刷windows系统 编辑:程序博客网 时间:2024/05/21 09:24

好久没写日志了~呵呵~~~

今天晚上搞了一晚上linux分辨率 其实有点没事找事~~呵呵

在Xwindow下的分辨率已经调好了,没有任何问题;不过今天在图书馆的时候突然发现控制台下(命令行模式、黑屏模式 囧 ctrl+alt+fn 模式)分辨率没有设置好,屏幕只是利用了很小的一部分,就想这改一下,其实估计以后也不会在控制台下写程序 囧 以后要在控制台下写程序!!呵呵~~

搜啊~~~

当然中间犯错误很多~但通过慢慢的研究 逐渐找出了 framebuffer等内容,收获还是挺多的~~

当然多亏了下面的文章,感谢这些文章的作者~

http://www.linuxgraphics.cn/graphics/fb_intro.html

 

这几天又弄下分辨率的问题,显示器是1600*900是 好像设置不正确。。

http://blog.csdn.net/xufeicn/archive/2009/04/10/4062764.aspx

这篇文章也可以

 


 

FrameBuffer 是出现在 2.2.xx 内核当中的一种驱动程序接口。Linux 工作在保护模式下,所以用户态进程是无法象 DOS 那样使用显卡 BIOS 里提供的中断调用来实现直接写屏,Linux 抽象出 FrameBuffer 这个设备来供用户态进程实现直接写屏。Framebuffer 机制模仿显卡的功能,将显卡硬件结构抽象掉,可以通过 Framebuffer 的读写直接对显存进行操作。用户可以将 framebuffer 看成是显示内存的一个映像,将其映射到进程地址空间之后,就可以直接进行读写操作,而写操作可以立即反应在屏幕上。这种操作是抽象的,统一的。用户不必关心物理显存的位置、换页机制等等具体细节。这些都是由 framebuffer 设备驱动来完成的。

framebuffer 本身不具备任何运算数据的能力,就只好比是一个暂时存放水的水池.CPU 将运算后的结果放到这个水池,水池再将结果流到显示器.中间不会对数据做处理. 应用程序也可以直接读写这个水池的内容.在这种机制下,尽管 framebuffer 需要真正的显卡驱动的支持,但所有显示任务都有 CPU 完成,因此 CPU 负担很重.

帧缓冲驱动应用广泛,在 linux 的桌面系统中,X window 服务器就是利用帧缓 冲进行窗口的绘制。尤其是通过帧缓冲可显示汉字点阵,成为Linux 汉化的唯一可 行方案。

在开发者看来,FrameBuffer 本质上是一块显示缓存,往显示缓存中写入特定格 式的数据就意味着向屏幕输出内容。所以说 FrameBuffer 就是一块白板。例如 对于初始化为 16 位色的 FrameBuffer 来说, FrameBuffer 中的两个字节代表屏幕上一个点,从上到下,从左至右,屏幕位置与内存地址是 顺序的线性关系。

帧缓存可以在系统存储器(内存)的任意位置,视频控制器通过访问帧缓存来刷新 屏幕。 帧缓存也叫刷新缓存 Frame buffer 或 refresh buffer, 这里的帧(frame)是指整个屏幕范围。

帧缓存有个地址,是在内存里。我们通过不停的向 frame buffer 中写入数据, 显示控制器就自动的从 frame buffer 中取数据并显示出来。全部的图形都共享内 存中同一个帧缓存。

CPU 指定显示控制器工作,则显示控制器根据CPU的控制到指定的地方去取数据 和指令, 目前的数据一般是从显存里取, 如果显存里存不下,则从内存里取, 内存也放不下,则从硬盘里取,当然也不是内存放不下,而是为了节省内存的话, 可以放在硬盘里,然后通过 指令控制显示控制器去取。帧缓存 Frame Buffer 里面存储的东西是一帧一帧的, 显卡会不停的刷新 Frame Buffer, 这每一帧如 果不捕获的话, 则会被丢弃,也就是说是实时的。这每一帧不管是保存在内存 还是显存里, 都是一个显性的信息, 这每一帧假设是 800x600 的分辨率, 则保 存的是 800x600 个像素点,和颜色值。

如何启用 framebuffer

首先确认内核是否支持 framebuffer ,查看 /proc/fb 文件是否存在,存在则 说明支持,否则,说明不支持。其次查看 framebuffer 设备是否已激活,若 /dev/fbx 文件存在,则说明已经 激活;否则说明没有激活。

在系统启动时可通过向 kernel 传送 vga=mode-number 的参数来激活 FrameBuffer 设备,如 vga=0x314,将会启动 800*600*16bpp 模式 要 linux 缺省激活 framebuffer 设备,需要将/etc/grub.conf改成如下形式:

# grub.conf generated by anaconda## Note that you do not have to rerun grub after making changes to this file# NOTICE:   You do not have a /boot partition.   This means that#           all kernel and initrd paths are relative to /, eg.#           root (hd0,0)#           kernel /boot/vmlinuz-version ro root=/dev/sda1#           initrd /boot/initrd-version.img#boot=/dev/sdadefault=0timeout=10splashimage=(hd0,0)/boot/grub/splash.xpm.gztitle Red Hat Linux (2.4.18-14)         root (hd0,0)        kernel /boot/vmlinuz-2.4.18-14 ro root=LABEL=/ hdc=ide-scsi vga=0x314         initrd /boot/initrd-2.4.18-14.img
framebuffer 设备启用后,在重启系统时屏幕左上方会显示一个小企鹅。 哈哈~~~下面是我的图~~~小企鹅出现咯~~赞一个~~

image

不过,在上图有这样一个惊人的输出:Memory for crash kernel (0x0 to 0x0) notwithin permissible range !!!

刚开始把我给吓坏了,以为系统要完了,没想到还能正常的启动了~~只是速度慢了点,搜了下,没有大的问题~~~

https://bugzilla.redhat.com/show_bug.cgi?id=431584

 

下面是分辨率设置不正确的情况下,此时VGA=0X361,估计是超出了范围,没有出现小企鹅;而且启动后控制台的分辨率回到了800*640 囧~~

 

image

 

http://sys.firnow.com/linux/x8002010n08m/27s90182443.html

使用的RHEL5在console模式下,分辨率只有800*600,字体看起来很大,看得不清楚,一直想修改console的分辨率,网上绝大多数教程是说修改/etc/X11/xorg.conf文件,但是修改此文件影响的是X-window的分辨率,而非console模式。会对朋友们产生一定的误导,在此将我的解决方法记录如下,仅供需要的朋友参考 
在这里用到了内核里的framebuffer驱动来修改默认分辨率。 
如果你的内核是支持 framebuffer 驱动的,可以跳过Step1,直接看Step2 
Step1 编译内核,添加framebuffer驱动。 
在此,重点说一下编译时要选中的项,以加入framebuffer驱动支持 
VGA text console 
Video mode selection support 
Support for frame buffer devices (EXPERIMENTAL) 
VESA VGA graphics console 
Advanced low level driver options 
<*> 8 bpp packed pixels support 
<*> 16 bpp packed pixels support 
<*> 24 bpp packed pixels support 
<*> 32 bpp packed pixels support 
<*> VGA characters/attributes support 
Select compiled-in fonts 
VGA 8x8 font 
VGA 8x16 font 
我们还要知道自己所用的显示卡,也有 framebuffer的驱动,所以也要一并选中,比如 
<*> nVidia Framebuffer Support  
<*> ATI Radeon display support 
编译完成后,你的内核就支持framebuffer驱动了 
Step2 
选择你需要的分辨率 
# Normal VGA console 
# vga = normal 
# VESA framebuffer console @ 1024x768x64k 
# vga=791 
# VESA framebuffer console @ 1024x768x32k 
# vga=790 
# VESA framebuffer console @ 1024x768x256 
# vga=773 
# VESA framebuffer console @ 800x600x64k 
# vga=788 
# VESA framebuffer console @ 800x600x32k 
# vga=787 
# VESA framebuffer console @ 800x600x256 
# vga=771 
# VESA framebuffer console @ 640x480x64k 
# vga=785 
# VESA framebuffer console @ 640x480x32k 
# vga=784 
# VESA framebuffer console @ 640x480x256 
# vga=769 
在此我选了第一个1024x768 64k色,并记住对应的vga的值为791 
Step3 
修改grub,在启动时向内核传递分辨率参数 
以我的电脑为例,默认的grub.conf文件为 
default=0 
timeout=5 
splashimage=(hd0,7)/boot/grub/splash.xpm.gz 
#hiddenmenu 
title Red Hat Linux5 (2.6.26.5) 
        root (hd0,2) 
        kernel /boot/vmlinuz-2.6.26.5 ro root=LABEL=/ rhgb quiet   
        initrd /boot/initrd-2.6.26.5.img 
title WinXp 
        rootnoverify (hd0,0) 
        chainloader +1 
然后添加内核参数vga=791 到grub.conf文件,告知内核以1024x768,64k色开启console,修改后如下 
default=0 
timeout=5 
splashimage=(hd0,7)/boot/grub/splash.xpm.gz 
#hiddenmenu 
title Red Hat Linux5 (2.6.26.5) 
        root (hd0,2) 
        kernel /boot/vmlinuz-2.6.26.5 vga=791 ro root=LABEL=/ rhgb quiet   
        initrd /boot/initrd-2.6.26.5.img 
title WinXp 
        rootnoverify (hd0,0) 
        chainloader +1 
保存后重启系统 ,选择进入linux,则系统会以1024x768的分辨率进入console

http://www.linuxdiyf.com/viewarticle.php?id=138434

http://www.oklinux.cn/html/Basic/azpz/20070626/30563.html

http://blog.csdn.net/xufeicn/archive/2009/04/10/4062764.aspx

 

 

好晚了~睡觉~~~晚安~~