一、内存寻址
1.内存地址
逻辑地址(logical address)
包含在机器语言指令中用来指定一个操作数或一条指令的地址。每一个逻辑地址都由一个段(segment)和偏移量(offset)组成,偏移量指明了从段开始的地方到实际地址之间的距离
线性地址(linear address)(也称虚拟地址 virtual address)
是一个32位无符号整数,可以用来表示最高达4G的地址。线性地址通常用十六进制数字来表示,值的范围从0x0000 0000 到 0xffff ffff
物理地址(physical address)
用于内存芯片级内存单元寻址。它们与从处理器的地址引脚发送到内存总线的电信号相对应
内存控制单元(MMU)
通过一种称为分段单元(segmentation unit)的硬件电路把一个逻辑地址转换为线性地址;接着,第二个称为分页单元(paging unit)的硬件电路把线性地址转换位一个物理地址
逻辑地址—>分页单元
—>线性地址—>分页单元
—>物理地址
分段:
GDT
LDT
逻辑地址是段内的偏移
能够跑最大进程数 = (256 - 4)/ 2 = 126个进程
一个进程的逻辑地址 分配虚拟地址位64M
所以可以分配的最大地址为126 * 64 = 8G
但是0.11的内核规定最多为NR_TASKS=64
所以线性地址为64*64 = 4G
分段机制:逻辑地址 —》线性地址
分页机制:线性地址 —》物理内存的映射
在操作系统中有多个页目录表,但是当前使用的只有一个,并且这个页目录表存储地址在CR3寄存器中,表在head.S中被创建
1.在运行应用程序的时候,是把所有的代码和数据全部加载到内存中么?如果不是那么在用到一些代码而这些代码不在内存中该怎么办?
2.在fork一个进程的时候,我们完全的为子进程拷贝了父进程的内存空间,那么这个进程的拷贝
是真的创建了两个完全一个的内存块在物理内存中么?如果不是那操作系统是怎么做的(写时拷贝)
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 yengii@qq.com