linux 显示logo的过程

简介: 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,那么开机会显示四只可爱的小企鹅:

完。

相关文章
|
6月前
|
存储 Linux Android开发
RK3568 Android/Linux 系统动态更换 U-Boot/Kernel Logo
RK3568 Android/Linux 系统动态更换 U-Boot/Kernel Logo
868 0
|
Linux 区块链 C语言
Linux嵌入式开发——uboot添加logo显示功能
Linux嵌入式开发——uboot添加logo显示功能
369 0
Linux嵌入式开发——uboot添加logo显示功能
|
Linux
oeasy教您玩转linux010203显示logo
oeasy教您玩转linux010203显示logo
248 0
|
Linux
linux内核中默认logo的具体位置
/driver/logo/... 以下这个目录下对应的是logo的设置
937 0
|
10天前
|
监控 Linux
如何检查 Linux 内存使用量是否耗尽?这 5 个命令堪称绝了!
本文介绍了在Linux系统中检查内存使用情况的5个常用命令:`free`、`top`、`vmstat`、`pidstat` 和 `/proc/meminfo` 文件,帮助用户准确监控内存状态,确保系统稳定运行。
88 6
|
11天前
|
Linux
在 Linux 系统中,“cd”命令用于切换当前工作目录
在 Linux 系统中,“cd”命令用于切换当前工作目录。本文详细介绍了“cd”命令的基本用法和常见技巧,包括使用“.”、“..”、“~”、绝对路径和相对路径,以及快速切换到上一次工作目录等。此外,还探讨了高级技巧,如使用通配符、结合其他命令、在脚本中使用,以及实际应用案例,帮助读者提高工作效率。
47 3
|
11天前
|
监控 安全 Linux
在 Linux 系统中,网络管理是重要任务。本文介绍了常用的网络命令及其适用场景
在 Linux 系统中,网络管理是重要任务。本文介绍了常用的网络命令及其适用场景,包括 ping(测试连通性)、traceroute(跟踪路由路径)、netstat(显示网络连接信息)、nmap(网络扫描)、ifconfig 和 ip(网络接口配置)。掌握这些命令有助于高效诊断和解决网络问题,保障网络稳定运行。
36 2
|
18天前
|
缓存 监控 Linux
|
5天前
|
运维 监控 网络协议
运维工程师日常工作中最常用的20个Linux命令,涵盖文件操作、目录管理、权限设置、系统监控等方面
本文介绍了运维工程师日常工作中最常用的20个Linux命令,涵盖文件操作、目录管理、权限设置、系统监控等方面,旨在帮助读者提高工作效率。从基本的文件查看与编辑,到高级的网络配置与安全管理,这些命令是运维工作中的必备工具。
32 3
下一篇
无影云桌面