解析linux内核的kexec_core.c下的sanity_check_segment_list函数
时间: 2024-05-10 17:20:26 浏览: 171
sanity_check_segment_list函数的主要作用是检查传递给kexec系统调用的内存段列表是否合法。这个函数会遍历所有的内存段,检查它们的起始地址和大小是否合法,以及它们是否重叠。如果发现任何一个内存段不合法,函数就会返回错误。
函数的具体实现如下:
```c
static int sanity_check_segment_list(struct kexec_segment *segment,
unsigned long nr_segments)
{
unsigned long i;
unsigned long long end;
for (i = 0; i < nr_segments; i++) {
if (segment[i].buf == NULL)
return -EINVAL;
if (segment[i].bufsz == 0)
return -EINVAL;
/*
* Check for buffer overflow.
*/
end = segment[i].buf + segment[i].bufsz;
if (end < segment[i].buf)
return -EINVAL;
if (i == 0)
continue;
if (segment[i-1].buf + segment[i-1].bufsz >
segment[i].buf)
return -EINVAL;
if (segment[i-1].buf + segment[i-1].bufsz == segment[i].buf)
if (segment[i-1].mem == segment[i].mem)
segment[i-1].bufsz += segment[i].bufsz;
else
return -EINVAL;
}
return 0;
}
```
函数首先检查每个内存段的起始地址和大小是否合法,如果有一个不合法就返回错误码-EINVAL。然后,函数检查每个内存段是否与之前的段重叠,如果发现重叠就返回错误码-EINVAL。
如果所有的内存段都合法,函数就返回0表示成功。
阅读全文