DVD0423 发表于 2015-04-09 15:16

求助,内核函数使用方法

本帖最后由 DVD0423 于 2015-04-09 15:19 编辑

rt,最近学习内核一直碰壁,很小的问题都要解决很久。
请问我想在模块中使用下面的函数,但是它的定义在kernel/sched/fair.c文件中,我怎么使用呢?
static inline struct task_struct *task_of(struct sched_entity *se)
{
#ifdef CONFIG_SCHED_DEBUG
    WARN_ON_ONCE(!entity_is_task(se));
#endif
    return container_of(se, struct task_struct, se);
}

问题2,我想在模块中包含一个头文件kernel/sched/sched.h应该怎么包含?我知道在include下的可以直接包含,但是这个不是在include目录下,我觉得包含绝对路径太傻了。

两个问题应该对有经验的人来说都很简单,但是我是入门者,所以请朋友帮帮忙。
@humjb_1983
@瀚海书香
@镇水铁牛
@......
{:qq23:}

amarant 发表于 2015-04-09 16:20

本帖最后由 amarant 于 2015-04-09 16:21 编辑

kernel/sched/sched.h 这个文件放在这个位置,就是不希望外面的人包含它。可以把它理解成私有的头文件。只给kernel/sched/目录下的文件使用的。

如果你要很不优雅地写,那么就这么做:
#include "../../kernel/sched/sched.h"

DVD0423 发表于 2015-04-09 16:28

原来如此,那另一个问题呢。谢谢了回复 2# amarant


   

amarant 发表于 2015-04-09 16:29

回复 3# DVD0423


    static的方法只有本模块能使用,这是c语言的特性。

DVD0423 发表于 2015-04-09 16:32

回复 4# amarant
那就只有自己再拷贝一份了。
还有个问题:
我包含了sched.h,然后调用cpu_rq();但是里面用到了DECLARE_PER_CPU(struct rq, runqueues);编译时显示runqueues未定义
怎么解决呢?


   

amarant 发表于 2015-04-09 16:44

回复 5# DVD0423


    兄弟,你c语言的书先仔细学习一下吧。。

DVD0423 发表于 2015-04-09 17:23

回复 6# amarant

我不是请教您static如何使用的,而且我说的自己实现这个函数也没错吧(“那就只有自己再拷贝一份了。”)

我的修改本意是不要实现模块的,直接改内核,只是因为怕把系统搞崩了,才想法把自己的代码提取出来。因为是内核菜鸟,所以又很多事不肯定而已。我用的只是cpu_rq(rq),然后包含了sched.h 但是系统提醒我runqueues未定义。我不知道原因,问问怎么了?现在好像知道了,可能是DECLARE_PER_CPU(type, name)和DEFINE_PER_CPU(type, name)的区别

版主达人,我很困惑为什么论坛发帖,动不动就给人这个意思:“你xxx都不知道,还是先XXX吧”。真受不了。我弱只说明内核方面弱,并不代表什么都不会好嘛。





   

amarant 发表于 2015-04-09 18:55

回复 7# DVD0423


    没有冒犯的意思。像编译时显示runqueues未定义,这一类是纯C的问题。内核对C的运用是非常灵活的。我建议你把C学扎实一点而已。

因为大家都很忙,都是工作的人,每天一堆的事情在头上,是没什么时间在BBS上的。希望理解
可能会让你很不舒服,但请见谅

镇水铁牛 发表于 2015-04-09 20:32

本帖最后由 镇水铁牛 于 2015-04-10 07:34 编辑

你再包含这几个头文件试试看
#include <linux/cpu.h>
#include <linux/cpuset.h>
#include <linux/percpu.h>
如果还不行,把那个per cpu变量extern试试看。

amarant 发表于 2015-04-10 08:02

回复 9# 镇水铁牛


    它用的是declare,这个是extern的。。所以编译的时候找不到了
页: [1] 2
查看完整版本: 求助,内核函数使用方法