易截截图软件、单文件、免安装、纯绿色、仅160KB

Linux中的内存分配和释放之__alloc_boot函数分析

 对于这个函数,其实是很多宏定义调用的函数,其中alloc_bootmem_low_pages(x)是其中一个调用它的宏,大家可以认为这些宏只是把这个__alloc_bootmem实质性的函数进行了封装。#define alloc_bootmem_low_pages(x)相当于__alloc_bootmem((x), PAGE_SIZE, 0),就是从0地址开始的低端内存分配按页大小对齐的内存。好了,为了了解这个函数是怎么运行的,我们就从它的源头开始讲起吧。
 我们回到paging_init()这个函数,在上诉的文章的bootmem_init()函数返回之后,就接着回到paging_init()。
 memcpy(&meminfo, mi, sizeof(meminfo));//这里起到更新的作用。
 /*
  * allocate the zero page.  Note that we count on this going ok.
  */
 zero_page = alloc_bootmem_low_pages(PAGE_SIZE);//从0地址低端内存开始分配1页空闲内存,将该页的页帧位码表置1,并将这也得得内容全部清0.我们还是仔细点来分析这段代码吧。
 void * __init __alloc_bootmem (unsigned long size, unsigned long align, unsigned long goal)//size是申请的内存大小,align是决定的起始地址开始的内存对齐方式,goal是分配内存的起始地址,如果不行的话就从0地址开始。
{
 pg_data_t *pgdat = pgdat_list;//这个就是那个指向discontig_node_data[0]的链表。
 void *ptr;
 for_each_pgdat(pgdat)//这是一个宏定义:#define for_each_pgdat(pgdat)  for (pgdat = pgdat_list; pgdat; pgdat = pgdat->pgdat_next)。其实很简单,就是通过这个链表从0号内存node开始遍历所有的discontig_node_data[n]。
  if ((ptr = __alloc_bootmem_core(pgdat->bdata, size,align, goal)))//调用分配内存核心函数,我们在下面紧接着的位置介绍。
   return(ptr);
 /*
  * Whoops, we cannot satisfy the allocation request.
  */
 printk(KERN_ALERT "bootmem alloc of %lu bytes failed!\n", size);
 panic("Out of memory");
 return NULL;
}
 static void * __init __alloc_bootmem_core(struct bootmem_data *bdata, unsigned long size,unsigned long align, unsigned long goal)//这里和前面的__alloc_bootmem()不同的地方就是在第一项,对于这一项我们是比较熟悉的。
{
  unsigned long offset, remaining_size,


相关文档:

[转载]Linux热插拔

 
将可移动设备连入系统时,系统的后台中会依次发生如下事件:
l 内核检测到新硬件插入,然后分别通知hotplug和udev。前者用来装入相应的内核模块(如usb-storage),而后者用来在/dev中创建相应的设备节点(如/dev/sda1)。
l udev创建了相应的设备节点之后,会将这一消息通知hal的守护程序(hald)。当然udev还得保证新 ......

Linux Shell语法速查 及 关键字说明

虽然学过
Linux Shell
编程,但由于编写
Shell
脚本的机会实在是比较少
(
通常在项目初期搭建开发环境时编写得比较
多一些
)
,所以一
些语法久而久之就会忘了,一个简单的语法去翻书效率实在是慢,所以就个人整理了一个表格,由于我用的编程语言是
C/C++
,所以在编程的时候往往脑海里面首
先浮现的是用
C
......

linux 信号处理

曾做过signal相关的一点儿开发,谈谈我的一些理解。
首先,需要理解几个signal相关的函数。
  sigaddset(sigset_t* sigSet, int sigNum ) :  将信号sigNum 添加到信号集 sigSet 中;
  sigdelset(sigset_t* sigSet, int sigNum) : 将信号 sigNum 从信号集 sigSet 中删除;
   ......

linux 新增系统调用


此文于2010-02-26被推荐到CSDN首页
如何被推荐?
最近在研究 Linux
内核的时间子系统,为下一篇长文《服务器程序中的日期与时间》做准备,无意中注意到了 Linux
新增的几个系统调用的对编写服务器代码的影响,先大致记录在这里。这篇博客也可算作前一篇《多线
程服务器的常用编程模型》
的一个注脚。
< type="te ......

remote desktop, linux >windows

学校服务器的一个windows虚拟机开启了Desktop共享,这样可以在配置不高的终端使用高性能的机器,除了windows客户端访问外,在Ubuntu里可以通过自带的 rdesktop访问,该程序为命令行形式。参数较多,比较有用的是提供远程与本地交互的-r参数。
如:
rdesktop -r disk:floppy=/home/xiajing/t  192.168.111.111 ......
© 2009 ej38.com All Rights Reserved. 关于E健网联系我们 | 站点地图 | 赣ICP备09004571号