- 论坛徽章:
- 0
|
10可用积分
我的目标平台为 s3c2410-linux2.4.18
宿主机为readhat9.0
做对UART2以DMA方式进行数据读取的驱动
在设置缓冲区的函数里,
当为DMA内核缓冲区数据结构(uart_buf_t)分配内存时,
(构建s->nbfrags个这样的缓冲区,所以乘以 s->nbfrags)
(s->nbfrags根据需要设定,在我看的音频驱动中,设定为最大8个)
kmalloc(sizeof(uart_buf_t) * s->nbfrags, GFP_KERNEL);
// 其中 sizeof(uart_buf_t) = 36
// s->nbfrags = 2
当s->nbfrags为2或者3时,能正常分配。当s->nbfrags为1, 4, 8 ... 出现如下错误:
kernel BUG at slab.c:1099!
Unable to handle kernel NULL pointer dereference at virtual address 00000000
pgd = c3b2c000
*pgd = 33c11001, *pmd = 33c11001, *pte = 00000000, *ppte = 00000000
Internal error: Oops: ffffffff
CPU: 0
pc : [<c001e858>] lr : [<c0025d74>] Tainted: P
sp : c3b35e60 ip : c3b35e18 fp : c3b35e70
r10: c3b34000 r9 : 00149898 r8 : 00000000
r7 : 00000000 r6 : c02073b0 r5 : 00000007 r4 : 00000000
r3 : 00000000 r2 : 00000001 r1 : 00000001 r0 : 00000001
Flags: nZCv IRQs on FIQs on Mode SVC_32 Segment user
Control: C000317F Table: 33B2C000 DAC: 00000015
Process insmod (pid: 53, stackpage=c3b35000)
Stack: (0xc3b35e50 to 0xc3b36000)
......
......
----------------------------------------------------------------------------
请问:
我看了kmalloc的用法,原型是 void *kmalloc(unsigned int len, int priority);
priority,也应该传入参数GFP_KERNEL。
只是分配的内存长度不一样怎么会出错呢? 而且我分配的内存空间并不大。
请高手指点,感谢!
----------------------------------------------------------------------------
kmaolloc的相关代码如下:
void * kmalloc (size_t size, int flags)
{
cache_sizes_t *csizep = cache_sizes;
for (; csizep->cs_size; csizep++) {
if (size > csizep->cs_size)
continue;
return __kmem_cache_alloc(flags & GFP_DMA ?
csizep->cs_dmacachep : csizep->cs_cachep, flags);
}
return NULL;
}
static cache_sizes_t cache_sizes[] = {
#if PAGE_SIZE == 4096
{ 32, NULL, NULL},
#endif
{ 64, NULL, NULL},
{ 128, NULL, NULL},
{ 256, NULL, NULL},
{ 512, NULL, NULL},
{ 1024, NULL, NULL},
{ 2048, NULL, NULL},
{ 4096, NULL, NULL},
{ 8192, NULL, NULL},
{ 16384, NULL, NULL},
{ 32768, NULL, NULL},
{ 65536, NULL, NULL},
{131072, NULL, NULL},
{ 0, NULL, NULL}
}; |
|