在RPI3 / ModelB

时间:2017-08-20 20:00:56

标签: linux linux-kernel real-time embedded-linux raspberry-pi3

我的目标是在linux内核中实现一个启用/禁用CPU内核的系统调用。

首先,我实现了一个系统调用,在4核系统中调用CPU3。

系统调用代码如下:

#include <linux/kernel.h>
#include <linux/slab.h>
#include <asm/uaccess.h>
#include <asm/unistd.h>
#include <linux/cpumask.h>


asmlinkage long sys_new_syscall(void)
{
    unsigned int cpu3 = 3;

    set_cpu_online (cpu3, false) ;          /* clears the CPU in the cpumask */
    printk ("CPU%u is offline\n", cpu3);


    return 0;
}

系统调用已在内核中正确注册,我启用了“cpu hotplug&#39;内核配置期间的功能(见图)

内核配置:

Kernel configuration

内核是构建的。但是当我使用test.c检查系统调用时:

#include <stdio.h>
#include <linux/kernel.h>
#include <sys/syscall.h>
#include <unistd.h>



long new_syscall(void)
{
    return syscall(394);
}

int main(int argc, char *argv[])
{
     long int a = new_syscall();
     printf("System call returned %ld\n", a);
     return 0;
}

操作系统频繁出现! 我做错了什么?

2 个答案:

答案 0 :(得分:3)

为什么要实现专用的系统调用?离线cpus的标准方法是写入sysfs。在极不可能的情况下,有一个合理的理由来创建一个专用的系统调用,你将不得不检查一下底线是如何工作的并重复这一点。

set_cpu_online (cpu3, false) ;          /* clears the CPU in the cpumask */

你自己的评论强烈暗示这太简单了。例如,如果执行此操作的线程正在所述cpu上运行,该怎么办?那些排队的线程呢?

等等

答案 1 :(得分:0)

这是一个古老的话题,但是您可以通过使用cpu_up(cpu_id)中的函数cpu_down(cpu_id)include/linux/cpu.h在内核域中上下移动CPU。

set_cpu_online似乎没有导出,因为从其他内核部件的角度来看,它似乎并不安全(例如,它没有考虑进程亲和力和其他复杂性)。

因此,您的系统调用可以写为:

asmlinkage long sys_new_syscall(void)
{
    unsigned int cpu3 = 3;

    cpu_down(cpu3) ;          /* clears the CPU in the cpumask */
    printk ("CPU%u is offline\n", cpu3);

    return 0;
}

我这里有一个使用这些方法的示例模块:https://github.com/pappacena/cpuautoscaling