Linux中的内存分配和释放之bootmam_init()函数分析
了解了Linux内存管理的基本知识后,我们来研究一下Linux内存的分配和释放。我们会分两个部分来研究的。我们向来探讨系统启动初期内存的分配和释放。这个阶段可以申请到大片的物理内存,但是要注意到以下两点!
1)其实系统启动初期是指在init_mem()之前的阶段,在这个阶段由于只需要少量的内存(内核编译需要的内存,页帧位码表,页表,initrd),所以可以申请到大片的物理内存,但是我们还要注意到的是,如果在这个阶段不释放这些内存的话,init_mem()以后的内核是不可以再对这部分内存操作的(分配和释放)。
2)这个阶段,我们只可以分配低端内存,分配不了高端内存,因为这个时候内存是没有内核逻辑地址的。
好了,现在我们开始来研究与这个阶段有关的函数,通过这些函数的分析,我们可以更清楚内存管理是怎样的。我们先来研究bootmem_init()系统启动阶段内存管理初始化。这个函数是在start_kernel()的setup_arch()的paging_init()调用的。我们现在来看看paging_init()的具体代码。
void __init paging_init(struct meminfo *mi, struct machine_desc *mdesc)
{
void *zero_page;
int node;
bootmem_init(mi);
struct meminfo *mi其实是从setup_arch()函数传过来的全局变量,这个全局变量是meminfo,这个变量记录了系统内存信息,具体来说是记录了bank的信息。我们来看看bootmem_init(mi)具体做些什么!
static void __init bootmem_init(struct meminfo *mi)
{
struct node_info node_info[MAX_NUMNODES], *np = node_info;
unsigned int bootmap_pages, bootmap_pfn, map_pg;
int node, initrd_node;
bootmap_pages = find_memend_and_nodes(mi, np);
对于struct node_info这个结构体是用来描述内存节点(node)的信息的,这里的node_info变量是这个结构体的数组,*np这是指向这个数组的指针,我们先来看看find_memend_and_nodes(mi, np);这个函数。
find_memend_and_nodes(struct meminfo *mi, struct node_info *np)
{
unsigned int i, bootmem_pages = 0, memend_pfn = 0;
for (i = 0; i < MAX_NUMNODES; i++) {
np[i].start = -1U;
np[i].end = 0;
np[i].bootmap_pages = 0;
}
这里是对刚才说的那个结构体进行初始化,一直把整个数组的每个单元初始化完为止。
for (i =
相关文档:
远程登入:ssh che@192.168.1.111
1.添加用户:useradd cheyanbing
2.修改密码:passwd cheyanbing
3.mkdir /cd /cd .. /cd -/
4.回到用户主目录:cd / cd ~
5.cd /home/he
6.mkdir -p www/pro
远程拷贝
scp che@192.168.1.111:/home/che/test
che@192.168.1.133:/home/che/
&n ......
随着Linux2.6的发布,由于2.6内核做了教的改动,各个设备的驱动程序在不同程度上要
进行改写。为了方便各位Linux爱好者我把自己整
理的这分文档share出来。该文当列举
了2.6内核同以前版本的绝大多数变化,可惜的是由于时间和精力有限没有详细列出各个
函数的用
法。
特别声明:该文档中的内容来自http://lwn.net,该 ......
在Suse10.1下安装EOS5.3,界面按钮凡中文都是方格,可在终端查看中文都是好的,网上搜了好几天,终于弄明白原因。
EOS5.3使用的是jdk1.4.2,在suse下没有jdk默认要求的中文字体,需要做额外的配置,修改方法如下:
1.使用su命令切换为root用户,再使用cd命令切换到jdk安装路径下的jre;例如:
......