rest_init(void)注解

本文深入解析Linux内核初始化过程中的reset_init函数,详细阐述其历史使命、启动关键线程(kernel_init和kthreadd)、设置默认NUMA策略、激活bootidle线程以调度CPU,最终进入idle循环来高效利用空闲CPU时间。通过理解reset_init函数,开发者能更好地掌握内核初始化阶段的核心机制。

《Linux内核修炼之道》第4章讲解系统初始化,万事开头难,系统的初始化是一个很复杂的过程,不过对于内核源码的学习来说,以这个部分开始应该是个不错的选择。特别是子系统初始化,应该是你选择任何内核子系统开始分析时都需要了解的内容。本节为大家介绍reset_init函数。
http://book.51cto.com/art/201007/213607.htm

  1. 438 static void noinline __init_refok rest_init(void)
  2. 439      __releases(kernel_lock)
  3. 440 {
  4. 441      int pid;
  5. 442
  6.          /* reset_init()函数最主要的历史使命就是
    启动内核线程kernel_init */
  7. 443      kernel_thread(kernel_init, NULL, CLONE_FS | CLONE_SIGHAND);
  8. 444      numa_default_policy();
  9.          /* 启动内核线程kthreadd,运行kthread_
    create_list全局链表中的kthread */
  10. 445     pid = kernel_thread(kthreadd, NULL, CLONE_FS | CLONE_FILES);
  11. 446     kthreadd_task = find_task_by_pid(pid);
  12. 447      unlock_kernel();
  13. 448
  14. 449      /*
  15. 450       * The boot idle thread must execute schedule()
  16. 451       * at least once to get things moving:
  17. 452       */
  18.          /*
  19.           * 增加idle进程的need_resched标志, 并且调用schedule释放CPU,
  20.           * 将其赋给更应该获取CPU的进程。
  21.           */
  22. 453      init_idle_bootup_task(current);
  23. 454      preempt_enable_no_resched();
  24. 455      schedule();
  25. 456      preempt_disable();
  26. 457
  27. 458      /* Call into cpu_idle with preempt disabled */
  28.          /*
  29.           * 进入idle循环以消耗空闲的CPU时间片, 该函数
    从不返回。然而,当有实际工作
  30.           * 要处理时,该函数就会被抢占。
  31.           */
  32. 459      cpu_idle();
  33. 460 }
帮我编写下面类的单元测试 package com.st.systemsettings.manager; import static com.st.systemsettings.interfa.Constant.TIME_MANAGER_REST_SWITCH; import static com.st.systemsettings.interfa.Constant.TIME_MANAGER_REST_TIME; import static com.st.systemsettings.interfa.Constant.TIME_MANAGER_WATCH_SWITCH; import static com.st.systemsettings.interfa.Constant.TIME_MANAGER_WATCH_TIME; import android.annotation.SuppressLint; import android.content.Context; import android.util.Log; import com.st.systemsettings.interfa.TimeChangeListener; import com.st.systemsettings.utils.SettingUtils; public class TimeManager { private static final String TAG = "TimeManager"; @SuppressLint("StaticFieldLeak") private static TimeManager sManager; private Context mContext; private TimeChangeListener mTimeChangeListener; public static TimeManager getInstance() { if (sManager == null) { sManager = new TimeManager(); } return sManager; } public void init(Context context) { this.mContext = context; } /** * 获取单次观看时长开关 */ public boolean getWatchSwitch() { int result = SettingUtils.getGlobalInteger(mContext, TIME_MANAGER_WATCH_SWITCH, 0); Log.i(TAG, "getWatchSwitch: result = " + result); return result == 1; } /** * 设置单次观看时长开关 */ public void setWatchSwitch(boolean open) { Log.i(TAG, "setWatchSwitch: open = " + open); SettingUtils.putGlobalInteger(mContext, TIME_MANAGER_WATCH_SWITCH, open ? 1 : 0); if (mTimeChangeListener != null) { mTimeChangeListener.onWatchSwitchChanged(open); } } /** * 获取观看时长 */ public int getWatchTime() { int result = SettingUtils.getGlobalInteger(mContext, TIME_MANAGER_WATCH_TIME, 30); Log.i(TAG, "getWatchTime: result = " + result); return result; } /** * 设置观看时长 */ public void setWatchTime(int time) { Log.i(TAG, "setWatchTime: time = " + time); SettingUtils.putGlobalInteger(mContext, TIME_MANAGER_WATCH_TIME, time); if (mTimeChangeListener != null) { mTimeChangeListener.onWatchTimeChanged(time); } } /** * 获取单次休息时长开关 */ public boolean getRestSwitch() { int result = SettingUtils.getGlobalInteger(mContext, TIME_MANAGER_REST_SWITCH, 0); Log.i(TAG, "getRestSwitch: result = " + result); return result == 1; } /** * 设置单次休息时长开关 */ public void setRestSwitch(boolean open) { Log.i(TAG, "setRestSwitch: open = " + open); SettingUtils.putGlobalInteger(mContext, TIME_MANAGER_REST_SWITCH, open ? 1 : 0); if (mTimeChangeListener != null) { mTimeChangeListener.onRestSwitchChanged(open); } } /** * 获取休息时长 */ public int getRestTime() { int result = SettingUtils.getGlobalInteger(mContext, TIME_MANAGER_REST_TIME, 5); Log.i(TAG, "getRestTime: result = " + result); return result; } /** * 设置休息时长 */ public void setRestTime(int time) { Log.i(TAG, "setRestTime: time = " + time); SettingUtils.putGlobalInteger(mContext, TIME_MANAGER_REST_TIME, time); if (mTimeChangeListener != null) { mTimeChangeListener.onRestTimeChanged(time); } } public void setTimeChangeListener(TimeChangeListener timeChangeListener) { mTimeChangeListener = timeChangeListener; } }
07-23
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值