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