当前位置: 技术问答>linux和unix
进程,线性地址(虚拟地址),kernel之间的关系
来源: 互联网 发布时间:2017-03-25
本文导语: 一个进程是4gb的线性(虚拟)地址空间。 main函数被映射到这个空间的哪一个线性地址? 线性地址是由页目录表,页表中的索引组成。这个线性地址的空间是怎么创建出来的,让他能够和程序的image以及物理内存关联起...
一个进程是4gb的线性(虚拟)地址空间。
main函数被映射到这个空间的哪一个线性地址?
线性地址是由页目录表,页表中的索引组成。这个线性地址的空间是怎么创建出来的,让他能够和程序的image以及物理内存关联起来?
main函数被映射到这个空间的哪一个线性地址?
线性地址是由页目录表,页表中的索引组成。这个线性地址的空间是怎么创建出来的,让他能够和程序的image以及物理内存关联起来?
|
我先自己解释一下,
第一个问题,地址空间分为哪几个部分你知道吗,如果不清楚用 address layout 在google上搜索。这里只告诉你分为 内核空间(1G或2G) 和 用户空间(3G或2G),main函数地址肯定在 用户空间中:
第二个问题,地址空间怎么创造出来的,你看过 操作系统 书籍中“创建新进程”的章节吗?
(1)给进程分配ID号;
(2)给进程分配空间;
(3)初始化进程控制块(PCB);
(4)把进程放入队列中,比如就绪队列;
(5)创建其他数据结构;
刚开始分配的空间是虚拟的,也就是没有对应物理内存单元的页目录和页表;
当新进程被第一次调度执行,就会把程序映像加载到内存中,但是它只有虚拟地址空间,这就导致页异常,内核就会给虚拟空间分配物理内存页。有个专业名词叫“写时复制”(copy-on-write)。
最后给你一个链接,非常非常好的参考资料:
http://duartes.org/gustavo/blog/post/anatomy-of-a-program-in-memory
第一个问题,地址空间分为哪几个部分你知道吗,如果不清楚用 address layout 在google上搜索。这里只告诉你分为 内核空间(1G或2G) 和 用户空间(3G或2G),main函数地址肯定在 用户空间中:
第二个问题,地址空间怎么创造出来的,你看过 操作系统 书籍中“创建新进程”的章节吗?
(1)给进程分配ID号;
(2)给进程分配空间;
(3)初始化进程控制块(PCB);
(4)把进程放入队列中,比如就绪队列;
(5)创建其他数据结构;
刚开始分配的空间是虚拟的,也就是没有对应物理内存单元的页目录和页表;
当新进程被第一次调度执行,就会把程序映像加载到内存中,但是它只有虚拟地址空间,这就导致页异常,内核就会给虚拟空间分配物理内存页。有个专业名词叫“写时复制”(copy-on-write)。
最后给你一个链接,非常非常好的参考资料:
http://duartes.org/gustavo/blog/post/anatomy-of-a-program-in-memory
|
main映射到那个虚拟地址每个程序都不一样,但是可执行文件(比如elf格式)会提供程序的入口地址。程序经过编译连接早就物是人非,所以没必要拘泥main函数的虚拟地址。
一个进程的详细的页表信息是内核动态建立的,相应的虚拟地址所对应的物理页为空(当然也有其他情况)会触发夜异常,内核捕获异常,为相应的页表项关联物理页,然后重新执行发生异常的指令。
最近也是在学习这方面的知识,只是自己的理解。
一个进程的详细的页表信息是内核动态建立的,相应的虚拟地址所对应的物理页为空(当然也有其他情况)会触发夜异常,内核捕获异常,为相应的页表项关联物理页,然后重新执行发生异常的指令。
最近也是在学习这方面的知识,只是自己的理解。