gpt4 book ai didi

c - 访问嵌套结构时出现段错误

转载 作者:太空宇宙 更新时间:2023-11-03 23:39:47 24 4
gpt4 key购买 nike

我在下面使用 kinfo_getproc:

int main() {

struct kinfo_proc *kp;

kp = kinfo_getproc(getpid());


printf("kp: %p\n", kp);
// kp: 0x801216000

printf("&kp: %p\n", &kp);
// &kp: 0x7fffffffeac0

printf("&thread: %p\n", &kp->ki_tdaddr);
// &thread: 0x801216398


printf("&thread->td_dupfd: %p\n", &kp->ki_tdaddr->td_dupfd);
// &thread->td_dupfd: 0xfffff801564d3650

// segfault accessing contents of td_dupfd
//printf("thread->td_dupfd: %d\n", kp->ki_tdaddr->td_dupfd);

return 1;
}

当我尝试访问 kp 结构中的结构时,程序出现段错误。

我从其他帖子中读到,问题可能是结构分配不当?以下内容来自 kinfo_getproc 的手册页:

RETURN VALUES
On success the kinfo_getproc() function returns a pointer to a struct
kinfo_proc structure as defined by <sys/user.h>. The pointer was
obtained by an internal call to malloc(3) and must be freed by the caller
with a call to free(3). On failure the kinfo_getproc() function returns
NULL.

如果返回值是一个指向已经被 malloced 的 kinfo_struct 的指针,不应该访问嵌套结构是否有效?我应该如何正确访问 kp 中的嵌套结构?

最佳答案

我想出了我的问题所在。

kp->ki_tdaddr 的值是一个位于内核空间的地址。换句话说,kp->ki_tdaddr 是指向位于内核内存中的结构的指针 - 它不能直接从用户空间访问,因此会出现段错误。

要做的是使用 kp->ki_tdaddr(内核空间地址)中的值和 kvm_read() 将位从内核空间传输到用户空间。

代码:

int main() {

struct thread thread;

/* a structure with process related info */
struct kinfo_proc *kp = kinfo_getproc(getpid());

/* a descriptor to access kernel virtual memory */
kvm_t *kd = kvm_open(NULL, NULL, NULL, O_RDONLY, NULL);

/* transfer bytes from ki_tdaddr to thread */
kvm_read(kd, (unsigned long) kp->ki_tdaddr, &thread, sizeof(thread));

/* can now access thread information */
printf("thread id: %jd\n", (intmax_t) thread.td_tid);

return 1;
}

关于c - 访问嵌套结构时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48956280/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com