免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1291 | 回复: 0
打印 上一主题 下一主题

framebuffer的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-05-22 15:32 |只看该作者 |倒序浏览
芯片:TCC7901(ARM926T)
厂商提供的BSP kernel-2.6.24进行移植
在DEMOBOARD上用的是480×272的屏,直接烧写BSP的DEMO目标文件显示一切正常,BOOTLOARD也起来了,现在用自己的板子 ,屏是800×480的,我已经将BOOTLOARD移植好了,跑DEMOKERNEL,也起来了,没有爆,只是小企鹅的LOGO在屏幕左上方480*272的地方显示,现在我在头文件中修改#define使之变为800×480的,内核爆了,我查了一下原因,是虚拟内存的问题,我将出错代码贴出来,PRINTK部分也贴出来,希望大家帮着看看,谢谢
//出错程序源代码
static struct vm_region *
vm_region_alloc(struct vm_region *head, size_t size, gfp_t gfp)
{
        unsigned long addr = head->vm_start, end = head->vm_end - size;
        printk("addr = %ld, end = %ld, size = %d,vm_end = %ld\n",addr,end,size,head->vm_end);

        unsigned long flags;
        struct vm_region *c, *new;
    printk("vm_start = %ld\n",c->vm_start);
        new = kmalloc(sizeof(struct vm_region), gfp);
        if (!new){
                printk("kmalloc null\n");
                goto out;
                }
        spin_lock_irqsave(&consistent_lock, flags);

        list_for_each_entry(c, &head->vm_list, vm_list) {
                printk("addr = %ld,end = %ld,size = %ld,c->vm_start = %ld,c->vm_end = %ld\n",addr,end,size,c->vm_start,c->vm_end);
                if ((addr + size) < addr){
                        printk("(addr + size) < addr\n");
                        goto nospc;
                        }
                if ((addr + size) <= c->vm_start){
                        printk("(addr + size) <= c->vm_start\n");
                        goto found;
                        }
                addr = c->vm_end;
//程序进入了这里
                if (addr > end){
                        printk("addr is c->vm_end = %ld,end = %ld\n",c->vm_end,end);
                        printk("addr > end\n");
                        goto nospc;
                        }
        }

found:
        /*
         * Insert this entry _before_ the one we found.
         */
        list_add_tail(&new->vm_list, &c->vm_list);
        new->vm_start = addr;
        new->vm_end = addr + size;
        new->vm_active = 1;

        spin_unlock_irqrestore(&consistent_lock, flags);
        return new;

nospc:
        spin_unlock_irqrestore(&consistent_lock, flags);
        kfree(new);
out:
        return NULL;
}

//串口的输出打印
addr = -4194304, end = -2101248, size = 4096,vm_end = -2097152
vm_start = 0
Malloc DMA buffer @0xFFC00000(Phy=0x228B9000), size:2048
addr = -4194304, end = -2101248, size = 4096,vm_end = -2097152
vm_start = 0
2 addr = -4194304,end = -2101248,size = 4096,c->vm_start = -4194304,c->vm_end = -4190208
Malloc DMA buffer @0xFFC01000(Phy=0x22898000), size:2048
[SPI] probe  ^^ [tcc79x_spi_probe:326]
addr = -4194304, end = -2101248, size = 4096,vm_end = -2097152
vm_start = 0
2 addr = -4194304,end = -2101248,size = 4096,c->vm_start = -4194304,c->vm_end = -4190208
2 addr = -4190208,end = -2101248,size = 4096,c->vm_start = -4190208,c->vm_end = -4186112
Malloc DMA buffer @0xFFC02000(Phy=0x22899000), size:2048
addr = -4194304, end = -2101248, size = 4096,vm_end = -2097152
vm_start = 0
2 addr = -4194304,end = -2101248,size = 4096,c->vm_start = -4194304,c->vm_end = -4190208
2 addr = -4190208,end = -2101248,size = 4096,c->vm_start = -4190208,c->vm_end = -4186112
2 addr = -4186112,end = -2101248,size = 4096,c->vm_start = -4186112,c->vm_end = -4182016
Malloc DMA buffer @0xFFC03000(Phy=0x228BA000), size:2048
the width is 800
the height is 480
the depth lenght is 32
map_size = 1540096
addr = -4194304, end = -3637248, size = 1540096,vm_end = -2097152
vm_start = 0
2 addr = -4194304,end = -3637248,size = 1540096,c->vm_start = -4194304,c->vm_end = -4190208
2 addr = -4190208,end = -3637248,size = 1540096,c->vm_start = -4190208,c->vm_end = -4186112
2 addr = -4186112,end = -3637248,size = 1540096,c->vm_start = -4186112,c->vm_end = -4182016
2 addr = -4182016,end = -3637248,size = 1540096,c->vm_start = -4182016,c->vm_end = -4177920
map_size = 1536000
fb0: tccfb frame buffer device
the width is 800
the height is 480
the depth lenght is 32
map_size = 1540096
addr = -4194304, end = -3637248, size = 1540096,vm_end = -2097152
vm_start = 0
2 addr = -4194304,end = -3637248,size = 1540096,c->vm_start = -4194304,c->vm_end = -4190208
2 addr = -4190208,end = -3637248,size = 1540096,c->vm_start = -4190208,c->vm_end = -4186112
2 addr = -4186112,end = -3637248,size = 1540096,c->vm_start = -4186112,c->vm_end = -4182016
2 addr = -4182016,end = -3637248,size = 1540096,c->vm_start = -4182016,c->vm_end = -4177920
2 addr = -4177920,end = -3637248,size = 1540096,c->vm_start = -4177920,c->vm_end = -2637824
addr is c->vm_end = -2637824,end = -3637248
addr > end
map_cpu = null and vaule is 0
map_size = 1536000
Failed to allocate video RAM: -12
fb1: tccfb frame buffer device
the width is 800
the height is 480
the depth lenght is 32
map_size = 1540096
addr = -4194304, end = -3637248, size = 1540096,vm_end = -2097152
vm_start = 0
2 addr = -4194304,end = -3637248,size = 1540096,c->vm_start = -4194304,c->vm_end = -4190208
2 addr = -4190208,end = -3637248,size = 1540096,c->vm_start = -4190208,c->vm_end = -4186112
2 addr = -4186112,end = -3637248,size = 1540096,c->vm_start = -4186112,c->vm_end = -4182016
2 addr = -4182016,end = -3637248,size = 1540096,c->vm_start = -4182016,c->vm_end = -4177920
2 addr = -4177920,end = -3637248,size = 1540096,c->vm_start = -4177920,c->vm_end = -2637824
addr is c->vm_end = -2637824,end = -3637248
addr > end
map_cpu = null and vaule is 0
map_size = 1536000

希望大家告知内存分配问题
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP