当前位置:  技术问答>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。
下边是驱动代码。

//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     

    
 
 

您可能感兴趣的文章:

 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • Linux进程的内核栈和用户栈概念,相互关系及切换过程
  • 进程内核栈和操作系统内核栈的关系
  • 内核进程与用户进程间的通信
  • 请问linux进程的哪些信息保存在内核里?哪些信息又保存在进程空间里?谢谢
  • 内核进程间发送信号用哪个函数,如果没有这东西,那内核里异步通知用哪个东西
  • Linux内核进程与应用进程的通信方式有哪些?
  • linux 内核进程堆问题,大家指教
  • 关于内核进程和用户层命令不是很理解?
  • 如何利用Linux内核线程来保存用户进程
  • 【求助】多进程中 内核信号量无效?
  • 进程系统调用陷入内核的不解
  • 请教一个linux进程内核栈的问题
  • linux内核高手进!关于调用__fork()时0号进程的子进程才能与父进程共享PID的困惑
  • 内核进程线程问题,大家指教
  • 内核进程线程问题,大家指教 iis7站长之家
  • “模块”在内核中运行与作为单独进程运行在机制上有什么区别与联系?
  • linux 可不可以编译成一个单进程的内核
  • linux内核缓冲区与进程缓冲区。
  • 请教一下,进程调度时在导入新进程的cr3之后,CPU是怎么区分当前正处于内核而不去使用新的页目录呢?
  • 中断上下文,进程上下文 ,内核抢占,用户抢占,中断
  • 求助: 进程调度内核分析
  • Linux内核中影响tcp三次握手的一些协议配置
  • Fedora Core 2自带的内核升级程序下载下来内核后,要不要再编译一遍内核?
  • TCP协议四次断连过程介绍及Linux内核协议栈中相关设置项
  • Linux中内核线程不访问内核态地址空间?
  • CentOS 6内核升级:下载编译启用新内核版本详细过程
  • 2.6内核下编译2.4内核
  • linux内核中的likely宏和unlikely宏介绍及用法
  • 谁能提供kgdb内核补丁内核模块的下载
  • CentOS 6.5 下载地址及如何升级内核(kernel)版本到 3.10.28
  • 编译新内核后怎么进入原来内核


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3