内核中分配大于4M的内存

lemonchen
DEMO 2008-07-12 字数 110

用__get_free_pages分配大于4M的内存,内核启动时就崩了,小于4M时,没事。

如果想要获取大于4M的内存,有其它方法吗?

KernelTech Linux内核技术
10 个回复
linuxer
初学者 2008-07-13

vmalloc

【 在 lemonchen (DEMO) 的大作中提到: 】

: 用__get_free_pages分配大于4M的内存,内核启动时就崩了,小于4M时,没事。

: 如果想要获取大于4M的内存,有其它方法吗?

tdhlshx
沧海月 2008-07-13

必须连续的页面吗?

【 在 lemonchen (DEMO) 的大作中提到: 】

: 用__get_free_pages分配大于4M的内存,内核启动时就崩了,小于4M时,没事。

: 如果想要获取大于4M的内存,有其它方法吗?

xhacker
圌山东南扬子江山 2008-07-13

加启动参数,预留大于4M的内存

【 在 lemonchen (DEMO) 的大作中提到: 】

: 用__get_free_pages分配大于4M的内存,内核启动时就崩了,小于4M时,没事。

: 如果想要获取大于4M的内存,有其它方法吗?

Wingsofwind
YY 2008-07-13

kmalloc最大分配128K,__get_free_pages()最大4M,以上都是物理连续的,

vmalloc最多分配128M,线性地址连续,物理地址不一定连续,可用1G以上的高端内存

【 在 lemonchen (DEMO) 的大作中提到: 】

: 用__get_free_pages分配大于4M的内存,内核启动时就崩了,小于4M时,没事。

: 如果想要获取大于4M的内存,有其它方法吗?

lemonchen
DEMO 2008-07-13

需要是连续的

【 在 tdhlshx (沧海月~Tobe crazy isbetterthan foolish) 的大作中提到: 】

: 必须连续的页面吗?

lemonchen
DEMO 2008-07-13

现在启动参数的bootargs指定了MEM=100M

【 在 xhacker (圌山东南扬子江山) 的大作中提到: 】

: 标  题: Re: 内核中分配大于4M的内存

: 发信站: 水木社区 (Sun Jul 13 15:01:50 2008), 转信

: 加启动参数,预留大于4M的内存

: 【 在 lemonchen (DEMO) 的大作中提到: 】

: : 用__get_free_pages分配大于4M的内存,内核启动时就崩了,小于4M时,没事。

: : 如果想要获取大于4M的内存,有其它方法吗?

: --

lemonchen
DEMO 2008-07-13

下面这段是内核代码

for (i = VPFE_DEFNUM_FBUFS; i < *count; i++) {

u32 size = PAGE_SIZE << (get_order(buf_size));

void *mem = (void *)__get_free_pages(GFP_KERNEL | GFP_DMA,

get_order(buf_size));

if (mem) {

unsigned long adr = (unsigned long)mem;

while (size > 0) {

/* make sure the frame buffers are never

swapped out of memory */

SetPageReserved(virt_to_page(adr));

adr += PAGE_SIZE;

size -= PAGE_SIZE;

}

vpfe->fbuffers[i] = mem;

} else {

break;

}

}

if(mem)应该是检查返回值了的

这指的是

下面这段代码吗?

#ifndef CONFIG_FORCE_MAX_ZONEORDER

#define MAX_ORDER 11

#else

#define MAX_ORDER CONFIG_FORCE_MAX_ZONEORDER

#endif

MAX ORDER最大能改成多少呢?

在arm的那些器件的config中找到大部分

CONFIG_FORCE_MAX_ZONEORDER=9

在ia64的那些器件中大部分是

CONFIG_FORCE_MAX_ZONEORDER=18

在PPC64中大部分是

CONFIG_FORCE_MAX_ZONEORDER=13

【 在 ignace (心茫然-坚持,信任) 的大作中提到: 】

: 标  题: Re: 内核中分配大于4M的内存

: 发信站: 水木社区 (Sun Jul 13 21:34:34 2008), 转信

: 崩了是因为你没有检查返回值

: 要大于4M的内存

: 需要修改MAX_ORDER的值

: 【 在 lemonchen (DEMO) 的大作中提到: 】

: : 用__get_free_pages分配大于4M的内存,内核启动时就崩了,小于4M时,没事。

: : 如果想要获取大于4M的内存,有其它方法吗?

: --

: 心若在灿烂中死去

: 爱会在灰烬里重生

lemonchen
DEMO 2008-07-13

果然把MAX_ORDER从11改成12,就好了

感谢一下版友们

【 在 lemonchen (DEMO) 的大作中提到: 】

: 下面这段是内核代码

:         for (i = VPFE_DEFNUM_FBUFS; i < *count; i++) {

:                 u32 size = PAGE_SIZE << (get_order(buf_size));

: ...................

karpar
karpar 2008-07-14

Re一下,我也学到东西了

【 在 lemonchen (DEMO) 的大作中提到: 】

: 果然把MAX_ORDER从11改成12,就好了

: 感谢一下版友们

xhacker
圌山东南扬子江山 2008-07-14

....

那用ioremap就可以为这段内存建立页表使用了

这和get_free_page两码事,这段内存不在系统管理之内

【 在 lemonchen (DEMO) 的大作中提到: 】

: 现在启动参数的bootargs指定了MEM=100M