我不擅长英语,我会尽力使问题清楚。
假设我有一个结构:
struct A {
/* the first half */
int a;
int b;
/* the second half */
int c;
int d;
} ;
我们知道A的成员将被连续存储在内存中。但是,我想让A的前半部分和后半部分存储在两个不同的内存页面中,这意味着struct在内存中被分区。我怎样才能实现呢? 假设struct A是linux内核中的一个结构,所以我在内核空间编程。内核版本是3.10。
答案 0 :(得分:1)
如果目标是使struct memory非连续使用指针并执行kmalloc。
struct first_half {
int a;
int b;
};
struct second_half {
int c;
int d;
};
struct A {
/* the first half */
struct first_half *fh;
/* the second half */
struct second_half *sh;
} ;
fh = (struct first_half *) kmalloc();
sh = (struct second_half *) kmalloc();
答案 1 :(得分:0)
您可以通过在结构成员之间添加填充并在页面边界上分配填充来实现这一点,例如:
struct A {
int a, b;
char padding[PAGE_SIZE - 2 * sizeof(int)];
int c, d;
};
但是,它只处理一个大小的页面(例如4KB),而有大量不同大小的页面(x86_64上有2MB和1GB)。
或者,如果不希望填充,请以这种方式为结构分配内存,以便对象跨越页面边界。