栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

如何创建新的Linux内核调度程序

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何创建新的Linux内核调度程序

我已经找到问题的答案,所以我想在这里添加它。以下是将向2.6.34
vanilla内核添加新调度程序的补丁。现在,我只编译了内核。我完全希望运行具有此EXACT补丁的系统会导致系统崩溃-因此,使用时需要您自担风险:-)

diff --git a/include/linux/sched.h b/include/linux/sched.hindex 2b7b81d..a2a2b21 100644--- a/include/linux/sched.h+++ b/include/linux/sched.h@@ -37,6 +37,7 @@ #define SCHED_RR       2 #define SCHED_BATCH        3 +#define SCHED_NEW    4  #define SCHED_IDLE     5  #define SCHED_RESET_ON_FORK     0x40000000diff --git a/init/Kconfig b/init/Kconfigindex eb77e8c..0055d26 100644--- a/init/Kconfig+++ b/init/Kconfig@@ -23,6 +23,11 @@ config ConSTRUCTORS menu "General setup"+config SCHED_NEW+       bool "NEW cpu scheduler"+       ---help---+         Brand new scheduler + config EXPERIMENTAL    bool "prompt for development and/or incomplete pre/drivers"    ---help---diff --git a/kernel/sched.c b/kernel/sched.cindex 3c2a54f..588960d 100644--- a/kernel/sched.c+++ b/kernel/sched.c@@ -1931,6 +1931,7 @@ static void deactivate_task(struct rq *rq, struct task_struct *p, int sleep) #include "sched_idletask.c" #include "sched_fair.c"+#include "sched_new.c" #include "sched_rt.c" #ifdef CONFIG_SCHED_DEBUG # include "sched_debug.c"diff --git a/kernel/sched_new.c b/kernel/sched_new.cnew file mode 100644index 0000000..c2e269e--- /dev/null+++ b/kernel/sched_new.c@@ -0,0 +1,140 @@+#ifdef CONFIG_SCHED_NEW++++static void+enqueue_task_new(struct rq *rq, struct task_struct *p, int wakeup, bool head)+{+}++static void dequeue_task_new(struct rq *rq, struct task_struct *p, int sleep)+{+}++static void yield_task_new(struct rq *rq)+{+}++static void check_preempt_curr_new(struct rq *rq, struct task_struct *p, int flags)+{+}++static struct task_struct *pick_next_task_new(struct rq *rq)+{+}++static void put_prev_task_new(struct rq *rq, struct task_struct *p)+{+}++#ifdef CONFIG_SMP+static int select_task_rq_new(struct task_struct *p, int sd_flag, int flags)+{+}+static void pre_schedule_new(struct rq *rq, struct task_struct *prev)+{+}++static void post_schedule_new(struct rq *rq)+{+}++static void task_woken_new(struct rq *rq, struct task_struct *p)+{+}++static void task_waking_new(struct rq *this_rq, struct task_struct *task)+{+}+static void set_cpus_allowed_new(struct task_struct *p,+    const struct cpumask *new_mask)+{+}++static void rq_online_new(struct rq *rq)+{+}+++static void rq_offline_new(struct rq *rq)+{+}+#endif ++static void set_curr_task_new(struct rq *rq)+{+}+++static void task_tick_new(struct rq *rq, struct task_struct *p, int queued)+{+} ++static void task_fork_new(struct task_struct *p)+{+}+static void switched_from_new(struct rq *rq, struct task_struct *p,+   int running)+{+}+static void switched_to_new(struct rq *this_rq, struct task_struct *task,+    int running)+{+}+static void prio_changed_new(struct rq *rq, struct task_struct *p,+    int oldprio, int running)+{+}+static unsigned int get_rr_interval_new(struct rq *rq, struct task_struct *task)+{+}++++static const struct sched_class new_sched_class = {+   .next= &fair_sched_class,+   .enqueue_task       = enqueue_task_new,+   .dequeue_task       = dequeue_task_new,+   .yield_task     = yield_task_new,++   .check_preempt_curr = check_preempt_curr_new,++   .pick_next_task     = pick_next_task_new,+   .put_prev_task      = put_prev_task_new,++#ifdef CONFIG_SMP+   .select_task_rq     = select_task_rq_new,++   .pre_schedule       = pre_schedule_new,+   .post_schedule      = post_schedule_new,++   .task_waking = task_waking_new,+   .task_woken     = task_woken_new,++   .set_cpus_allowed       = set_cpus_allowed_new,++   .rq_online   = rq_online_new,+   .rq_offline  = rq_offline_new,+#endif++   .set_curr_task          = set_curr_task_new,+   .task_tick      = task_tick_new,+   .task_fork   = task_fork_new,++   .switched_from          = switched_from_new,+   .switched_to        = switched_to_new,++   .prio_changed       = prio_changed_new,++   .get_rr_interval    = get_rr_interval_new,+#ifdef CONFIG_FAIR_GROUP_SCHED+   .moved_group = NULL+#endif+};++#endif diff --git a/kernel/sched_rt.c b/kernel/sched_rt.cindex b5b920a..aaf4beb 100644--- a/kernel/sched_rt.c+++ b/kernel/sched_rt.c@@ -1731,7 +1731,11 @@ static unsigned int get_rr_interval_rt(struct rq *rq, struct task_struct *task) } static const struct sched_class rt_sched_class = {+#ifdef CONFIG_SCHED_NEW+   .next= &new_sched_class,+#else    .next= &fair_sched_class,+#endif     .enqueue_task       = enqueue_task_rt,    .dequeue_task       = dequeue_task_rt,    .yield_task     = yield_task_rt,


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/392954.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号