热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

内核源码阅读(三)进程命名空间和用户命名的实现

(1)进程的命名空间1.基本概念传统上Linux及其衍生版的UNIX变体中,许多资源都是全局管理的。例如进程PID和用户的UID等全局I

(1)进程的命名空间

1.基本概念
传统上Linux及其衍生版的UNIX变体中,许多资源都是全局管理的。例如进程PID和用户的UID等全局ID。为了节约成本并且能够保证用户之间的权限不受影响,命名空间提供了一种与KVMhe VMare不同的解决方案。内核通过命名空间将全局资源进行抽象,使得各个进程组分别放到不同的容器,彼此隔离,但是可以允许提供一些接口使得其可以相互通信来降低容器间的间隔。
命名空间给系统建立了不同的视图,如下图所示
这里写图片描述
新的命名空间的创建方法:
1)在用fork和clone系统调用创建进程时,可以选特定的选项控制是否与父进程共享命名空间。
2)unshare系统调用可将某些部分,如命名空间等从父进程分离。
2.命名空间的实现
命名空间的实现需要两个部分:每个子系统的命名空间结构;将给定进程关联到所属各个命名空间的机制。
进程和命名空间之间的联系
struct nsproxy结构体汇集了指向特定于子系统的命名空间包装器的指针。其具体成员结构如下:
这里写图片描述
每个进程都关联到了自身的命名空间视图,每个命名空间都有一个对应的标志:
这里写图片描述
默认命名空间的作用所有属性都相当于全局的。init_nsproxy定义了初始的全局命名空间,其中维护了指向各子系统初始的命名空间对象的指针。
这里写图片描述
UTS命名空间所有相关信息都汇集到下列结构中的一个实例中:
这里写图片描述

其中kref是一个嵌入的引用计数器,用于对使用struct uts_namespace的实例进行跟踪,name包含了uts_namespace的属性信息。struct newname的结构如下所示。
这里写图片描述
初始设置保存在init_uts_ns中:
这里写图片描述这里写图片描述
内核创建一个UTS命名空间,是通过copy_utsname函数实现的,在某个进程调用fork()并通过CLONE_NEWUTS标志指定创建新的UTS命名空间时 ,则调用该函数。


(2)用户的命名空间

用户命名空间在要求创建新的用户命名空间时,则生成当前用户命名空间的一份副本,并关联到当前进程的nsproxy实例。
这里写图片描述
其中kref:引用计数器。
uidhash_table:每个struct user_struct的实例可通过uidhash_table访问其资源消耗情况。
root_user:指向root用户的命名空间的指针。

root用户命名空间clone实现:


kernel/user_namespace.c
static struct  user_namespace  *clone_user_ns(struct user_namespace  *old_ns)
{
struct user_namespace  *ns;
struct user_struct  *new_user;
ns = kmalloc(sizeof(struct user_namespace) , GFP_KERNEL);
ns->root_user  =  alloc_uid(ns, 0);
new_user  = alloc_uid(ns, current->uid);
switch_uid(new_user);
return ns;

其中alloc_uid():对当前命名空间中给定一个用户,若无对应user_struct实例,则分配一个新实例。
switch_uid():确保从现在开始将新的user_struct实例用于资源统计,即将struct task_struct的user成员指向新的user_struct实例。


推荐阅读
  • 本文详细探讨了Zebra路由软件中的线程机制及其实际应用。通过对Zebra线程模型的深入分析,揭示了其在高效处理网络路由任务中的关键作用。文章还介绍了线程同步与通信机制,以及如何通过优化线程管理提升系统性能。此外,结合具体应用场景,展示了Zebra线程机制在复杂网络环境下的优势和灵活性。 ... [详细]
  • 本文详细介绍了 PHP 中对象的生命周期、内存管理和魔术方法的使用,包括对象的自动销毁、析构函数的作用以及各种魔术方法的具体应用场景。 ... [详细]
  • Java 模式原型在游戏服务器架构中的应用与优化 ... [详细]
  • Spring – Bean Life Cycle
    Spring – Bean Life Cycle ... [详细]
  • 本文介绍了在 Java 编程中遇到的一个常见错误:对象无法转换为 long 类型,并提供了详细的解决方案。 ... [详细]
  • 零拷贝技术是提高I/O性能的重要手段,常用于Java NIO、Netty、Kafka等框架中。本文将详细解析零拷贝技术的原理及其应用。 ... [详细]
  • 基于Linux开源VOIP系统LinPhone[四]
    ****************************************************************************************** ... [详细]
  • 本文探讨了如何通过编程手段在Linux系统中禁用硬件预取功能。基于Intel® Core™微架构的应用性能优化需求,文章详细介绍了相关配置方法和代码实现,旨在帮助开发人员有效控制硬件预取行为,提升应用程序的运行效率。 ... [详细]
  • 在深入探讨进程间通信技术时,本文重点解析了描述符传递的方法。通过详细分析发送和接收描述符的过程,文章首先介绍了发送描述符的具体步骤,并提供了相关函数原型。此外,还讨论了如何高效地在不同进程之间传输文件描述符,以实现资源的共享和同步。这一技术在多进程应用中具有重要意义,能够显著提升系统的性能和可靠性。 ... [详细]
  • 在当前的软件开发领域,Lua 作为一种轻量级脚本语言,在 .NET 生态系统中的应用逐渐受到关注。本文探讨了 Lua 在 .NET 环境下的集成方法及其面临的挑战,包括性能优化、互操作性和生态支持等方面。尽管存在一定的技术障碍,但通过不断的学习和实践,开发者能够克服这些困难,拓展 Lua 在 .NET 中的应用场景。 ... [详细]
  • 蓝桥竞赛中的回形取数问题是一个经典的算法挑战。本文详细解析了该问题的正确实现代码,重点探讨了 `hasNext()` 和 `next()` 方法的区别与应用。尽管两者在功能上类似,都会等待用户输入下一个字符,但它们的返回值类型不同,`hasNext()` 返回一个布尔值,表示是否还有输入,而 `next()` 则直接返回下一个输入的值。通过具体的代码示例和详细的逻辑分析,本文为参赛者提供了宝贵的参考和指导。 ... [详细]
  • 在 Linux 环境下,多线程编程是实现高效并发处理的重要技术。本文通过具体的实战案例,详细分析了多线程编程的关键技术和常见问题。文章首先介绍了多线程的基本概念和创建方法,然后通过实例代码展示了如何使用 pthreads 库进行线程同步和通信。此外,还探讨了多线程程序中的性能优化技巧和调试方法,为开发者提供了宝贵的实践经验。 ... [详细]
  • 数组容量的动态调整与优化策略
    在探讨数组容量动态调整与优化策略时,本文分析了两种常见的方法。首先,通过使用for循环逐个复制元素实现扩容,但这种方法存在计算索引的复杂性问题。其次,利用System.arraycopy()方法进行高效复制,显著提升了性能和代码可读性。此外,文章还讨论了动态数组在不同应用场景下的优化策略,包括预分配容量和按需扩展等技术,以提高程序的整体效率。 ... [详细]
  • 本文详细探讨了几种常用的Java后端开发框架组合及其具体应用场景。通过对比分析Spring Boot、MyBatis、Hibernate等框架的特点和优势,结合实际项目需求,为开发者提供了选择合适框架组合的参考依据。同时,文章还介绍了这些框架在微服务架构中的应用,帮助读者更好地理解和运用这些技术。 ... [详细]
  • 在开发过程中,我最初也依赖于功能全面但操作繁琐的集成开发环境(IDE),如Borland Delphi 和 Microsoft Visual Studio。然而,随着对高效开发的追求,我逐渐转向了更加轻量级和灵活的工具组合。通过 CLIfe,我构建了一个高度定制化的开发环境,不仅提高了代码编写效率,还简化了项目管理流程。这一配置结合了多种强大的命令行工具和插件,使我在日常开发中能够更加得心应手。 ... [详细]
author-avatar
空城
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有