Operating system 内核空间中用于交换两个非重叠4KB数组内容的代码

Operating system 内核空间中用于交换两个非重叠4KB数组内容的代码,operating-system,Operating System,内核空间中的以下代码用于交换两个不重叠的4KB数组的内容,是否存在任何错误: 1: void swap4kb(void* a, void* b) { 2: char tmp[4096]; 3: assert(a != NULL); 4: assert(b != NULL); 5: memcpy(tmp, a, 4096); 6: memcpy(a, b, 4096); 7: memcpy(b, tmp, 4096); 8: } 它有什么bug吗 它没有bug;假设它不需

内核空间中的以下代码用于交换两个不重叠的4KB数组的内容,是否存在任何错误:

1: void swap4kb(void* a, void* b) {
2:   char tmp[4096];
3:   assert(a != NULL);
4:   assert(b != NULL);
5:   memcpy(tmp, a, 4096);
6:   memcpy(a, b, 4096);
7:   memcpy(b, tmp, 4096);
8: }
它有什么bug吗

它没有bug;假设它不需要“原子化”完成,并且假设堆栈上有足够的空间用于
chartmp[4096]数组

然而,许多内核使用“每个任务一个内核堆栈”模型,这意味着有动机使用小内核堆栈。例如,如果有100个进程,每个进程平均有10个线程;然后,1个MiB内核堆栈加起来就相当于内核堆栈消耗的近1gib的RAM。使用4kib内核堆栈是有意义的(因为4kib在大多数系统中都是页面大小),在这种情况下,您的代码将溢出堆栈,因此可能会被认为是错误的

无论如何;错误在于首先假定此代码是有意义的。通常,您会使用“指向数组的指针”并交换指针,这样可以避免复制数据本身的开销

它有什么bug吗

它没有bug;假设它不需要“原子化”完成,并且假设堆栈上有足够的空间用于
chartmp[4096]数组

然而,许多内核使用“每个任务一个内核堆栈”模型,这意味着有动机使用小内核堆栈。例如,如果有100个进程,每个进程平均有10个线程;然后,1个MiB内核堆栈加起来就相当于内核堆栈消耗的近1gib的RAM。使用4kib内核堆栈是有意义的(因为4kib在大多数系统中都是页面大小),在这种情况下,您的代码将溢出堆栈,因此可能会被认为是错误的


无论如何;错误在于首先假定此代码是有意义的。通常,您会使用“指向数组的指针”并交换指针,这样可以避免复制数据本身的开销。

谢谢。那么我如何修改它以使用“指向数组的指针”@user836026:这就像“
swap_指针(void**a,void**b){void*temp=*a;*a=*b;*b=temp;}
”;但您需要更改使用数组的所有代码,以便它们使用(可修改)指针而不是固定位置,首先将它们定义为指针(例如,可能是
uint8_t data1[4096];void*a=data1;
而不是
uint8_t a[4096];
),谢谢。那么我如何修改它以使用“指向数组的指针”@user836026:这就像“
swap_指针(void**a,void**b){void*temp=*a;*a=*b;*b=temp;}
”;但您需要更改使用数组的所有代码,以便它们使用(可修改)指针而不是固定位置,首先将它们定义为指针(例如,可能
uint8_t data1[4096];void*a=data1;
而不是
uint8_t a[4096];
)。