操作系统内存地址管理 (127)

先看内存的分段机制,了解到这个被linux所“抛弃”,算了先放一放,但是汇编中的cs、ss、ds还是要记住(笔记本上)

分页

一个32位的机器,线性地址最大可为4G,可以用4KB为一个页来划分,这页,整个线性地址就被划分为一个tatol_page[2^20]的大数组,共有2的20个次方个页。这个大数组我们称之为页目录。目录中的每一个目录项,就是一个地址——对应的页的地址。

个人认识,以后修改

首先,一个程序里面用的是逻辑地址,代码访问的也是逻辑地址。

对于程序的逻辑地址来说,用的是分段机制,我想那几个段寄存器应该有用了吧。

一般32位系统是有3层页表,4k对齐方式页面大小是4kb 2^12,2^20个页。为了方便访问,使用前10位表示一级页表地址,中间10位2级页表,后12位3级页表。只有三级页表指向的才是4kb内存,其它是指针。

对于现在的操作系统来说,一个程序的加载(严格说进程),会被分配4gb的(32位)的虚拟内存,我认为,就是逻辑地址的分配,虚假的东西

我的问题,逻辑地址4gb,线性地址4gb(32位),为何转换要当前段地址加上偏移地址?完全不够??

问题以后解决,接下来是过程。

首先,我认为线性地址作为y=nx+z的形式存在,且分页机制管理。我觉得它就是一个物理地址的使用情况虚拟表。

windows中,一个进程的开辟会有4GB(32)空间,里面有用户区、内核区等。内核区的代码和数据肯定是非分页内存。

多个进程可以共享一个内核区代码。所以,我觉得当用户区的逻辑地址进行操作时,转换线性地址通过分页来得到物理地址,进行操作。

对于内核区的逻辑地址,无须线性地址的转换,直接转换物理地址进行操作。

多个进程进行读写时,会使用当前虚拟地址(逻辑地址),转换为线性地址(具体转换:由于每个进程会对分页内存记录,只是页表项,页目录的记录。CR3寄存器会加载当前进程页目录来进行切换)

当发现转换的地址不在内存中(我认为线性地址就是对内存的管理,所以就是从线性地址寻找),就会发生缺页,缺页中断是软中断。irl不要忘了。

缺页的发生会让系统从页交换文件里寻找,没有就坏了!有就发生页交换。

我想一般2GB的内存条能装上64位系统,也是因为页交换文件。能使用的物理地址被保持到了住够,

// //