CpuMemSets在Linux操作系统中的实现(5)

文章作者 100test 发表时间 2007:03:14 16:28:52
来源 100Test.Com百考试题网


3.3 API设计

CpuMemSets提供了一系列的内核级和应用级的编程接口,分别定义在内核的include/linux/cpumemset.h文件和库代码CpuMemSets/cpumemsets.h文件中。

通过调用用户级接口对cmm&.cms进行设置将导致内核的调度器和内存分配器所使用的系统位向量如cpus_allowed和mems_allowed的变化,从而使内核调度代码使用新的系统处理器号、内存分配代码从新内存块中分配内存页;但是,原先从旧内存块中分配的内存页将不会发生迁移,除非强制采用其他手段。具体来说,系统在cmsAttachNewTask()、cmsExchangeTask()和cmsExchangePid()过程中,执行0update_cpus_allowed()根据任务的current_cms的当前处理器列表更改它的cpus_allowed位向量;在cms_set()过程中,执行mems_allowed_build()根据任务的current_cms的当前内存块列表更改当前虚拟存储区或任务、内核的mems_allowed位向量。

  【kernel/cpumemset.c】

  1661 static int

  1662 cms_set(unsigned long *preq, char *rec, int size, target_option cmm_or_cms)

  :

  1713     if (choice == CMS_VMAREA) {

  :

  

  1772    vma->vm_mems_allowed = mems_allowed_build(newhan.set).

  :

  1792     } else {

  :

  1822      newhan.set->mems_allowed = mems_allowed_build(newhan.set).

  :

  1840     }

  :

  1842 }
  

在权限保护方面,只有根权用户才可以修改内核所使用的cms&.cmm和任何任务的cms&.cmm;而一般用户只能修改自身的任务和虚拟存储区所拥有的cms&.cmm;具有相同uid的任务之间可以互相修改对方的cms&.cmm。只有根权用户才可以扩展自身的cmm,一般用户只可以缩小自己的cmm。

  【kernel/cpumemset.c】

  409 cmshandle_t

  410 cmsGetHandlePid(int choice, pid_t pid, int do_check_perm)

  411 {

  :

  425         if (pid &.&.

  426           do_check_perm &.&.

  427           (current->euid ^ p->suid) &.&.

  428           (current->euid ^ p->uid) &.&.

  429           (current->uid ^ p->suid) &.&.

  430           (current->uid ^ p->uid) &.&.

  431           !capable(CAP_SYS_ADMIN))

  432             han.error = -EPERM.

  :

  442 }

  

  【kernel/cpumemset.c】

  1478 /*

  1479 * Unless you have CAP_SYS_ADMIN capability, you can only shrink cmm.

  1480 */

  1481

  1482 static int

  1483 cmm_restrict_checking(cpumemmap_t *oldmap, cpumemmap_t *newmap)

  1484 {

  1485     int i.

  1486

  1487     if (capable(CAP_SYS_ADMIN))

  1488         return 0.

  1489

  1490     /* newmap must be a subset of oldmap */

  1491     for (i = 0. i < newmap->nr_cpus. i  )

  1492         if (!foundin (newmap->cpus[i], oldmap->cpus, oldmap->nr_cpus))

  1493             return -EINVAL.

  1494     for (i = 0. i < newmap->nr_mems. i  )

  1495         if (!foundin (newmap->mems[i], oldmap->mems, oldmap->nr_mems))

  1496             return -EINVAL.

  1497     return 0.

  1498 }


相关文章


入侵检测系统分析及其在Linux下的实现(2)
入侵检测系统分析及其在Linux下的实现(1)
CpuMemSets在Linux操作系统中的实现(5)
CpuMemSets在Linux操作系统中的实现(4)
澳大利亚华人论坛
考好网
日本华人论坛
华人移民留学论坛
英国华人论坛