设为首页
收藏本站
用户名
Email
自动登录
找回密码
密码
登录
注册
快捷导航
平台
Portal
论坛
BBS
文库
项目
群组
Group
我的博客
Space
搜索
搜索
热搜:
shell
linux
mysql
本版
用户
LinuxSir.cn,穿越时空的Linuxsir!
»
论坛
›
编程开发讨论区 —— LinuxSir.cn
›
内核与驱动开发
›
GRUB的splashimage补丁分析
返回列表
查看:
1488
|
回复:
0
GRUB的splashimage补丁分析
[复制链接]
tbfly
tbfly
当前离线
积分
76
IP卡
狗仔卡
发表于 2008-10-3 00:16:10
|
显示全部楼层
|
阅读模式
GRUB的splashimage补丁分析(For linuxsir.cn version)
By tbfly
tombowfly@gmail.com
链接附件是我对“ GRUB 源代码分析”帖子的合集:
http://blogimg.chinaunix.net/blog/upfile2/081003000156.pdf
由于前面网友已经分析了GRUB的其它方面。本着不重复发明轮子的精神,本文主要分析splash补丁部分的代码。
不可避免的要参考经典链接:
http://ruslug.rutgers.edu/~mcgrof/grub-images/
其中splashimage指令的用法如下:
splashimage (hd0,0)/grub/images/debian_cooleye-dither.xpm.gz
指定splash image的路径及名称。
链接中详述了splashimage补丁的历史。大意是:Paulo César Pereira de Andrade最先写了这个补丁,给GRUB增加功能。但GRUB的上游代码维护者,不同意将splashimage patch加入到上游代码中。
所以,至今GRUB的代码中,关于splashimage的代码也默认不在其中。这个patch由各家发行版维护。
最早的发行版维护版本大概是:
http://ruslug.rutgers.edu/~mcgro ... 0.93-graphics.patch
本文基于的源码:grub4dos-0.4.4-2008-08-08,其中包含了spashimage补丁。对比了一下,也是基于上面链接的补丁发展而来。
这个patch主要在stage2目录增加了graphics.c文件。并在stage2/asm.S、stage2/builtins.c
等文件中添加graphics模式支持。
对menu.lst中的splashimage指令,解析的函数是:
builtin数据结构中的函数指针:splashimage_func。
splashimage_func先根据menu.list中的配置,读取splash图像的名字。
再通过asm.S中的set_videomode函数,设置视频显示模式。代码中默认,set_videomode函数中的AH=0,AL=0x12(640x480 16色图形EGA)。
再根据splash图像的名称,并解析XPM格式,读取splash图像内容和调试板。通过asm.S中的graphics_set_palette函数设置显示所用的调色板。
读取的图像内容先存放在物理地址:0x3A0000、0x3A9600、0x3B2C00和0x3BC200处,分别存放4字节中的低字节到高字节。
因为显示模式设置为:640x480 16bit,而VGA16显示模式,最小单元为8x16,所以可以显示的所有字符为80x30(HxW)。而图形为16色,所以图形所占空间大小为:80x30x16 = 38400 byte(即0x9600)。
显示的内存物理位置VIDEOMEM为:0xA0000。
最后,通过函数grub_memcpy把图像内容显示出来。
再通过asm.S中的graphics_get_font,显示8x16大小的字符。从而显示mean.lst中各启动选项。
光标选项的移动显示由graphics_cursor、graphics_setxy、graphics_scroll等函数实现。
上面一段,分析了splashimage的实现。该实现比较底层,目前限于VGA-16bit模式,基于framebuffer的splashimage实现目前还没看到。
splashimage是GRUB运行时,图形化的补丁。
实际上,Linux内核加载过程中,支持图形化显示的程序还很不少。其实现在Linux下有多种实现方式。总的可以分成两种:内核态与用户态。
内核态的实现方式:bootsplash,SLED就是采用这个方法。需要给内核打patch,用传统的__setup来处理内核参数splash等。Gentoo用uvesafb支持,打fbcondecor补丁支持fbsplash。
用户态的实现方式:usplash、splashy等。Ubuntu就采用这种方法,无需修改内核。用解析/proc/cmdline的方法处理内核参数splash等。Debian支持usplash也支持splashy。
参考链接:
http://ruslug.rutgers.edu/~mcgrof/grub-images/
http://splashy.alioth.debian.org/wiki/
http://fbsplash.berlios.de/wiki/doku.php
http://packages.qa.debian.org/u/usplash.html
https://launchpad.net/ubuntu/+source/usplash
http://grub.enbug.org/VideoSubsystem
TODO
回复
使用道具
举报
提升卡
置顶卡
沉默卡
喧嚣卡
变色卡
显身卡
返回列表
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
注册
本版积分规则
发表回复
回帖后跳转到最后一页
Copyright © 2002-2023
LinuxSir.cn
(http://www.linuxsir.cn/) 版权所有 All Rights Reserved.
Powered by
RedflagLinux!
技术支持:
中科红旗
|
京ICP备19024520号
快速回复
返回顶部
返回列表