我的设备内存较差。过夜运行 memtest 显示所有故障地址都在该0x7d0000000 - 0x7f0000000
范围内。我计划更换 RAM,但在那之前,我已经禁用了它周围的 2GB 块memmap=
:
# cat /proc/cmdline
BOOT_IMAGE=/boot/vmlinuz-6.5.0-25-generic root=UUID=5277c53f-b2cd-4301-8fdf-0b2119430870 ro memmap=2G$0x0000000790000000 quiet splash vt.handoff=7
这些命令行选项似乎确实得到了内核的认可:
[ 0.000000] user-defined physical RAM map:
[ 0.000000] user: [mem 0x0000000000000000-0x000000000009efff] usable
[ 0.000000] user: [mem 0x000000000009f000-0x00000000000fffff] reserved
[ 0.000000] user: [mem 0x0000000000100000-0x0000000019e6a017] usable
[ 0.000000] user: [mem 0x0000000019e6a018-0x0000000019e7ae57] usable
[ 0.000000] user: [mem 0x0000000019e7ae58-0x000000002cb82fff] usable
[ 0.000000] user: [mem 0x000000002cb83000-0x000000002ed2ffff] reserved
[ 0.000000] user: [mem 0x000000002ed30000-0x000000002edacfff] ACPI data
[ 0.000000] user: [mem 0x000000002edad000-0x000000002f29bfff] ACPI NVS
[ 0.000000] user: [mem 0x000000002f29c000-0x000000002fd0efff] reserved
[ 0.000000] user: [mem 0x000000002fd0f000-0x000000002fd0ffff] usable
[ 0.000000] user: [mem 0x000000002fd10000-0x000000003cffffff] reserved
[ 0.000000] user: [mem 0x00000000e0000000-0x00000000efffffff] reserved
[ 0.000000] user: [mem 0x00000000fe000000-0x00000000fe010fff] reserved
[ 0.000000] user: [mem 0x00000000fec00000-0x00000000fec00fff] reserved
[ 0.000000] user: [mem 0x00000000fed00000-0x00000000fed03fff] reserved
[ 0.000000] user: [mem 0x00000000fee00000-0x00000000fee00fff] reserved
[ 0.000000] user: [mem 0x00000000ff000000-0x00000000ffffffff] reserved
[ 0.000000] user: [mem 0x0000000100000000-0x000000078fffffff] usable
[ 0.000000] user: [mem 0x0000000790000000-0x000000080fffffff] reserved
[ 0.000000] user: [mem 0x0000000810000000-0x00000008beffffff] usable
但是,我仍然遇到段错误,表面上是在保留的地址范围内:
Mar 09 20:47:40 srv0 kernel: udisksd[656]: segfault at 7fe974786218 ip 00007fe974786218 sp 00007ffcd10d1848 error 7 in libbd_swap.so.3.0.0[7fe974785000+2000] likely on CPU 7 (core 3, socket 0)
根据这一页,我应该将其解释为 udiskd 尝试写入保留地址0x7fe974786218
(错误 7)。乍一看,该0x7f
地址似乎与 memtest 发现的坏 RAM 相符,但相差了几个数量级,因为它指向 140 TB 的值。我的机器有32GB。
如果不是内存地址,该segfault at X
值代表什么?
答案1
你在这里混淆了地址空间;这是虚拟内存的udisks
进程的进程地址空间。您已预订物理地址空间。
当进程尝试访问未映射到任何物理页或不允许访问的虚拟内存地址时,就会发生段错误。
物理地址和虚拟地址彼此无关,保留一个表将虚拟地址映射到物理地址就是处理器具有内存管理单元。所以这里的问题是软件访问了错误的内存地址——一个错误。
当然,这个bug可能不是软件bug,而是由于你没有预留的RAM损坏造成的;没有人能知道这一点!无法保证昨天晚上的内存测试今天仍然适用,尤其是在多个物理地址范围上存在问题的情况下。老实说,你所做的事情是相当危险的——你知道你的内存可能会随机损坏数据,你希望最好能捕获所有有问题的内存并阻止其使用。如果您使用计算机执行的操作事情,我不会那样做。既然你说你打算更换内存,那就删除整个 RAM 模块现在,并在可能的情况下恢复工作,或者赶紧更换 RAM。