ITPub博客

首页 > Linux操作系统 > Linux操作系统 > perfessional linux kernel archticture 学习笔记3

perfessional linux kernel archticture 学习笔记3

原创 Linux操作系统 作者:spurray 时间:2009-05-08 16:10:49 0 删除 编辑

命名空间(Namespaces)
        内核2.6发展中,命名空间的支持被整合到大量的子系统当中,他允许不同的进程有着系统的不同视觉。传统的Linux使用大量全局参量,例如,进程ID号,系统中每一个进程都有着独一无二的ID,用户或其他进程能够通过该ID使用该进程,如,发送一个信号。命名空间的使用,让以前的全局资源分成不同的组,每个名字空间能够包涵特别的一套PIDs,或是能够提够不同的文件系统的视图。一个命名空间的挂载不会传播到别的名字空间。
        命名空间是有用处的,例如,它能对主机服务提供益处:不需要为每个客户提供一个物理上的机器,而只需要利用命名空间的特点使用容器(containers),给与每一客户所需要的视图,他们相互独立,不会相互影响。每一个都似乎是一个单独运行的Linux机器,虽然事实上他们同时操作在同一个物理设备上。它使得我们高效的使用资源。与全虚拟的解决方案像KVM相比,仅仅只需要一个单独的内核运行管理所有的容器(containers)。
        不是内核所有部分都能完全清楚命名空间,当我们分析各种子系统时,我将讨论哪种支持程度是可能的。

1.3.3 地址空间和特权级别
        在我们开始讨论虚拟地址空间之前,我们首先确认一下一些符号约定。这本书,我将使用一些缩写:KiB,MiB和GiB作为尺寸单元。KB,MB和GB这些符号约定实际上不适合在信息技术领域,因为它们代表10进制幂的数(10^3,10^6和10^9)虽然二进制系统普遍存在于计算机领域中,因此KiB代表2^10,MiB代表2^20,GiB代表2^30字节。
        因为地址访问是通过指针的方法,CPU的字长决定了它能够管理的地址空间的最大尺寸,,32位能够寻知道2^32=4GiB,64位的机器可以最高到2^64字节的地址空间。
        最大地址空间尺寸,并不是实际的物理内存大小,因此它通常称为虚拟地址空间,这个术语的另一个原因是系统中的每一个进程都有这样的一个印象,就是它单独使用这个地址空间,其他的进程不会出现,应用程序不需要关心其他应用程序,如同该计算机只有自己这一个进程在运行。
        Linux把虚拟地址空间划分为两个部分,内核空间(kernel space)和用户空间(userspace),如图所示:

       
        系统中的每一个用户进程有自己的虚拟地址范围,(0--TASK_SIZE)。这个区域之上(从TASK_SIZE到2^32或是2^64)是保留给内核使用,用户进程不可以访问。TASK_SIZE是个比例常量,跟系统架构相关,例如:IA-32划分了3GiB,也就是每个进程可用3GiB,剩下的1GiB给内核。由于随架构不一样,这个值也不一样,因此,下面讨论我们将采用这个例子的值。

        这个划分不依赖于系统有多少RAM可用,由于地址空间虚拟化,每一个用户进程都认为自己可以访问3GiB的内存空间。各个独立进程的用户空间是相互分开的,而对于内核空间总是一样的,不管进程如何执行。
        注意对于64位机,上面的图将会更加复杂,因为64位机采用小于64位来管理着巨大的虚拟地址空间,而是使用较小的数字,例如42或是47,所以可以使用的有效空间将小于理论尺寸。然而这个大小依然大大超过RAM的大小,完全足够使用,采用少一些的位数来管理地址会让CPU上一些开销。虚拟地址空间将会包含一个空的空间,因此图1-3描述的简单的形式,不是完全的正确,我们将在4章节对这个话题进行更细致的讨论。

特权级别
        内核划分虚拟地址空间为两个部分,所以它能够保护各自独立的系统进程。现代所有的CPU都支持几个进程能够驻留的特权级别。每个级别有着不同的限制,例如,执行某一汇编语言指令或是访问特别的虚拟地址空间,IA-32架构使用了一个四级特权级别的系统,用环形图能够有个直观的认识。内环比外环有着跟多的功能,如图1-4所示:
   
       
       

        尽管Intel使用了四个不同级别,Linux仅仅有那个了两个模式--内核模式和用户模式,关键的不同点在于访问的内存区域,内核空间不能在用户模式下访问,即时用户进程不能够操作或是读数据在内核空间。也不能执行代码存储。它是内核私有区域,这种机制反之进程无意识操作而造成相互影响。
   
        通过系统调用(system calls)这个特殊的传输方法,这些实现方法根据系统不同而实现不同,如果一个普通的进程想执行一个影响整个系统的动作(如:操作I/O设备),它只能发出请求给内核通过系统调用,内核首先检查是否该进程允许执行所要执行的行为,然后在执行该行为,再返回到用户模式。

        除了代表用户程序执行代码,内核也能够被异步的硬件中断所激活,然后运行在中断上下文中,不同于进程上下文是不能访问虚拟地址的用户空间,由于中断随即发生,当中断发生时,用户运行的进程也是随机的,所以中断很有可能和导致中断的原因没有相连,内核和当前用户空间的内容无关。当操作中断上下文时,内核必须比一般操作更小心,例如,它不能休眠。写中断处理时要特别小心,我们将在第二章进一步讨论,图1-5大略显示了这不同的上下文。

        除了普通的进程,还有种内核线程运行在系统中,内核线程当然也不和任何特别的用户进程有关联,它们也不能处理用户部分的地址空间。在其他方面,内核线程的行为和通常的用户层应用非常接近。可是,和内核在中断上下文相比,他们能够休眠,他们也能被调度跟踪,和系统每一个常规的进程一样。内核使用他们是多反面的从内存数据同步,阻塞设备到帮助调度程序分配进程给CPUs,我们将会频繁的碰见他们在这本书的学习过程中。

        注意,内核进程容易被识别通过ps的输出,因为他们的名字放置在括号里面。
    wolfgang@meitner>        ps  fax
        PID  TTY          STAT      TIME   COMMAND
           2 ?            S<        0:00   [kthreadd]
           3 ?            S<        0:00    _  [migration/0]
           4 ?            S<        0:00    _  [ksoftirqd/0]
           5 ?           S<        0:00    _ [migration/1]
           6 ?           S<        0:00    _ [ksoftirqd/1]
           7 ?           S<        0:00    _ [migration/2]
           8 ?           S<        0:00    _ [ksoftirqd/2]
           9 ?           S<        0:00    _ [migration/3]
          10 ?           S<        0:00    _ [ksoftirqd/3]
          11 ?           S<        0:00    _ [events/0]
          12 ?           S<        0:00    _ [events/1]
          13 ?           S<        0:00    _ [events/2]
          14 ?           S<        0:00    _ [events/3]
          15 ?           S<        0:00    _ [khelper]
       ...
       15162 ?           S<        0:00    _ [jfsCommit]
       15163 ?           S<        0:00    _ [jfsSync]    


           图1-5:内核和用户模式的执行。大多数时间,CPU执行代码在用户空间,当应用程序执行一个系统调用,CPU将切换到内核模式,内核执行请求,在这个过程当中,它可以访问用户的虚拟地址空间部分。完成系统调用后,CPU切回到用户模式,硬件中断也可以出发模式的转变,但是此时,用户空间不能被内核访问。


        对于多处理器系统,许多线程开始于一个per-CPU(??)被限制运行在特定的处理器上。斜线“/”后面的数字代表是运行在哪个CPU上。

1-3.JPG

1-4.JPG

1-5.JPG

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/12366772/viewspace-594550/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2009-04-20

  • 博文量
    6
  • 访问量
    4464