我最近对各种基于 Linux 内核内存的文件系统很好奇。
Note:就我而言,与更好地理解标题中提出的问题相比,以下问题或多或少应该被视为可选问题。我在下面问他们,因为我相信回答他们可以更好地帮助我理解差异,但由于我的理解是有限的,因此其他人可能更了解。我准备接受任何可以丰富我对标题中提到的三个文件系统之间差异的理解的答案。
最终,我想我想挂载一个可用的文件系统,hugepages,尽管一些轻量的研究(以及更轻量的修补)让我相信 arewritable hugepage mount不是一种选择。我错了吗?这里的机制是什么?
还有关于 hugepages:
uname -a
3.13.3-1-MANJARO \
#1 SMP PREEMPT \
x86_64 GNU/Linux
tail -n8 /proc/meminfo
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
DirectMap4k: 8223772 kB
DirectMap2M: 16924672 kB
DirectMap1G: 2097152 kB
Run Code Online (Sandbox Code Playgroud)
(这里是/proc/meminfo和/proc/cpuinfo的全文版本)
以上是怎么回事?难道我已经分配hugepages?有之间的差异DirectMap内存页面和hugepages?
更新在@Gilles 的推动下,我在上面又添加了 4 行,似乎必须有所不同,尽管我DirectMap在tail昨天拉之前从未听说过......也许DMI还是什么?
只是多一点...
hugepages努力失败,并假设任何图像文件的硬盘备份,挂载循环的风险tmpfs?是swapped什么?我的文件系统是最坏的情况吗?我知道tmpfs是挂载的文件系统缓存 - …
https://dvdhrm.wordpress.com/2014/06/10/memfd_create2/
从理论上讲,您可以在
memfd_create()不引入新系统调用的情况下实现 [ ] 行为,如下所示:
int fd = open("/tmp", O_RDWR | O_TMPFILE | O_EXCL, S_IRWXU);
(注意,为了更方便地保证这里的 tmpfs,我们可以使用“ /dev/shm”代替“ /tmp”)。
因此,最重要的问题是为什么我们需要第三条路?
[...]
- 后备内存属于拥有文件的进程,不受挂载配额的限制。
^ 我认为这句话的第一部分不能依赖是正确的吗?
所述memfd_create()的代码被作为“的字面实施链接的文件居住在[α] TMPFS必须是内核内部”。跟踪代码,我理解它的不同之处在于不实施 LSM 检查,还创建了 memfds 来支持“密封”,正如博客文章继续解释的那样。但是,我非常怀疑memfds正在考虑不同的,以原则上TMPFILE。
具体来说,当OOM 杀手来敲门时,我认为它不会解释 memfds 持有的内存。这可能总计高达 50% 的 RAM - tmpfs的size= 选项的值。内核不会为内部 tmpfs 设置不同的值,因此它将使用默认大小 50%。
所以我认为我们通常可以预期拥有大型 memfd 但没有其他重要内存分配的进程不会被 OOM 杀死。那是对的吗?
我对它的实施有一些疑问。
MMAP 提供文件映射并返回物理内存中该位置的指针还是返回映射表的地址?它是否也为该文件分配和锁定空间?
一旦文件存储在内存中的那个位置,它会一直留在那里直到调用 munmap 吗?
文件甚至移动到内存中还是只是一个用作重定向的映射表,而文件实际上位于虚拟内存 -(磁盘)中?
假设它被移动到内存中,其他进程是否可以访问该空间以读取数据,如果他们有地址?
在早期版本的 Unix 中,进程如何共享内存?这与共享内存的现代实现相比如何?
我只是想知道这些值是在哪里设置的以及它们的默认值是什么?我的当前是 18446744073692774399。我没有把它设置在我能看到的任何地方。
$ cat /proc/sys/kernel/shmmax
18446744073692774399
$ sysctl kernel.shmmax
kernel.shmmax = 18446744073692774399
Run Code Online (Sandbox Code Playgroud) 在/run/shm(以前/dev/shm)中创建一个目录并将其用作应用程序的临时目录是一种好习惯吗?
背景:我正在为一个程序编写黑盒测试,该程序对文件和目录执行很多操作。对于每个测试,我都会创建很多文件和目录,然后运行程序,然后创建预期的文件和目录集,然后运行 diff 进行比较。我现在有大约 40 个测试,它们已经花费了 2 秒多的时间来运行。希望加快速度,我想在某种 ramdisk 上的目录中运行测试。
在研究 ram 磁盘时,我偶然发现了一个问题,其中的答案指出可以在其中创建一个目录/dev/shm并将其用作临时目录。研究了更多但是我偶然发现了debian 的一个 wiki 页面,指出/dev/shm直接使用是错误的。我应该使用这些shm_*功能。不幸的是,这些shm_*函数似乎无法在 shell 脚本中使用。
现在我很困惑。是否可以像临时目录一样使用/run/shm(以前/dev/shm)?
在我的dmesg窗口管理器(xfwm4,XFCE 的一部分)崩溃时出现了这个:
xfwm4[3936]: segfault at 7f3c7c523770 ip 00007f3c7c523770 sp 00007ffffea1ee28 error 15 in SYSV00000000 (deleted)[7f3c7c4e8000+60000]
Run Code Online (Sandbox Code Playgroud)
同样的情况SYSV00000000也出现在其他地方(如lsof)。那么,这是SYSV00000000什么?我搜索了一下,发现它与虚拟内存有关,但与其他无关。
Linux系统加载共享库时,共享库的内存布局是怎样的?
例如,原始内存布局如下:
+-----------+
|heap(ori) |
+-----------+
|stack(ori) |
+-----------+
|.data(ori) |
+-----------+
|.text(ori) |
+-----------+
Run Code Online (Sandbox Code Playgroud)
当我 dlopen 时foo.so,内存布局是 A 还是 B?
A
+-----------+
|heap(ori) |
+-----------+
|stack(ori) |
+-----------+
|.data(ori) |
+-----------+
|.text(ori) |
+-----------+
|heap(foo) |
+-----------+
|stack(foo) |
+-----------+
|.data(foo) |
+-----------+
|.text(foo) |
+-----------+
Run Code Online (Sandbox Code Playgroud)
或者
B
+-----------+
|heap(ori) |
+-----------+
|heap(foo) |
+-----------+
|stack(foo) |
+-----------+
|stack(ori) |
+-----------+
|.data(foo) |
+-----------+
|.data(ori) |
+-----------+
|.text(foo) |
+-----------+
|.text(ori) |
+-----------+
Run Code Online (Sandbox Code Playgroud)
或者除了A和B之外的任何东西......?
通过shmget和shmat,我可以从另一个程序访问存储在一个程序中的数据。这是代码的要点:
key=ftok("shared.c",'c');
shmid=shmget(key,1024,0644|IPC_CREAT);
data=shmat(shmid,(void *)0,0);
printf("Enter the data");
gets(data);
Run Code Online (Sandbox Code Playgroud)
同样,我可以编写另一个程序并使用shmat它来访问数据。
现在我想知道如何从主机操作系统访问它。由于共享内存 ID 在主机内存中会有所不同,shmat因此不起作用。如何从主机访问共享内存?
我们可以这样做吗:我们知道在管理程序中存在一个关于每个操作系统的页表,它将逻辑地址映射到物理地址,有一个 pmap 表将管理程序的物理地址与主机的物理地址,并且管理程序中也存在影子页表,它将逻辑来宾地址映射到主机物理地址。有没有办法访问操作系统对应的影子页表或分页表
Varnish 是一种 HTTP 加速器,它使用一个 ~80MB 的文件支持的 SHM 日志,该日志被 mlock() 输入到内存中。该光油文档建议存储在tmpfs上的文件,以避免不必要的磁盘访问。但是,如果整个文件被锁定到内存中,Linux 内核是否仍会写入备份文件?
我尝试使用 inotify 和 fatrace 来监视这一点,但是由于这种交互可能发生在内核内部,因此这些工具看不到文件活动。文件或文件系统显然发生了某种更新,因为使用 ls 监视后备文件显示文件时间发生变化,而 sha1sum 显示内容正在发生变化,但这实际上涉及磁盘访问还是全部发生在记忆?
基本上,我试图避免必须执行 tmpfs 解决方法,因为使用 SHM 来支持 SHM 似乎是解决可能不存在的问题的丑陋解决方法。
shared-memory ×10
memory ×4
linux ×3
linux-kernel ×2
mmap ×2
tmpfs ×2
c ×1
elf ×1
filesystems ×1
history ×1
kernel ×1
resources ×1