欢迎来到千学网!
您现在的位置:首页 > 实用文 > 其他范文

在gcc下模拟bfinuclinux的内存管理(2):所需要的文件及其更改

时间:2023-01-23 08:44:02 其他范文 收藏本文 下载本文

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

在gcc下模拟bfinuclinux的内存管理(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系统

《在gcc下模拟bfinuclinux的内存管理(2):所需要的文件及其更改(共2篇).doc》
将本文的Word文档下载到电脑,方便收藏和打印
推荐度:
点击下载文档

文档为doc格式

最新推荐
猜你喜欢
点击下载本文文档