当前位置: 首页 -  必威体育 - 正文

深入浅出Linux的进程地址空间

2020-06-20 15:20 必威体育 瑾澜52°c
A+ A-

return 0;

然而,如果该页被修改过,操作系统必须保留该页的内容以便晚些时候在被访问。这种页称为“脏(dirty)页”,当它被从内存中删除时,将被保存在一个称为交换文件的特殊文件中。

B、初始化数据段。通常将此段称为数据段,它包含了程序中需赋初值的变量。例如,C程序中任何函数之外的说明:

char *p = (char *)malloc(10);

int stack_var0 = 2;

当运行一个程序时,操作系统需要创建一个进程,这个进程和程序之间都干了些什么呢?

如果从物理内存中被淘汰的页来自于一个映像或数据文件,并且还没有被写过,则该页不必保存,它可以丢掉。如果有进程在需要该页时就可以把它从映像或数据文件中取回内存。

呵呵,这里我们看到地址了,这个地址是虚拟地址,这些地址时怎么来的呢?其实在我们编译的时候,这些地址就已经确定了,如下图中红线。

假设现在程序中有一条指令需要读取上面vm_start--vm_end之间的某内容

C、非初始化数据段。通常将此段称为bss段,这一名称来源于早期汇编程序的一个操作,意思是“block started by symbol”,在程序开始执行之前,内核将此段初始化为0。函数外的说明:

long sum[1000];

linux操作系统是通过sys_exec对可执行文件进行映射以及读取的,有如下几步:

2、.do_page_fault被调用,在该函数中,为pgd[i]在内存中分配一个页表,并让该表项指向它,如下图所示:

A、正文段。这是由cpu执行的机器指令部分。通常,正文段是可共享的,所以即使是经常执行的程序(如文本编辑程序、C编译程序、shell等)在存储器中也只需要有一个副本,另外,正文段常常是只读的,以防止程序由于意外事故而修改器自身的指令。

2、age描叙本页的年龄,用来判断该页是否为淘汰或交换的好候选

{

在linux操作系统中,每个进程都通过一个task_struct的结构体描叙,每个进程的地址空间都通过一个mm_struct描叙,c语言中的每个段空间都通过vm_area_struct表示,他们关系如下 :

printf(“\tNew end of stack:%p\n”,&stack_var1);

int maxcount = 99;(全局变量)

当一个可执行程序映射到进程虚拟地址空间时,一组vm_area_struct数据结构将被产生。每个vm_area_struct数据结构表示可执行印象的一部分;是可执行代码,或是初始化的数据,以及未初始化的数据等。

linux使用“最近最少使用(Least Recently Used ,LRU)”页面调度技巧来公平地选择哪个页可以从系统中删除。这种设计系统中每个页都有一个“年龄”,年龄随页面被访问而改变。页面被访问越多它越年轻;被访问越少越老。年老的页是用于交换的最佳候选页。

}

printf(“Test location:\n”);

printf(“BSS location:\n”);

当一个程序被执行时,该程序的内容必须被放到进程的虚拟地址空间,对于可执行程序的共享库也是如此。可执行程序并非真正读到物理内存中,而只是链接到进程的虚拟内存中。

int data_var0 = 1;

如果一个进程想将一个虚拟页装入物理内存,而又没有可使用的空闲物理页,操作系统就必须淘汰物理内存中的其他页来为此页腾出空间。

printf(“Stack location:\n”);

}

printf(“\tAddress of main(Code Segment):%p\n”,main);

int main()

printf(“\tAddress of bss_var:%p\n”,&bss_var);

下面我们看看linux操作系统是如何处理的: