Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.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
如何在linux中对齐kmalloc()地址_C_Memory Management_Linux Kernel - Fatal编程技术网

如何在linux中对齐kmalloc()地址

如何在linux中对齐kmalloc()地址,c,memory-management,linux-kernel,C,Memory Management,Linux Kernel,我在内核空间有一个要求,我必须用64K对齐地址对设备寄存器进行编程。目前我正在使用kmalloc()分配内存,但不确定如何对齐此64K。linux是否提供了实现这一点的API? 我是否需要编写自己的代码来执行相同的操作?尝试以下方法: 首先调用kmem_cache_create(…)函数为您的结构创建一个64K对齐的缓存池,如下所示: buff_64k_cachep = kmem_cache_create("buff_64k_cache",

我在内核空间有一个要求,我必须用64K对齐地址对设备寄存器进行编程。目前我正在使用kmalloc()分配内存,但不确定如何对齐此64K。linux是否提供了实现这一点的API?
我是否需要编写自己的代码来执行相同的操作?

尝试以下方法:

首先调用kmem_cache_create(…)函数为您的结构创建一个64K对齐的缓存池,如下所示:

    buff_64k_cachep = kmem_cache_create("buff_64k_cache",
                                     sizeof(struct test_struct),
                                     1<<16, /* 64k alignment */
                                     flags,
                                     );
buff\u 64k\u cachep=kmem\u cache\u create(“buff\u 64k\u cache”,
sizeof(结构测试结构),

1谢谢你的回复。我应该只使用kmalloc()。在网上阅读时,我看到的答案很少:例如,如果我想要2K的内存,分配4K的内存,在kmalloc()地址上添加64K偏移量,然后&~(0x10000)使其64K对齐。我不太明白这一点,因为我们在这里浪费内存。当他们说“位”和“字节”对齐方式是不同的。请帮我解决这个问题。在谷歌搜索和一些思考之后,我终于找到了这个逻辑。pusedocode:unal\u addr=(内存地址+对齐\u编号);aligned\u addr=unal\u addr-(unal\u addr%alignment\u编号)应该给出所需的对齐方式。如果这不正确,请告诉我。我不这么认为……您对齐的地址应该比未对齐的地址大