分享

C标准库实现分析

 心不留意外尘 2016-05-16

http://blog.csdn.net/zg_hover/article/details/1011917

2006

一 基本概念

1,核心态和用户态

  不同级别的代码拥有不同的权限,一般CPU把进程分成两个态:用户级和内核级。内核级的代码是操作系统内核完全信任的代码,可以访问系统的任何的资源。而用户级的进程对有些系统资源的访问是有限制的,比如:受系统保护的内存,和受限的端口等。用户只有通过调用系统函数(核心态的函数,该函数可以直接访问内核级的资源),访问内核资源。就像调用系统函数,而该系统函数可以直接控制内核的资源,来完成对内核资源的访问。所以系统服务进程工作在内核级。

2,支持虚拟内存(06.8.9)

  32位的地址并不表示每台机器都会有4G的物理内存。那么这是怎么实现的呢?那就是通过虚拟内存。32位地址的前20位是计算页表的,然后加上后12位的偏移量构成了32位的虚拟地址。这个计算机结果确定了一个实际的内存单元。

   

 

  这样每个进程都以为自己在独享内存空间,未得到操作系统的允许任何进程都不可能访问其他进程的指令和数据。

 寄存器CR3用来存放页目表的起始物理地址。

对于不同的进程,操作系统只需要使用很少一部分内存来维护一份页表和页表目录,在进程切换时进程会自动保存CR3的值,以便切换回来时仍然能找到属于改进程的页表和页目录。

 *缺页的处理

  页表和页目录都有标志位来表示结构是否存在的标识位,如果标识位(p-parents)为1表示页表指向地页不存在,这时处理器会异常处理过程,根据具体情况决定下一步的动作。例如:如果页表或页不再内存中,而以前已经保存到硬盘中了,这时只要从硬盘中调出即可。然后再返回产生中断的地方执行。

*内存区域共享

  如果OS允许某些进程共享内存区,它只需要把页表和页目录的计算的虚拟地址指向相同的物理地址即可。例如:运行同一个程序的时候虽然启动了多个进程,但是代码段却是共享的,这样就达到了节约内存的目的。

*OS对虚拟地址空间管理

  OS把虚拟地址空间当着资源来管理,LINUX把4G 的地址分成两部分:用户地址空间和内核地址空间。通常情况下分界线是:0x00000000-oxC0000000(3G)是用户映射空间。0xC0000000-oxfffffff是内核映射空间。

*虚拟地址空间的使用

  注意,即使是用户映射的空间不允许用户随意使用。用户如果要申请更多的内存空间需要向OS申请,批准后才能使用。比如:在使用malloc函数分配内存时,进程首先向OS申请,OS为该进程分配一个虚拟内存空间比实际申请的要大一些,主要用来存储一些标识位。同时OS会尽量推迟物理内存的分派,所以让分配的虚拟内存,都同指向零页面(该页面在系统初始化时就被填充为0,属性为只读不可写),当进程真正要使用该内存(向里面写数据时),OS进入异常处理,这时才真正为该进程分配内存,然后重新设定页表。从异常返回后系统会重新执行刚才那条产生异常的指令,好像什么都没发生过。

 3,中断和异常

    无论是中断还是异常它们都会改变处理器当前执行指令的顺序,因为中断和异常本身就意味着发生了某个特殊事件需要处理器立刻跟进。

    中断可分为(1)外部中断。外部设备发送给处理器的处理请求,它是随机的异步的。(2)内部中断。进程直接进入某个向量对应的处理逻辑。

    异常:顾名思义,就是处理器察觉到不正常的情况发生了。根据异常产生后续执行指令的不同可以分为:

    >故障(fault):如果进程处理完异常后重新返回到原来产生异常的那条指令,这种方式就是故障。

    >陷阱(trap):如果处理器在异常返回后执行的是引起异常的下一条指令,这种异常方式就是陷阱。

    >终止(abort):如果处理器不返回原先的那条指令执行,就是终止。

当然还有很多的基本概念,先到这,以后继续添加。

    

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多