以下是小编帮大家整理的在gcc下模拟bfinuclinux的内存管理(2):所需要的文件及其更改,本文共2篇,仅供参考,希望能够帮助到大家。

篇1:在gcc下模拟bfinuclinux的内存管理(2):所需要的文件及其更改
由于内核的头文件都放在include目录下,且其相互之间的引用关系较为复杂,故此保留include的整个目录,此外还需要以下几个c文件:
Arch/blackfin/kernel/setup.c:这个文件中定义了几个与内存管理相关的全局变量,然后在setup_arch函数中设置了这些全局变量的值。
由于我们需要对内存分配过程进行模拟,因此需要首先从系统分配64M内存,然后将这64M内存用bootmem进行分页并进行管理。为此在setup_arch函数中添加这样几行代码:
raw_memory = malloc((CONFIG_MEM_SIZE + 1) * 1024 * 1024);
memory_start = _rambase = _ramstart = ((unsigned long)raw_memory + PAGE_SIZE - 1) / PAGE_SIZE * PAGE_SIZE;
memory_end = _ramend = _ramstart + CONFIG_MEM_SIZE * 1024 * 1024;
而原来对这几个全局变量的设置语句则不再使用。
之所以多分配了1M的内存,是因为使用malloc分配得到的内存无法保证其指针是以PAGE_SIZE对齐的,因此多分配一些内存然后向上ALIGN。
Init/main.c:这个文件中主要使用了start_kernel函数,当然在此函数中并不需要进行所有的初始化工作,而仅仅调用几个与内存管理相关的函数:
void __init start_kernel(void)
{
char * command_line;
………………………………….
setup_arch(&command_line);
…………………………………….
build_all_zonelists;
page_alloc_init();
………………………………………….
mem_init();
kmem_cache_init();
.......................
}
经过这几个函数调用之后,三种内存算法的初始化工作全部完成,就可以自由进行调用了,
Arch/blackfin/mm/init.c:这个文件主要有paging_init与mem_init两个函数。
mm/bootmem.c:bootmem算法实现。
Mm/page_alloc.c:buddy算法实现。
Mm/slab.c:slab算法实现。
此外还需要几个辅助文件,如lib/bitmap.c等,与内存算法关系不大,在此就不进行列举了。
篇2:在gcc下模拟bfinuclinux的内存管理(1):基本思想
bfin-uclinux内核的内存管理主要涉及三种算法,bootmem,buddy和slab,其中bootmem在内核启动的初期发挥作用,它将系统的可用内存以页的形式组织起来。然后Buddy算法接管这些页,将之分成不同大小的页块,这个工作完成后,bootmem退出舞台且不再出现。而slab算法则从buddy中取一些页面出来进行小对象的分配,内核的实际对象分配都是使用它来完成的。在这三种算法的配合下,内核得以高效利用内存。
那么,高效到底高到什么程度呢?在《The Slab Allocator: An Object-Caching Kernel Memory Allocator》这篇文章中,Jeff Bonwick对此有了非常完整的说明并给出了一些实验数据。这篇文章发表于1994年,这么多年了,内核经过无数次的修改,这篇文章中的数据是否还能适用?最近刚好在研究内存管理,就来验证一下吧!
虽然在VDSP下可以进行一些验证工作,但是效率偏低。况且这个算法本身应该是可以独立于内核的。怎么办?将之移植出来似乎是一个不错的办法。
为了尽可能少地改动内核的代码,选用一个兼容的编译器就成了很好的选择。经过考虑,决定选择如下平台:
AMD Sempron 2800+
Windows XP
CodeBlocks 8 IDE
Cygwin gcc 3.4.4
Mingw做为备选编译器
在此平台下验证通过后再到VDSP下跑得到一组内核实际运行的数据,
在cygwin下编译时取消开关中断和同步处理。
先做了个简单测试:
int main()
{
int i;
void *p;
srand(time(NULL));
start_kernel();
for(i = 0; i < 100000; i++)
{
//p = kmalloc(rand() % 1000000, GFP_KERNEL);
//kfree(p);
p = malloc(rand() % 1000000);
free(p);
}
return 0;
}
这段代码用于不断分配随机大小的内存块,然后释放。
在不启用优化的情况下,经过运行,使用slab算法进行1千万次的分配只要3.343秒,而直接使用malloc进行十万次的分配却要6.640秒,看来有很多个数量级的差距啊。
在启用优化的情况下(-O3),经过运行,使用slab算法进行1千万次的分配只要1.031秒,而直接使用malloc进行十万次的分配却要6.535秒,看来有很多个数量级的差距啊。
从这里还可以看到,GCC的优化效率还是不错的,一下提高了3倍的效率,还啥事都不要做。呵呵。
更多精彩,稍后继续~~~~~~~~~~~~~~~
★Excel在.Net下驻留内存的解决方法EXCEL基本教程
★在ALPHA机下改机器名的需要注意的几个地方!Windows系统
文档为doc格式