内核的抢占是可以配置的:make menuconfig 按照以下图片选中则内核支持抢占,不选中则内核不支持抢占:
可以写一段代代码来验证内核是否支持抢占:
下面这段代码:在模块安装的时候运行:
insmod_test.c
1 #include2 #include 3 #include 4 #include 5 6 //当模块安装的时候执行 7 static __init int test_init(void) 8 { 9 printk("test_init\n"); 10 //模拟一段需要执行事件很长的代码 11 12 while (1); 13 //关闭内核抢占 14 //preempt_disable(); 15 //mdelay(5000); 16 //打开内核抢占 17 //preempt_enable(); 18 19 return 0; 20 } 21 22 //当模块卸载的时候执行 23 static __exit void test_exit(void) 24 { 25 printk("test_exit\n"); 26 } 27 28 module_init(test_init); 29 module_exit(test_exit); 30 31 MODULE_LICENSE("GPL");
下面这段代码的功能是每一秒打印一下本函数在CPU的哪个核上运行:
while.c
1 #define _GNU_SOURCE 2 #include3 #include 4 #include 5 #include 6 7 int main(void) 8 { 9 int ret; 10 11 cpu_set_t set; 12 13 CPU_ZERO(&set); 14 CPU_SET(1, &set); 15 CPU_SET(2, &set); 16 17 ret = sched_setaffinity(0, sizeof(cpu_set_t), &set); 18 if (ret < 0) { 19 perror("sched"); 20 exit(1); 21 } 22 while (1) { 23 printf("cpu:%d\n", sched_getcpu()); 24 sleep(1); 25 } 26 return 0; 27 }
实际验证的时候,先运行while.c然后再安装insmod_test.c这个模块.发现如果内核支持抢占,则while.c的每秒打印函数会正常运行,如果内核不支持抢占,则while.c函数的打印将会被阻塞.
上面的insmod中注释掉的一段代码preempt_disable相关的是关闭内核抢占和打开内核抢占的函数:大家学习的过程中不要忽略!其实也就是动态调整内核功能的一对函数!