Linux中的内存分配和释放之free_bootmem()函数分析
free_bootmem()这个函数是系统启动初期内存释放的核心函数,我们来看看它的代码。
void __init free_bootmem (unsigned long addr, unsigned long size)//addr是要释放的物理起始地址,size是要释放空间的大小。
{
free_bootmem_core(NODE_DATA(0)->bdata, addr, size);//直接从内存node0号开始释放内存空间。
}//可以看出真正的核心函数是free_bootmem_core()这个函数,这个才是核心部分。我们来看看它的具体内容吧。
static void __init free_bootmem_core(bootmem_data_t *bdata, unsigned long addr, unsigned long size)
{
unsigned long i;
unsigned long start;
/*
* round down end of usable mem, partially free pages are
* considered reserved.
*/
unsigned long sidx;
unsigned long eidx = (addr + size - bdata->node_boot_start)/PAGE_SIZE;//计算出要释放空间的结束位置相对于该内存节点的起始位置的偏移页数。
unsigned long end = (addr + size)/PAGE_SIZE;//释放空间最后位置的绝对页号。
BUG_ON(!size);//如果释放空内存,系统崩溃。
BUG_ON(end > bdata->node_low_pfn);//不能释放超过本节点范围内的内存空间,否则系统崩溃。
if (addr < bdata->last_success)
bdata->last_success = addr;
/*
* Round up the beginning of the address.
*/
start = (addr + PAGE_SIZE-1) / PAGE_SIZE;//这里计算开始地址的全新页,假设addr是在0~4kb的地址范围的话,其实真正在0号页的位置,但是如果通过上面的运算,求出来的就是1号页的位置。为什么这样做呢?因为如果起始地址不是按页对齐的,如果直接释放,就会把前面不属于这个内存node的空间也释放了。
sidx = start - (bdata->node_boot_start/PAGE_SIZE);//这个就是计算新页和原来的起始地址所在页的偏移页数。
 
相关文档:
一.为什么学linux
1.性能卓越
开源,免费,稳定,安全,处理多并发
2.工作方面:
linux系统管理员
linux程序员(linux软件工程师,linux嵌入式开发)
二.流程
第一阶段:linux平台上的开发,包括vi,gcc,gdb,make,jdk,tomcat,mysql..linux基本操作
第二阶段:加厚C功底或java
第三阶段:《unix环境高级编程》
第 ......
Qt是一个跨平台的C++图形用户界面库,.由挪威TrollTech公司出品,目前包括Qt/X11,基于Frambuffer的Qt Embedded,快速开发工具Qt Designer几国际化工具Qt Linguist等.Qt支持Unix及Linux系统,还支持Windows NT/Windows 2k及Qindows 95/98平台.Qt的良好封装机制使其模块化程度非常高,可重用性 ......
本函数的分析很难具体,因为涉及了很多arm的处理器型号和每个型号对应的cache和write buffer的工作方式,这片文章只是做简单的记录,方便以后了解更深后回来再来完善这个函数。
这个函数的调用过程如:start_kernel()->setup_arch()->paging_init()->memtable_init( ......
linux中,在支持多线程的环境中,通常每个线程都有属于自己的errno变量,是用来表示特定错误的常量。
以下是<errno.h>中定义的所有出错errno常量
#define EPERM 1 /* Operation not permitted */
#define ENOEN ......