内存那些事儿(中)
文章翻译自 http://landley.net/writing/memory-faq.txt ,已有部分译文在内存那些事儿(上)。
什么是文件映射?
文件映射是文件内容在内存中的镜像。映射的管理数据有:
- 该映射对应哪个文件
- 从文件哪个位置开始映射的
- 映射页的读/写/执行权限
当文件映射通过 page fault 分配新的物理页时,页面内容是通过读取磁盘中对应位置的内容来初始化的。内核中会缓存着一些磁盘的文件页,这个缓存称为 page cache。新分配的物理页通常是和 page cache 共享的,在文件被读进内存的时候,其内容通常就会被内核缓存起来,这些缓存的页面可与进程共享,以降低系统内存的使用量。
对使用 MAP_SHARED 标志创建的文件映射进行写操作时会更新 page cache 内容,使更新后的文件内容立即对使用该文件的其他进程可见,并且最终 page cache 会被刷新到磁盘,更新磁盘上文件的内容。
对使用 MAP_PRIVATE 标志创建的文件映射进行写操作时会执行写时复制,即分配一个新的本地页面副本来存储更改。这些更改对其他进程不可见,并且不会更新到磁盘上。
请注意,这意味着对 MAP_SHARED 页面的写操作不会分配额外的物理页面(页面已经通过读取进入了 page cache,如果物理页面在其他地方需要(译注:如内存不足),数据可以刷新回磁盘),但对 MAP_PRIVATE 页面的写操作就需要分配额外的物理页面(page cache 中的副本与程序需要的本地副本会不一致,因此需要两个页面来存储它们,并且将 page cache 中的副本刷新回磁盘不会释放更改内容的本地副本)。
buddy分配器原理
buddy 分配器是 linux 内核中的经典分配器,学习 linux 内存管理的肯定绕不开它,甚至学习其他 linux 子系统的也会学学它,因为实在是太经典了。作者想从根本理解 buddy 分配器的原理,所以找来了 buddy 分配器最初提出的文章:A fast storage allocator 和 knuth 在The Art of Computer Programming, Fundamental Algorithms, Volume 1. 中深入分析 buddy 分配器一节(2.5 节)阅读,下面内容算是这两处内容的笔记了。
编译安装qemu-system-aarch64
因为要用 qemu monitor 的 info tlb 功能,奈何 ubuntu 官方版本太低,不支持,所以只能源码安装了。
树莓派使用杂记
树莓派更换内核、串口连接
设备:树莓派 3b+、sdcard、读卡器、usb 转串口线
环境:Ubuntu 20.04.6 LTS
树莓派镜像
我选择最新的 arm64 镜像,可以从 https://downloads.raspberrypi.org/raspios_arm64/images/ 查找下载,写这篇文章时最新的是 https://downloads.raspberrypi.org/raspios_arm64/images/raspios_arm64-2023-05-03/2023-05-03-raspios-bullseye-arm64.img.xz,下载之后得到 2023-05-03-raspios-bullseye-arm64.img.xz 文件:
qemu arm64 仿真
环境:ubuntu 20.04
准备工作
1 | $ sudo apt-get install qemu qemu-system-arm gcc-aarch64-linux-gnu gdb-multiarch |
编译内核
下载 Linux 源码:kernel 各版本下载
下载完内核之后,如放在 ~/linux-5.10
目录下:
1 | $ cd linux-5.10 |
Ubuntu 编译安装内核
本文是一个实操笔记,记录本地如何编译一个内核版本并安装到系统中使用。我使用的环境如下:
1 | $ cat /etc/issue |
以上表明我使用的是 Ubuntu 20.04.5,机器是 Intel 4 核 8 线程 CPU,每个频率都是 2.60GHz。我编译的版本是 Linux kernel 主线的版本,相当于从 github 上直接拉下来的代码,我下的代码最新的提交是 c1649ec55708ae42091a2f1bca1ab49ecd722d55。以下方法不保证比较老的内核也可以编译通过。