gpt4 book ai didi

c - 指针值在函数调用过程中发生变化

转载 作者:行者123 更新时间:2023-11-30 20:25:03 25 4
gpt4 key购买 nike

我在内核中有以下结构

struct state {
/* Current algorithm iteration */
int tune_id;
/* Thread id */
pid_t tid;
#ifndef __KERNEL__
/* Paths */
char *stats_path;
char *budget_path;
char *controller_path;
#endif /* __KERNEL__ */
int budget;
/* Stats */
struct statistics prev_stats;
struct parameters current_params;
u64 cur_time;
/* Algorithm specific data */
void *data;
};

struct tuning {
struct algorithm *algorithm;
struct state *state;
struct energy energy;
};

我定义了一个函数tune(),如下所示:

void tune(struct task_struct *task) {
struct statistics stats;
struct state *state;
get_current_stats(&stats);
state = task->tuning.state;

get_current_params(&state->current_params);
compute_energy(&stats, state);
}

其他函数定义为:

void get_current_params(struct parameters *params)
{
printk(KERN_DEBUG "get_current_params: parameters:0x%X\n", (unsigned int) params);
params->cpu_frequency_MHZ = (cpufreq_get(0) + 500) / 1000;
params->mem_frequency_MHZ = (memfreq_get() + 500) / 1000;
}

void compute_energy(struct statistics *stats, struct state *state)
{
struct statistics *diffs;
struct frontier *frontier;
u64 energy_budget;
int threshold;

int i,j;
struct configuration s;
struct configuration emin;

#ifdef TIMING
u64 ns;
ns = get_thread_time();
#endif

#ifdef DEBUG
#ifdef __KERNEL__
printk(KERN_DEBUG "compute_energy: parameters:0x%X\n", (unsigned int) &state->current_params);
#endif /* __KERNEL__ */
#endif
}

当我调用tune()时,输出如下:

[    7.160139] get_current_params: parameters:0xBF396BA0
[ 7.160298] compute_energy: parameters:0xBF396B98

我不明白为什么地址相差 0x8。这反过来会在内核中导致除以 0 异常,因为 structparameters 的值似乎为 0,而不是由 get_current_params 初始化的值

为什么struct state的成员current_params的地址在函数调用过程中会发生变化?

更新:
我已验证此错误仅发生在 PID 0 上。
查看 include/linux/init_task.h,我发现 PID 0 是静态初始化的。这是我在 PID 0 和其他任务之间发现的唯一区别。这可能是我遇到的问题的原因吗?

最佳答案

据我所知,您是对的,两个地址应该相同。所以只能有一种选择:同时内核中的任务信息发生变化。

考虑一下您的代码片段:

void tune(struct task_struct *task) {
...
struct state *state;
...
state = task->tuning.state;

您正在管理两个您可能无法控制的结构(您应该检查一下):

(*task): struct task_struct

(*task->tuning.state): struct state

因此,当在 tune() 中时,您调用

get_current_params(&state->current_params);
compute_energy(&stats, state);

两个 printk 函数之间可能会发生一些事情,所以我认为你必须把注意力集中在这个地方。尝试在调用 get_current_params() 之前保存 task->tuning.state,以便您可以在调用 compute_energy() 后检查它是否仍然是相同的值.

希望这有帮助。

关于c - 指针值在函数调用过程中发生变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30904657/

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