vmap allocation for size 8192 failed ---- 原因及解决方法(求解)

在启动ARM Linux内核时,遇到'vmap allocation for size 8192 failed'的问题,导致解压后无法继续运行。通过开启低级别调试,发现是内存分配失败。解决方案可能涉及增大vmalloc区域或调整内核配置。
摘要由CSDN通过智能技术生成

在boot ARM Linux kernel时,解压完kernel后,就不能继续运行。log信息如下:

-------------------------------------------------------------------------------------------------------------------------------------------------

Starting kernel ...
Uncompressing Linux............................................................................................................................................................................................. done, booting the kernel.

-------------------------------------------------------------------------------------------------------------------------------------------------


不知道为什么会出现这种情况。于是打开kernel的low level debug信息。具体参见:http://blog.csdn.net/voice_shen/article/details/6947737

其log信息如下:

-------------------------------------------------------------------------------------------------------------

以下是一个完整的DMA-BUF获取网卡数据的例程,可以在Linux系统上编译和运行: ```c #include <linux/module.h> #include <linux/init.h> #include <linux/kernel.h> #include <linux/dma-buf.h> #include <linux/netdevice.h> #include <linux/slab.h> #include <linux/types.h> #include <linux/version.h> #define BUF_SIZE 8192 static struct dma_buf *rx_buf; static char *rx_buf_vaddr; static struct net_device *dev; /* 网卡接收数据的中断处理函数 */ static irqreturn_t my_netdev_rx_handler(int irq, void *dev_id) { struct sk_buff *skb; int len; /* 从网卡接收数据 */ skb = netdev_alloc_skb(dev, BUF_SIZE); len = dev->netdev_ops->ndo_receive_skb(skb, dev); /* 将数据拷贝到DMA-BUF缓冲区中 */ memcpy(rx_buf_vaddr, skb->data, len); /* 将DMA-BUF缓冲区传递给其他设备进行处理 */ /* ... */ return IRQ_HANDLED; } /* 初始化DMA-BUF缓冲区 */ static int dma_buf_init(void) { int ret; /* 创建DMA-BUF缓冲区对象 */ rx_buf = dma_buf_alloc(BUF_SIZE, GFP_KERNEL, NULL, NULL); if (IS_ERR(rx_buf)) { printk(KERN_ERR "dma_buf_alloc failed\n"); return PTR_ERR(rx_buf); } /* 映射DMA-BUF缓冲区到内核空间 */ rx_buf_vaddr = dma_buf_vmap(rx_buf); if (!rx_buf_vaddr) { printk(KERN_ERR "dma_buf_vmap failed\n"); dma_buf_put(rx_buf); return -ENOMEM; } return 0; } /* 模块初始化函数 */ static int __init my_module_init(void) { int ret; /* 初始化DMA-BUF缓冲区 */ ret = dma_buf_init(); if (ret < 0) return ret; /* 注册网卡中断处理函数 */ dev = dev_get_by_name(&init_net, "eth0"); if (!dev) { printk(KERN_ERR "dev_get_by_name failed\n"); dma_buf_vunmap(rx_buf, rx_buf_vaddr); dma_buf_put(rx_buf); return -ENODEV; } ret = request_irq(dev->irq, my_netdev_rx_handler, IRQF_SHARED, "my_netdev_rx", dev); if (ret < 0) { printk(KERN_ERR "request_irq failed\n"); dev_put(dev); dma_buf_vunmap(rx_buf, rx_buf_vaddr); dma_buf_put(rx_buf); return ret; } printk(KERN_INFO "my_module loaded\n"); return 0; } /* 模块退出函数 */ static void __exit my_module_exit(void) { /* 注销网卡中断处理函数 */ free_irq(dev->irq, dev); dev_put(dev); /* 释放DMA-BUF缓冲区 */ dma_buf_vunmap(rx_buf, rx_buf_vaddr); dma_buf_put(rx_buf); printk(KERN_INFO "my_module unloaded\n"); } module_init(my_module_init); module_exit(my_module_exit); MODULE_LICENSE("GPL"); ``` 在上述代码中,我们首先在初始化函数中调用了dma_buf_alloc和dma_buf_vmap函数创建和映射DMA-BUF缓冲区。然后,我们注册了网卡的中断处理函数,并在中断处理函数中将接收到的数据拷贝到DMA-BUF缓冲区中。最后,在退出函数中注销中断处理函数并释放DMA-BUF缓冲区。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值