当前位置: 技术问答>linux和unix
内核实现进程亲缘性迁移的问题
来源: 互联网 发布时间:2017-05-26
本文导语: 我这个驱动模块实现的功能,是将系统所有非驻留进程都迁移至cpu0之外的cpu。 下边是驱动代码。 //rtkernel.c #include #include #include #include #include #include MODULE_LICENSE("GPL"); struct cpumask mask; struct task_struct *task; v...
我这个驱动模块实现的功能,是将系统所有非驻留进程都迁移至cpu0之外的cpu。
下边是驱动代码。
Makefile:
这个编译加载,能够很完美地实现我想要的功能。我的系统是fedora20 x86_64四核,加载驱动后,系统进程都迁移至cpu1、cpu2、cpu3,卸载后又可以恢复。
但是,rtkernel.c分成几个文件后(因为要逐渐对这个驱动进行扩展),就出现了问题,下边详细说明。分开的文件如下
Makefile:
编译没问题,但加载之后提示:
insmod: ERROR: could not insert module rtkernel.ko: Unknown symbol in module
我用dmesg打印,看到
[10179.953132] rtkernel: Unknown symbol kallsyms_lookup_name (err 0)
我推测可能的问题会是
1.根据错误提示Unknown symbol kallsyms_lookup_name,我的驱动中用kallsyms_lookup_name导出了一个内核符号,但同样的语句在前边单文件中没问题,分开之后却出了问题,这应该不可能。
2.Makefile文件写的不对。
3.头文件包含有问题。
对这三个推测,我都仔细检查,感觉都对,却还是没有解决问题。只能在这里求教了。
下边是驱动代码。
//rtkernel.c
#include
#include
#include
#include
#include
#include
MODULE_LICENSE("GPL");
struct cpumask mask;
struct task_struct *task;
void (*rt_sched_setaffinity)(pid_t pid, const struct cpumask *in_mask);
void export_symbol(void)
{
rt_sched_setaffinity = (void *)kallsyms_lookup_name("sched_setaffinity");
}
static int rtkernel_init(void)
{
rt_sched_setaffinity = kallsyms_lookup_name("sched_setaffinity");
cpumask_clear(&mask);
cpumask_setall(&mask);
cpumask_clear_cpu(0, &mask);
task = NULL;
for_each_process(task)
{
rt_sched_setaffinity(task->pid, &mask);
}
return 0;
}
static void rtkernel_exit(void)
{
cpumask_clear(&mask);
cpumask_setall(&mask);
task = NULL;
for_each_process(task)
{
rt_sched_setaffinity(task->pid, &mask);
}
}
module_init(rtkernel_init);
module_exit(rtkernel_exit);
Makefile:
ifneq ($(KERNELRELEASE),)
obj-m := rtkernel.o
else
KERNELDIR ?= /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
defualt:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
endif
clean:
rm -rf *.order *.symvers *.o *~ *.ko *.mod.c
这个编译加载,能够很完美地实现我想要的功能。我的系统是fedora20 x86_64四核,加载驱动后,系统进程都迁移至cpu1、cpu2、cpu3,卸载后又可以恢复。
但是,rtkernel.c分成几个文件后(因为要逐渐对这个驱动进行扩展),就出现了问题,下边详细说明。分开的文件如下
//rtkernel.h
#ifndef RTKERNEL_H
#define RTKERNEL_H
#include
#include
#include
extern void (*rt_sched_setaffinity)(pid_t pid, const struct cpumask *in_mask);
extern void export_symbol(void);
extern int set_allprocess_affinity(void);
extern int resume_allprocess_affinity(void);
#endif
//rtkernel.c
#define _GNU_SOURCE
#include "rtkernel.h"
MODULE_LICENSE("GPL");
static int rtkernel_init(void)
{
export_symbol();
set_allprocess_affinity();
//printk(KERN_DEBUG "hello world.n");
return 0;
}
static void rtkernel_exit(void)
{
resume_allprocess_affinity();
//printk(KERN_DEBUG "Goodbye world. n");
}
module_init(rtkernel_init);
module_exit(rtkernel_exit);
//symbol.h
#ifndef SYMBOL_H
#define SYMBOL_H
#include
#include
#include
#include
void export_symbol(void);
void (*rt_sched_setaffinity)(pid_t pid, const struct cpumask *in_mask);
#endif
//symbol.h
#include "symbol.c"
void export_symbol(void)
{
rt_sched_setaffinity = (void *)kallsyms_lookup_name("sched_setaffinity");
}
//affinity.h
#ifndef AFFINITY_H
#define AFFINITY_H
#include
#include
extern void (*rt_sched_setaffinity)(pid_t pid, const struct cpumask *in_mask);
int set_allprocess_affinity(void);
int resume_allprocess_affinity(void);
#endif
//affinity.c
#include "affinity.h"
int set_allprocess_affinity(void)
{
struct cpumask mask;
struct task_struct *task;
cpumask_clear(&mask);
cpumask_setall(&mask);
cpumask_clear_cpu(0, &mask);
task = NULL;
for_each_process(task)
{
rt_sched_setaffinity(task->pid, &mask);
}
return 0;
}
int resume_allprocess_affinity(void)
{
struct cpumask mask;
struct task_struct *task;
cpumask_clear(&mask);
cpumask_setall(&mask);
task = NULL;
for_each_process(task)
{
rt_sched_setaffinity(task->pid, &mask);
}
return 0;
}
Makefile:
ifneq ($(KERNELRELEASE),)
obj-m := rtkernel.o
rtkernel-objs += symbol.o
rtkernel-objs += affinity.o
else
KERNELDIR ?= /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
defualt:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
endif
clean:
rm -rf *.order *.symvers *.o *~ *.ko *.mod.c
编译没问题,但加载之后提示:
insmod: ERROR: could not insert module rtkernel.ko: Unknown symbol in module
我用dmesg打印,看到
[10179.953132] rtkernel: Unknown symbol kallsyms_lookup_name (err 0)
我推测可能的问题会是
1.根据错误提示Unknown symbol kallsyms_lookup_name,我的驱动中用kallsyms_lookup_name导出了一个内核符号,但同样的语句在前边单文件中没问题,分开之后却出了问题,这应该不可能。
2.Makefile文件写的不对。
3.头文件包含有问题。
对这三个推测,我都仔细检查,感觉都对,却还是没有解决问题。只能在这里求教了。
|
把rtkernel.c改名成mykernel.c,Makefile改成下面这样。楼主可以看看Documentation/kbuild/makefiles.txt
ifneq ($(KERNELRELEASE),)
obj-m := rtkernel.o
rtkernel-y += symbol.o
rtkernel-y += affinity.o
rtkernel-y += mykernel.o
ifneq ($(KERNELRELEASE),)
obj-m := rtkernel.o
rtkernel-y += symbol.o
rtkernel-y += affinity.o
rtkernel-y += mykernel.o
您可能感兴趣的文章:
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。