linux 显示logo的过程

Linux显示开机logo的函数调用:

 1 register_framebuffer
 2     ---> do_register_framebuffer
 3             ---> fb_notifier_call_chain,传递参数FB_EVENT_FB_REGISTERED和还有fb_info的event结构
 4                     ---> blocking_notifier_call_chain
 5                             ---> __blocking_notifier_call_chain
 6                                     ---> notifier_call_chain
 7
 8 --> fbcon_event_notify
 9         ---> fbcon_fb_registered
10                 ---> do_fbcon_takeover
11                         ---> do_take_over_console
12                                 ---> do_bind_con_driver
13                                         ---> visual_init
14                                                 ---> fbcon_init
15                                                         ---> fbcon_prepare_logo
16                                                                 ---> fb_prepare_logo
17                                                                         ---> fb_find_logo
18                                         ---> update_screen
19                                                 ---> redraw_screen
20                                                         ---> fbcon_switch
21                                                                 ---> fb_show_logo
22                                                                         ---> fb_show_logo_line
23                                                                                 ---> fb_do_show_logo

获取logo:

其中获取logo数据是在fb_find_logo中完成的:

/* logo‘s are marked __initdata. Use __ref to tell
 * modpost that it is intended that this function uses data
 * marked __initdata.
 */
const struct linux_logo * __ref fb_find_logo(int depth)
{
    const struct linux_logo *logo = NULL;

    if (nologo || logos_freed)
        return NULL;

    if (depth >= 1) {
#ifdef CONFIG_LOGO_LINUX_MONO
        /* Generic Linux logo */
        logo = &logo_linux_mono;
#endif
#ifdef CONFIG_LOGO_SUPERH_MONO
        /* SuperH Linux logo */
        logo = &logo_superh_mono;
#endif
    }

    if (depth >= 4) {
#ifdef CONFIG_LOGO_LINUX_VGA16
        /* Generic Linux logo */
        logo = &logo_linux_vga16;
#endif
#ifdef CONFIG_LOGO_BLACKFIN_VGA16
        /* Blackfin processor logo */
        logo = &logo_blackfin_vga16;
#endif
#ifdef CONFIG_LOGO_SUPERH_VGA16
        /* SuperH Linux logo */
        logo = &logo_superh_vga16;
#endif
    }

    if (depth >= 8) {
#ifdef CONFIG_LOGO_LINUX_CLUT224
        /* Generic Linux logo */
        logo = &logo_linux_clut224;
#endif
#ifdef CONFIG_LOGO_BLACKFIN_CLUT224
        /* Blackfin Linux logo */
        logo = &logo_blackfin_clut224;
#endif
#ifdef CONFIG_LOGO_DEC_CLUT224
        /* DEC Linux logo on MIPS/MIPS64 or ALPHA */
        logo = &logo_dec_clut224;
#endif
#ifdef CONFIG_LOGO_MAC_CLUT224
        /* Macintosh Linux logo on m68k */
        if (MACH_IS_MAC)
            logo = &logo_mac_clut224;
#endif
#ifdef CONFIG_LOGO_PARISC_CLUT224
        /* PA-RISC Linux logo */
        logo = &logo_parisc_clut224;
#endif
#ifdef CONFIG_LOGO_SGI_CLUT224
        /* SGI Linux logo on MIPS/MIPS64 */
        logo = &logo_sgi_clut224;
#endif
#ifdef CONFIG_LOGO_SUN_CLUT224
        /* Sun Linux logo */
        logo = &logo_sun_clut224;
#endif
#ifdef CONFIG_LOGO_SUPERH_CLUT224
        /* SuperH Linux logo */
        logo = &logo_superh_clut224;
#endif
#ifdef CONFIG_LOGO_M32R_CLUT224
        /* M32R Linux logo */
        logo = &logo_m32r_clut224;
#endif
    }
    return logo;
}

以logo_linux_clut224为例,它是内核根据drivers/video/logo/logo_linux_clut224.ppm生成的(具体参考drivers/video/logo/Makefile),首先内核使用scripts/pnmtologo对logo_linux_clut224.ppm进行处理,生成名为logo_linux_clut224.c,其中含有上面的结构:

/*
 *  DO NOT EDIT THIS FILE!
 *
 *  It was automatically generated from drivers/video/logo/logo_linux_clut224.ppm
 *
 *  Linux logo logo_linux_clut224
 */

#include <linux/linux_logo.h>

static unsigned char logo_linux_clut224_data[] __initdata = {
        0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
        ... ...
};

const struct linux_logo logo_linux_clut224 __initconst = {
        .type           = LINUX_LOGO_CLUT224,
        .width          = 80,
        .height         = 80,
        .clutsize       = 187,
        .clut           = logo_linux_clut224_clut,
        .data           = logo_linux_clut224_data
};

显示logo是在fb_show_logo_line中完成的:

int fb_show_logo(struct fb_info *info, int rotate)
{
    int y;

    y = fb_show_logo_line(info, rotate, fb_logo.logo, 0,
                  num_online_cpus());
    y = fb_show_extra_logos(info, y, rotate);

    return y;
}

上面在调用fb_show_logo_line时传入的最后一个参数表示连续输出几份logo,可以看到这里传入的是num_online_cpus(),即获取当前处于online的cpu的个数,所以如果是4核的cpu,那么开机会显示四只可爱的小企鹅:

完。

原文地址:https://www.cnblogs.com/pengdonglin137/p/12179500.html

时间: 2024-08-04 13:54:20

linux 显示logo的过程的相关文章

linux手动安装sbt过程

ubuntu14 手动安装sbt 参见官网配置说明http://www.scala-sbt.org/release/tutorial/Manual-Installation.html 1.下载sbt通用平台压缩包:sbt-0.13.5.tgz http://www.scala-sbt.org/download.html 2.建立目录,解压文件到所建立目录 $ sudo mkdir /opt/scala/sbt $ sudo tar zxvf sbt-0.13.5.tgz -C /opt/scal

minicom在虚拟机(linux)安装配置过程

1. minicom需要ncurses库的支持,否则安装会有问题. A. 下载ncurses.我选择是ncurses-5.6.tar.gz 下载地址:http://directory.fsf.org/project/ncurses/ B. 解压缩到/opt/ncurses目录下.# tar zxvf ncurses-5.5.tar.gz –C /opt/ncurses C. 到ncurses目录下,配置编译ncurses. 源码安装的三个步骤(configure.make.make instal

linux 中断机制的处理过程

一.中断的概念 中断是指在CPU正常运行期间,由于内外部事件或由程序预先安排的事件引起的CPU暂时停止正在运行的程序,转而为该内部或外部事件或预先安排的事件服务的程序中去,服务完毕后再返回去继续运行被暂时中断的程序.Linux中通常分为外部中断(又叫硬件中断)和内部中断(又叫异常). 在实地址模式中,CPU把内存中从0开始的1KB空间作为一个中断向量表.表中的每一项占4个字节.但是在保护模式中,有这4个字节的表项构成的中断向量表不满足实际需求,于是根据反映模式切换的信息和偏移量的足够使得中断向量

Linux系统管理09——引导过程与服务控制

Linux系统管理09--引导过程与服务控制 一.引导过程总览 1.init进程 ·由linux内核加载运行/sbin/init程序 ·是系统中的第一个进程,所有进程的父进程 ·PID(进程标记)号永远为1 2.Upstart启动方式 初始化配置分散存放,响应不同的启动事件 参数 说明 /etc/inittab 配置默认运行级别 /etc/sysconfig/init 控制tty终端的开启数量.终端颜色方案 /etc/init/rcS.conf 加载rc.sysinit脚本,完成系统初始化任务

linux教程——1.启动过程

Linux 系统启动过程 linux启动时我们会看到许多启动信息. Linux系统的启动过程并不是大家想象中的那么复杂,其过程可以分为5个阶段: 内核的引导. 运行init. 系统初始化. 建立终端 . 用户登录系统. 内核引导 当计算机打开电源后,首先是BIOS开机自检,按照BIOS中设置的启动设备(通常是硬盘)来启动. 操作系统接管硬件以后,首先读入 /boot 目录下的内核文件. 运行init init 进程是系统所有进程的起点,你可以把它比拟成系统所有进程的老祖宗,没有这个进程,系统中任

从U-Boot显示Logo到Android

/******************************************************************************* * 从U-Boot显示Logo到Android * 说明: * 从U-Boot一直显示Logo到Android桌面显示. * * 2017-9-27 深圳 龙华樟坑村 曾剑锋 *******************************************************************************/

Linux 系统的启动过程

阅读目录 Linux 系统启动过程 内核的引导 运行init 运行级别 系统初始化 建立终端 用户登录系统 图像模式与文字模式的切换 Linux的关机 当我们在启动Linux操作系统时,会显示出硬件自检以及很多的启动信息,包括启动失败的我们都一目了然! 在Centos 5.x版本上是可以完全可以看见硬件自检以及启动信息的 在Centos 6.x版本上只显示进度条,只需要按F4 或者 root用户修改 /boot/grub/grub.conf 文件 vim /boot/grub/grub.conf

mipi屏在内核可以显示logo但是u-boot无法显示的问题

平台:瑞芯的rk3288 u-boot版本:u-boot-2014.10 kernel版本:3.10 mipi屏型号:LQ079L1SX01 作者:fulinux *****本文允许转载,不过请注明出处:http://blog.csdn.net/fulinus**** 问题: 使用的mipi屏可以在内核中显示logo,但是kernel可以显示. 分析: 内核可以正常使用,那说明硬件没有问题,内核和u-boot使用的是同一个dts文件描述的设备树,所以dts文件中的信息应该也是没有问题的.那很可能

Linux开机加载过程

目录 1 开机加载简介 2 常规加载流程 2.1 加载BIOS 2.2 读取MBR 2.3 boot loader 2.4 加载内核 2.5 init依据inittab文件来设定运行等级 2.6 init进程执行rc.sysinit 2.7 启动内核模块 2.8 执行不同运行级别的脚本程序 2.9 执行/etc/rc.d/rc.local 2.10 执行/bin/login程序,进入登录状态 3 环境变量加载 3.1 加载顺序说明 开机加载简介 开机过程指的是从打开计算机电源直到LINUX显示用