Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 有没有办法让宏创建多个静态分配的全局数组,这些数组都是页面对齐的?_C - Fatal编程技术网

C 有没有办法让宏创建多个静态分配的全局数组,这些数组都是页面对齐的?

C 有没有办法让宏创建多个静态分配的全局数组,这些数组都是页面对齐的?,c,C,我知道这个问题要求的是一个非常棘手的问题,因为这样做的正确方法可能是创建一个内存分配器,因为我正在为无法访问std的裸机编码。但是,有没有一种方法可以在宏的循环中创建多个静态数组 比如说 unsigned int page_table_directory[1024] __attribute__ ((aligned (4096))); unsigned int page_table[1024] __attribute__ ((aligned (4096))); 我想要一种方法来制作一个宏,它可以

我知道这个问题要求的是一个非常棘手的问题,因为这样做的正确方法可能是创建一个内存分配器,因为我正在为无法访问std的裸机编码。但是,有没有一种方法可以在宏的循环中创建多个静态数组

比如说

unsigned int page_table_directory[1024] __attribute__ ((aligned (4096)));
unsigned int page_table[1024] __attribute__ ((aligned (4096)));
我想要一种方法来制作一个宏,它可以生成64个页表数组,并将地址加载到页表目录中

页面表目录的内容如下所示

page_table_directory = [0x10c000 ,0x10b000, 0x10a000, ...63 more addresses..., 0x0, 0x0, ... ]
这些地址中的每一个都指向单独的页对齐的静态分配数组

进一步阐述:

现在,我有一个黑客设置,我声明和分配

unsigned int page_table_0[1024] __attribute__ ((aligned (4096)));
unsigned int page_table_1[1024] __attribute__ ((aligned (4096)));
unsigned int page_table_2[1024] __attribute__ ((aligned (4096)));
unsigned int page_table_3[1024] __attribute__ ((aligned (4096)));

# then in main
main() {
page_table_directory[0] = (unsigned int)page_table_0;
page_table_directory[1] = (unsigned int)page_table_1;
page_table_directory[2] = (unsigned int)page_table_2;
page_table_directory[3] = (unsigned int)page_table_3;
}
因此,本质上,我希望将主代码移动到宏中,并使其成为循环,以便可以声明许多页面

有没有办法让宏创建多个静态分配的全局数组,这些数组都是页面对齐的

是的,有

除了使其成为循环之外,我还想将主代码移动到宏中,以便可以声明许多页面

预处理器有宏,但没有循环。无论采用哪种方法,都必须枚举预处理器中的所有案例。下面是一个简单的示例,其中包含一个通用宏,该宏接受一个函数并扩展到某个极限,最大值为5

#define FORTO_0(func, arg)  
#define FORTO_1(func, arg)  func(0, arg)
#define FORTO_2(func, arg)  FORTO_1(func, arg) func(1, arg)
#define FORTO_3(func, arg)  FORTO_2(func, arg) func(2, arg)
#define FORTO_4(func, arg)  FORTO_3(func, arg) func(3, arg)
#define FORTO_5(func, arg)  FORTO_4(func, arg) func(4, arg)
// etc. add... more....
#define FORTO_X(num, func, arg)  FORTO_##num(func, arg)

// num - a number, like 5, will iterate from 0...(N-1)
// func - a function to apply on numbers
// arg - passed as the second argument to func
#define FORTO(num, func, arg)    FORTO_X(num, func, arg)


#define TO  5

#define DEF_PAGE_TABLE(N, _)  \
        unsigned int page_table_##N[1024] __attribute__((__aligned__(4096)));
FORTO(TO, DEF_PAGE_TABLE, _)

int main() {
    unsigned int *page_table_directory[TO];

#define POINT_PAGE_TABLE_DIRECTORY(N, _)   \
        page_table_directory[N] = page_table_##N;
    FORTO(TO, POINT_PAGE_TABLE_DIRECTORY, _);
}
有没有办法让宏创建多个静态分配的全局数组,这些数组都是页面对齐的

是的,有

除了使其成为循环之外,我还想将主代码移动到宏中,以便可以声明许多页面

预处理器有宏,但没有循环。无论采用哪种方法,都必须枚举预处理器中的所有案例。下面是一个简单的示例,其中包含一个通用宏,该宏接受一个函数并扩展到某个极限,最大值为5

#define FORTO_0(func, arg)  
#define FORTO_1(func, arg)  func(0, arg)
#define FORTO_2(func, arg)  FORTO_1(func, arg) func(1, arg)
#define FORTO_3(func, arg)  FORTO_2(func, arg) func(2, arg)
#define FORTO_4(func, arg)  FORTO_3(func, arg) func(3, arg)
#define FORTO_5(func, arg)  FORTO_4(func, arg) func(4, arg)
// etc. add... more....
#define FORTO_X(num, func, arg)  FORTO_##num(func, arg)

// num - a number, like 5, will iterate from 0...(N-1)
// func - a function to apply on numbers
// arg - passed as the second argument to func
#define FORTO(num, func, arg)    FORTO_X(num, func, arg)


#define TO  5

#define DEF_PAGE_TABLE(N, _)  \
        unsigned int page_table_##N[1024] __attribute__((__aligned__(4096)));
FORTO(TO, DEF_PAGE_TABLE, _)

int main() {
    unsigned int *page_table_directory[TO];

#define POINT_PAGE_TABLE_DIRECTORY(N, _)   \
        page_table_directory[N] = page_table_##N;
    FORTO(TO, POINT_PAGE_TABLE_DIRECTORY, _);
}

显示建议的宏的用例。地址总是可以从基址计算出来。你能告诉我你到底想要宏扩展到什么吗?那么,二维数组呢<代码>无符号整型页面\表\目录[1024]
无符号整数页_表[64][1024]。然后在运行时为(i=0;i<64;i++)page_table_目录[i]=(unsigned int)(page_tables[i])执行
循环。不需要宏。@PSkocik:每个宏都是4K(假设
sizeof(unsigned int)==4
),所以只要整个数组都是4K对齐的,它们都会对齐,没有间隙。展示建议的宏的用例。地址总是可以从基址计算出来。你能告诉宏到底要扩展到什么吗?那么,二维数组呢<代码>无符号整型页面\表\目录[1024]
无符号整数页_表[64][1024]。然后在运行时为(i=0;i<64;i++)page_table_目录[i]=(unsigned int)(page_tables[i])执行
循环。不需要宏。@PSkocik:每个宏都是4K(假设
sizeof(unsigned int)==4
),所以只要整个数组都对齐到4K,并且没有间隙,它们都将对齐。