如何在Linux内核中将结构存储在两个不同的内存页面中?

时间:2016-07-26 11:26:55

标签: c gcc memory-management struct linux-kernel

我不擅长英语,我会尽力使问题清楚。

假设我有一个结构:

struct A {
   /* the first half */
   int a;
   int b;
   /* the second half */
   int c;
   int d;
} ;

我们知道A的成员将被连续存储在内存中。但是,我想让A的前半部分和后半部分存储在两个不同的内存页面中,这意味着struct在内存中被分区。我怎样才能实现呢? 假设struct A是linux内核中的一个结构,所以我在内核空间编程。内核版本是3.10。

更新:为了明确我的目标,我画了下面的图片,这是我想要的内存布局,这可以避免浪费内存空间:
enter image description here

2 个答案:

答案 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)。

或者,如果不希望填充,请以这种方式为结构分配内存,以便对象跨越页面边界。