- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试创建一个 zram我的目标设备上的设备。如果 zram 磁盘大小超过 100GB,我的目标无法分配内存,但磁盘大小为 50GB 或更小就可以了。
在 Linux 上设置 zram device disksize 有没有限制?我的目标设备只有 2GB 的 RAM 内存。
最佳答案
我想您可以在 64 位平台上提供最大为 UINT64_MAX - 4095 = 18446744073709547520 的数字。
https://github.com/torvalds/linux/blob/master/drivers/block/zram/zram_drv.h#L101 https://github.com/torvalds/linux/blob/master/drivers/block/zram/zram_drv.c#L1506 https://github.com/torvalds/linux/blob/master/drivers/block/zram/zram_drv.c#L901
那么我们有:
... disksize_store(...) {
u64 disksize;
...
// ok, we can give at least UINT64_MAX here.
disksize = unsigned long long memparse(...);
// PAGE_ALIGN, PAGE_SIZE = 1<<12
disksize = PAGE_ALIGN(disksize)
= (((disksize)+((PAGE_SIZE)-1))&(~((typeof(disksize))(PAGE_SIZE)-1)))
= (disksize + ((1<<12)-1))&(~((1<<12)-1))
= (disksize + 4095) & 0xfffffffffffff000
// ^^^^^^^^^^^^^^^ this can overflow
// so max number is UINT64_MAX - 4095 so it doesn't overflow
// otherwise this macro will return 0
...
if (!zram_meta_alloc(..., disksize) {
...
return ...;
}
...
zram->disksize = disksize;
...
}
那么让我们看看 zram_meta_alloc:
... zram_meta_alloc(..., disksize) {
...
num_pages = disksize >> PAGE_SHIFT;
// max num_pages = 0xfffffffffffff = UINT64_MAX >> PAGE_SHIFT
... = vzalloc(num_pages * sizeof(*zram->table));
// ^^^^^^^^^^^^^^^ this can overflow
...
}
vzallloc 将 unsigned long 作为参数。 ULONG_MAX 在 64 位平台上应该是 UINT64_MAX。 sizeof(*zram->table)
等于sizeof(unsigned long) + sizeof(unsigned long) + [optional: + sizeof(ktime_t)] + padding
(参见 here)。没有填充,假设 64 位平台,sizeof(unsigned long) = 8
那应该等于 8+8[+8] = 16 or 24
.但无论如何,最大 num_pages 等于 UINT64_MAX >> 12
,所以要在 64 位乘法上溢出它,我们需要 sizeof(*zram->table) = 2^PAGE_SIZE = 4096
,这不应该发生(除非编译器决定给 zram->table 结构提供超过 4000 字节的填充)。所以我们剩下 UINT64_MAX - 4095。
所以我们剩下的是,磁盘大小的最大数量是 UINT64_MAX-4095
.如果您给磁盘大小等于 UINT64_MAX - x
, 其中0 <= x < 4095
, 而不是因为 PAGE_ALIGN 宏,磁盘大小将被有效地设置为 0。可能这应该提交给内核开发人员,他们应该修改 PAGE_ALIGN 宏以支持这样的数字。
6 天前 vzalloc 调用了对 array_size
的调用添加以防止溢出 this commit .
关于linux - 在 Linux 上设置 zram device disksize 有什么限制吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50922303/
在我的机器上配置 Vagrant 环境期间,我收到了这条消息: Vagrant: * Unknown configuration section 'disksize'. 它在插件已经安装后显示。 这是
我正在尝试创建一个 zram我的目标设备上的设备。如果 zram 磁盘大小超过 100GB,我的目标无法分配内存,但磁盘大小为 50GB 或更小就可以了。 在 Linux 上设置 zram devic
我是一名优秀的程序员,十分优秀!