Linux基础知识

内存

1 物理地址虚拟地址和逻辑地址的区别

物理地址是 物理介质内存条的的储存地址,是独一无二的

虚拟地址 又称线性地址,是计算机能够产生的最大内存地址集合, 与CPU总线有关, 32 位cpu 有4g的虚拟地址
虚拟地址不是独一无二的,不同的进程可以使用相同的一块虚拟地址,由MMU(内存管理单元)进行地址映射之后,才能访问真正的 物理地址空间

逻辑地址是在有地址变换功能的计算机中,访内指令给出的地址 (操作数) 叫逻辑地址,也叫相对地址,也就是是机器语言指令中,用来指定一个操作数或是一条指令的地址。一个逻辑地址由两部分组成,段标识符 :即段内偏移量, 段标识符由 16 位长度组成,其中前13位是索引号,后面3位包含一些硬件细节

段基址 加 逻辑地址 = 虚拟地址

CPU将一个逻辑地址转换为物理地址,需要进行两步:首先将给定一个逻辑地址(其实是段内偏移量,这个一定要理解!!!),CPU要利用其段式内存管理单元,先将为个逻辑地址转换成一个线程地址,再利用其页式内存管理单元,转换为最终物理地址。

2 内存的分段机制
段的长度不固定, 比页要大,一般包含若干个页, cs ds ss es 运行时 只有四个区激活,但是不表示只有四个区,其他区在休眠而已。 属于 x86 架构的历史包袱, 优点是可以将代码区和数据区隔离,防止程序把代码区的数据误写,造成程序无法运行,也能有一定的安全性,防止恶意程序。

为了实现地址变换,系统为每个进程建立一张段表,而每个分段有一张页表(在一个进程中,段表只有一个,而页表可能有多个)

段表表项中至少包括段号、页表长度和页表起始地址,页表表项中至少包括页号和块号。此外,系统中还应有一个段表寄存器,指出作业的段表起始地址和段表长度。
3 内存的分页机制

分页机制将虚拟地址映射到物理地址,分页机制管理的对象是固定大小的存储块,称之为“页”,分页机制把整个线性地址空间及整个物理地址空间都看成由页组成,在线性地址空间中的任何一页,可以映射为物理地址空间中的任何一页(我们把物理空间中的一页叫做一个页面)

页表是把线性地址映射到物理地址的一种数据结构

Q.为什么对32位线性地址空间要采用两级页表?

页表是把线性地址映射到物理地址的一种数据结构,4GB的线性空间可以被划分为1M个4KB大小的页,每个页表项占4字节,则1M个页表项的页表就需要占用4MB空间,而且还要求是连续的,于是采用两级页表来实现;两级页表就是对页表再进行分页,第一级称为页目录,其中存放关于页表的信息;4MB的页表再次分页,可以分为1K个4KB大小的页。

即存贮页 表项本身的 4M空间 没有办法采用换页方式,因此需要二级页表结构。 首先由一级页表来管理 二级页表的表项
所占用的 4m 空间

Linux的虚拟地址空间的大小为4GB,内核将这4GB的空间分为两部分,较高的1GB(虚地址0xC0000000到0xFFFFFFFF)供内核使用,称为“内核空间”;而较低的3GB(虚地址0x00000000到0xBFFFFFFF)供各个进程使用,称为“用户空间”;因为每个进程可以通过系统调用进入内核,因此,内核空间由系统内的所有进程共享;

用户态 与 内核态

用户态到内核态怎样切换?
往往我们的系统的资源是固定的,例如内存2G,CPU固定,磁盘2TB,网络接口固定。所以就需要操作系统对资源进行有效的利用。假设某个应用程序过分的访问这些资源,就会导致整个系统的资源被占用,如果不对这种行为进行限制和区分,就会导致资源访问的冲突。所以,Linux的设计的初衷:给不同的操作给与不同的“权限”。Linux操作系统就将权限等级分为了2个等级,分别就是内核态和用户态。

从用户态到内核态切换可以通过三种方式:

系统调用,其实系统调用本身就是中断,但是软件中断,跟硬中断不同。
异常:如果当前进程运行在用户态,如果这个时候发生了异常事件,就会触发切换。例如:缺页异常。
外设中断:当外设完成用户的请求时,会向CPU发送中断信号。

写时复制:
在Linux程序中,fork()会产生一个和父进程完全相同的子进程,但子进程在此后多会exec系统调用,出于效率考虑,linux中引入了“写时复制“技术,也就是只有进程空间的各段的内容要发生变化时,才会将父进程的内容复制一份给子进程。

那么子进程的物理空间没有代码,怎么去取指令执行exec系统调用呢?

在fork之后exec之前两个进程用的是相同的物理空间(内存区),子进程的代码段、数据段、堆栈都是指向父进程的物理空间,也就是说,两者的虚拟空间不同,但其对应的物理空间是同一个。当父子进程中有更改相应段的行为发生时,再为子进程相应的段分配物理空间,如果不是因为exec,内核会给子进程的数据段、堆栈段分配相应的物理空间(至此两者有各自的进程空间,互不影响),而代码段继续共享父进程的物理空间(两者的代码完全相同)。而如果是因为exec,由于两者执行的代码不同,子进程的代码段也会分配单独的物理空间。
在网上看到还有个细节问题就是,fork之后内核会通过将子进程放在队列的前面,以让子进程先执行,以免父进程执行导致写时复制,而后子进程执行exec系统调用,因无意义的复制而造成效率的下降。因为父进程对与数据的修改也会造成子进程对物理空间的复制。
------这里本质上是两个进程的空间不一致时,必须重新拷贝一份才能不影响另一个进程,因此无论父进程还是子进程只要有修改,都会出触发写时复制

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值