config_fb_vesa不设置,不能启动radeon模块的原因分析

/* Allocate and load the module: note that size of section 0 is always
   zero, and we rely on this for optional sections. */
static int load_module(struct load_info *info, const char __user *uargs,
               int flags)
{
    struct module *mod;
    long err;
    char *after_dashes;

    err = module_sig_check(info);
    if (err)
        goto free_copy;

    err = elf_header_check(info);
    if (err)
        goto free_copy;

    /* Figure out module layout, and allocate all the memory. */
    mod = layout_and_allocate(info, flags);
    if (IS_ERR(mod)) {
        err = PTR_ERR(mod);
        goto free_copy;
    }

    /* Reserve our place in the list. */
    err = add_unformed_module(mod);
    if (err)
        goto free_module;

#ifdef CONFIG_MODULE_SIG
    mod->sig_ok = info->sig_ok;
    if (!mod->sig_ok) {
        pr_notice_once("%s: module verification failed: signature "
                   "and/or  required key missing - tainting "
                   "kernel\n", mod->name);
        add_taint_module(mod, TAINT_UNSIGNED_MODULE, LOCKDEP_STILL_OK);
    }
#endif

    /* To avoid stressing percpu allocator, do this once we're unique. */
    err = percpu_modalloc(mod, info);
    if (err)
        goto unlink_mod;

    /* Now module is in final location, initialize linked lists, etc. */
    err = module_unload_init(mod);
    if (err)
        goto unlink_mod;

    /* Now we've got everything in the final locations, we can
     * find optional sections. */
    err = find_module_sections(mod, info);
    if (err)
        goto free_unload;

    err = check_module_license_and_versions(mod);
    if (err)
        goto free_unload;

    /* Set up MODINFO_ATTR fields */
    setup_modinfo(mod, info);

    /* Fix up syms, so that st_value is a pointer to location. */
    err = simplify_symbols(mod, info);
    if (err < 0)
        goto free_modinfo;




/* Change all symbols so that st_value encodes the pointer directly. */
static int simplify_symbols(struct module *mod, const struct load_info *info)
{
    Elf_Shdr *symsec = &info->sechdrs[info->index.sym];
    Elf_Sym *sym = (void *)symsec->sh_addr;
    unsigned long secbase;
    unsigned int i;
    int ret = 0;
    const struct kernel_symbol *ksym;

    for (i = 1; i < symsec->sh_size / sizeof(Elf_Sym); i++) {
        const char *name = info->strtab + sym[i].st_name;

        switch (sym[i].st_shndx) {
        case SHN_COMMON:
            /* Ignore common symbols */
            if (!strncmp(name, "__gnu_lto", 9))
                break;

            /* We compiled with -fno-common.  These are not
               supposed to happen.  */
            pr_debug("Common symbol: %s\n", name);
            printk("%s: please compile with -fno-common\n",
                   mod->name);
            ret = -ENOEXEC;
            break;

        case SHN_ABS:
            /* Don't need to do anything */
            pr_debug("Absolute symbol: 0x%08lx\n",
                   (long)sym[i].st_value);
            break;

        case SHN_UNDEF:
            ksym = resolve_symbol_wait(mod, info, name);
            /* Ok if resolved.  */
            if (ksym && !IS_ERR(ksym)) {
                sym[i].st_value = ksym->value;
                break;
            }

            /* Ok if weak.  */
            if (!ksym && ELF_ST_BIND(sym[i].st_info) == STB_WEAK)
                break;

            pr_warn("%s: Unknown symbol %s (err %li)\n",
                mod->name, name, PTR_ERR(ksym));

            ret = PTR_ERR(ksym) ?: -ENOENT;
            break;

        default:
            /* Divert to percpu allocation if a percpu var. */
            if (sym[i].st_shndx == info->index.pcpu)
                secbase = (unsigned long)mod_percpu(mod);
            else
                secbase = info->sechdrs[sym[i].st_shndx].sh_addr;
            sym[i].st_value += secbase;
            break;
        }
    }

    return ret;
}


 pr_warn("%s: Unknown symbol %s (err %li)\n",
                mod->name, name, PTR_ERR(ksym));


grep -rn "Unknown symbol" ./*
./arch/arm/kernel/unwind.c:160:        pr_warn("unwind: Unknown symbol address %08lx\n", addr);
./arch/mips/kernel/module.c:221:            printk(KERN_WARNING "%s: Unknown symbol %s\n",
./arch/mips/kernel/module-rela.c:132:            printk(KERN_WARNING "%s: Unknown symbol %s\n",
./arch/parisc/kernel/module.c:572:            printk(KERN_WARNING "%s: Unknown symbol %s\n",
./arch/parisc/kernel/module.c:708:            printk(KERN_WARNING "%s: Unknown symbol %s\n",
匹配到二进制文件 ./arch/x86/boot/compressed/vmlinux.bin
./kernel/module.c:1981:            pr_warn("%s: Unknown symbol %s (err %li)\n",
匹配到二进制文件 ./kernel/module.o
匹配到二进制文件 ./kernel/built-in.o
./scripts/kconfig/symbol.c:868: * name to be expanded shall be prefixed by a '$'. Unknown symbol expands to
匹配到二进制文件 ./vmlinux
匹配到二进制文件 ./vmlinux.o

[   21.511318] radeon: Unknown symbol cfb_copyarea (err 0)
[   21.522742] radeon: Unknown symbol cfb_imageblit (err 0)
[   21.522941] radeon: Unknown symbol cfb_fillrect (err 0)



objdump -t vesafb.o >vesafbot.txt

vesafb.o:     文件格式 elf32-i386

SYMBOL TABLE:
00000000 l    df *ABS*    00000000 vesafb.c
00000000 l    d  .text    00000000 .text
00000000 l    d  .data    00000000 .data
00000000 l    d  .bss    00000000 .bss
00000000 l     F .text    0000003a vesafb_pan_display
0000000c l     O .data..read_mostly    00000004 pmi_start
00000000 l    d  .init.text    00000000 .init.text
00000000 l     F .init.text    00000011 vesafb_driver_init
00000000 l     O .data    00000058 vesafb_driver
00000040 l     F .text    0000001a vesafb_remove
00000060 l     F .text    00000039 vesafb_destroy
00000000 l    d  .exit.text    00000000 .exit.text
00000000 l     F .exit.text    0000000f vesafb_driver_exit
000000a0 l     F .text    000001b1 vesafb_setcolreg
00000000 l     O .data..read_mostly    00000004 vga_compat
00000004 l     O .data..read_mostly    00000004 depth
00000014 l     O .data..read_mostly    00000004 pmi_setpal
00000008 l     O .data..read_mostly    00000004 pmi_pal
00000000 l    d  .rodata.str1.1    00000000 .rodata.str1.1
00000000 l    d  .rodata.str1.4    00000000 .rodata.str1.4
00000260 l     F .text    00000952 vesafb_probe
0000001c l     O .data..read_mostly    00000004 inverse
000000c0 l     O .data    00000044 vesafb_fix
00000120 l     O .data    000000a0 vesafb_defined
00000000 l     O .bss    00000004 vram_total
00000004 l     O .bss    00000004 vram_remap
00000010 l     O .data..read_mostly    00000004 ypan
00000018 l     O .data..read_mostly    00000004 mtrr
00000060 l     O .data    00000060 vesafb_ops
00000000 l     O .rodata    0000000c CSWTCH.197
00000000 l    d  .rodata    00000000 .rodata
00000000 l    d  .exitcall.exit    00000000 .exitcall.exit
00000000 l     O .exitcall.exit    00000004 __exitcall_vesafb_driver_exit
00000000 l    d  .initcall6.init    00000000 .initcall6.init
00000000 l     O .initcall6.init    00000004 __initcall_vesafb_driver_init6
00000000 l    d  .data..read_mostly    00000000 .data..read_mostly
00000000 l    d  .note.GNU-stack    00000000 .note.GNU-stack
00000000 l    d  .comment    00000000 .comment
00000000         *UND*    00000000 __platform_driver_register
00000000         *UND*    00000000 unregister_framebuffer
00000000         *UND*    00000000 framebuffer_release
00000000         *UND*    00000000 fb_dealloc_cmap
00000000         *UND*    00000000 iounmap
00000000         *UND*    00000000 iomem_resource
00000000         *UND*    00000000 __release_region
00000000         *UND*    00000000 platform_driver_unregister
00000000         *UND*    00000000 native_io_delay
00000000         *UND*    00000000 fb_get_options
00000000         *UND*    00000000 strsep
00000000         *UND*    00000000 strcmp
00000000         *UND*    00000000 screen_info
00000000         *UND*    00000000 __request_region
00000000         *UND*    00000000 framebuffer_alloc
00000000         *UND*    00000000 kmalloc_caches
00000000         *UND*    00000000 kmem_cache_alloc
00000000         *UND*    00000000 printk
00000000         *UND*    00000000 ioport_resource
00000000         *UND*    00000000 ioremap_wc
00000000         *UND*    00000000 fb_alloc_cmap
00000000         *UND*    00000000 register_framebuffer
00000000         *UND*    00000000 strncmp
00000000         *UND*    00000000 simple_strtoul
00000000         *UND*    00000000 ioremap_cache
00000000         *UND*    00000000 mtrr_add
00000000         *UND*    00000000 ioremap_nocache
00000000         *UND*    00000000 cfb_fillrect
00000000         *UND*    00000000 cfb_copyarea
00000000         *UND*    00000000 cfb_imageblit

### 回答1: vesa_monitor_timign是一种用于指定激活显示器分辨率和刷新率的命令,它由VESA(Video Electronics Standards Association)开发并引入。VESA作为一个行业标准组织,制定了许多视频和显示设备相关的标准。 在计算机领域,vesa_monitor_timign常用于Linux和其他操作系统中的显卡驱动程序,用于确保显示器以正确的分辨率和刷新率工作。通过使用vesa_monitor_timing,用户可以手动指定显示器应该使用的分辨率和刷新率,以满足其需求。 vesa_monitor_timign的语法和用法因操作系统和显卡驱动程序而异。通常,用户需要知道显示器的支持分辨率和刷新率,并使用合适的命令和参数进行设置。例如,可以使用vesa_monitor_timign命令将显示器的分辨率设置为1920x1080,并将刷新率设置为60Hz。 vesa_monitor_timign具有一定的局限性。如果指定的分辨率和刷新率不被显示器支持,可能导致显示器无法正常工作或显示图像不清晰。因此,用户在使用vesa_monitor_timign时需要谨慎,最好根据显示器的技术规格和制造商提供的信息来选择合适的分辨率和刷新率。 总之,vesa_monitor_timign是一种用于指定显示器分辨率和刷新率的命令,可以在一些操作系统中的显卡驱动程序中使用。它允许用户手动设置显示器的工作参数,但需要注意选择合适的参数,以确保显示器正常工作并提供清晰的图像。 ### 回答2: VESA_monitor_timig(VESA显示器定时)是一个应用程序,它定义了一组标准的显示器分辨率、刷新率和屏幕刷新参数。 VESA(Video Electronics Standards Association)是一个专门制定显示器标准的组织,他们制定了VESA_monitor_timing作为一种标准来确保显示器的兼容性和稳定性。 通过VESA_monitor_timing,我们可以在不同的计算机系统和显示器之间实现兼容性,并且确保显示器可以正确地显示和处理图像和视频内容。 VESA_monitor_timing定义了一系列不同的显示器分辨率,包括常见的720p、1080p和4K等。根据分辨率的不同,还定义了相应的刷新率和屏幕刷新参数。这些参数包括水平和垂直的总行数、水平和垂直同步脉冲的宽度等。 通过使用VESA_monitor_timing,计算机可以自动识别和适应连接到显示器的不同分辨率和刷新率的设备,并调整显示器的设置以达到最佳的图像和视频效果。 值得注意的是,VESA_monitor_timing只是一种标准,具体的显示器还需要根据这一标准来实现并支持相应的分辨率和刷新率。而计算机系统也需要支持相应的VESA_monitor_timing标准才能对连接的显示器进行适配和控制。 总之,VESA_monitor_timing是一个重要的标准,它确保了计算机系统与显示器之间的兼容性,并且提供了最佳的图像和视频显示效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值