本栏目下主要归档了一些linux相关的文章,注重用法和示例。不会深入到内核源码里面去。

Linux用户程序如何访问物理内存

用户态的程序都是在内存保护模式下使用内存,无法直接访问物理内存。同时用户程序使用的地址都是逻辑地址,而不是物理地址。这些逻辑地址对应的物理内存在哪里,用户进程本身并不知道。

如果用户程序想要访问物理内存,就需要通过内核实现。本文介绍基于内存模块的方式,实现Linux中用户态程序访问所有物理内存。

内核中内存信息的展示

linux内核中,整个内存信息和状态的展示可以通过以下几个文件获得:

文件 描述
/proc/buddyinfo 展示系统上各个zonebuddy信息,主要用来分析内存碎片问题
/proc/pagetypeinfo 输出系统上各个zone中的不同迁移类型的详细状态信息
/proc/vmstat 描述内存统计信息
/proc/zoneinfo 输出系统上各个内存zone的详细信息

在详细介绍这些接口之前,我们先要明确一下几点:

  • 现在的内核中,内存管理最大概念为node
  • 在node上再分为一个或者几个zone
  • 每个zone中又分为不同的迁移类型

获取容器中init进程的pid

本文题目为『获取容器中init进程的pid』,其实说的还不够详细。其实容器中的进程都单独运行在一个独立的pid namespace中,而我们有时需要在顶级的pid namespace中获取其init进程对应的在顶级pid namespacepid

本文简要介绍了完成这个任务的一种方法。

传递文件描述符

Unix domain socket具有一个特别的能力——传递文件描述符。其他的IPC机制都不支持传递文件描述符。它允许进程打开一个文件,然后将文件描述符发送给另外一个进程(很可能不相关的进程)。