首页 > 系统相关 >Linux内核状态 system_state

Linux内核状态 system_state

时间:2024-08-17 14:54:50浏览次数:8  
标签:kernel init system reboot SYSTEM state Linux

基于msm-5.4

一、定义

/* 用于 system_state 的值,状态的顺序不得更改,代码检查时会用 <、<=、>、>= STATE */
extern enum system_states { //include/linux/kernel.h
    SYSTEM_BOOTING, //0, 最初没有赋值的时候的默认值
    SYSTEM_SCHEDULING,
    SYSTEM_RUNNING,
    SYSTEM_HALT,
    SYSTEM_POWER_OFF,
    SYSTEM_RESTART,
    SYSTEM_SUSPEND,
} system_state;

enum system_states system_state __read_mostly; //init/main.c


二、赋值路径

1. 内核启动

rest_init //init/main.c
    kernel_thread(kernel_init, NULL, CLONE_FS);
    kernel_thread(kthreadd, NULL, CLONE_FS | CLONE_FILES);
    system_state = SYSTEM_SCHEDULING;
    complete(&kthreadd_done); //唤醒init进程

kernel_init //init/main.c
    system_state = SYSTEM_RUNNING;

在唤醒init进程时,将系统状态 system_state 设置为 SYSTEM_SCHEDULING.

这里做这个设置原文有个注释:启用 might_sleep() 和 smp_processor_id() 检查。它们不能提前启用,因为使用 CONFIG_PREEMPTION=y kernel_thread() 会触发 might_sleep()。

init线程创建后将 system_state 设置为 SYSTEM_RUNNING。


2. reboot系统重启

reboot(cmd) //reboot.c 系统调用 cmd=CMD_RESTART 等
deferred_cad //reboot.c 传参NULL
__orderly_reboot //reboot.c 传参NULL
power_down //若hibernation_mode=HIBERNATION_REBOOT,则调用,传参NULL, 默认没使能CONFIG_HIBERNATION不执行
    kernel_restart(cmd) //reboot.c cmd=edl/recovery/bootloader/soc等
    kernel_kexec //kexec_core.c
        kernel_restart_prepare //reboot.c
            blocking_notifier_call_chain(&reboot_notifier_list, SYS_RESTART, cmd);
            system_state = SYSTEM_RESTART;

reboot() //reboot.c 系统调用 cmd=CMD_HALT 时调用
    kernel_halt //reboot.c 传参 SYSTEM_HALT
reboot() //reboot.c 系统调用 cmd=POWER_OFF 时调用
    kernel_power_off //reboot.c 传参 SYSTEM_POWER_OFF
        kernel_shutdown_prepare(enum system_states state) //reboot.c
            blocking_notifier_call_chain(&reboot_notifier_list, state, NULL);
                system_state = state;

在系统重启,发出通知后,将 system_state 赋值为 SYSTEM_RESTART。在系统shutdown,发出通知后,将 system_state 赋值为设置的 state 值。


3. tick的freeze/unfreeze

tick_freeze //tick-common.c
    system_state = SYSTEM_SUSPEND;

tick_unfreeze
    system_state = SYSTEM_RUNNING;


4. 系统休眠唤醒

suspend_enter
    system_state = SYSTEM_SUSPEND;
    syscore_suspend
    system_state = SYSTEM_RUNNING;


三、使用案例

1. 内存初始化时判断是内核启动路径还是hotplug路径

void __ref build_all_zonelists(pg_data_t *pgdat) //page_alloc.c
{
    if (system_state == SYSTEM_BOOTING) {
        build_all_zonelists_init();
    } else {
        __build_all_zonelists(pgdat); //memory_hotplug.c 中应该会走这个路径
    }
}

 

标签:kernel,init,system,reboot,SYSTEM,state,Linux
From: https://www.cnblogs.com/hellokitty2/p/18364391

相关文章

  • Linux系统重要配置文件
    一、/etc/sysconfig/network-script/ifcf-eth0网卡配置文件1、网卡信息解读:TYPE=Ethernet #网络类型,Ethernet-->以太网BOOTPROTO=none #配置IP地址的方式 #自动获取IP方式为DHCP #固定IP地址配置方式:nonestaticNAME=eth0 #网卡在系统中显示的名称......
  • 最好用的Linux发行版---WSL
    使用debian开发半年,那个号称稳定的操作系统,ubuntu也是基于它的testing版本开发的,在一次设置testing更新后英伟达驱动掉了、引导区无法启动、bios损坏,现在老实了,换回了Window,并且激进的选择了win11,但我还是难以忘记linux爽快的开发体验,便用上了wsl安装Linux控制面板->程......
  • Android Linux EAS优化-schedtune
    SchedTuneSchedTune是一项与CPU调频相关的性能提升技术,它实现为一个cgroup控制器。这个控制器提供了一个名称为schedtune.boost的配置参数,运行时系统可以使用它来更改该组中的进程的调度方式。每当调整这个参数的时候,它会使受影响的进程看起来比实际更重(或更轻)。如果一个组被提......
  • Unixed |As IBM's legal battle over Linux intensifies, other firms hope to benefi
    BPC>Fullarticletextfetchedfrom(noneedtoreportissueforexternalsite): | archive.today | archive.mdBusiness |IBMandLinuxUnixedAsIBM'slegalbattleoverLinuxintensifies,otherfirmshopetobenefitJun19th2003 | san......
  • Linux c程序中获取shell脚本输出(如获取system命令输出)
    在工作中遇到一个小问题,就是想获取函数system()执行之后打印的字符串信息。这个功能还是很实用的,能为我们节省很多开发时间,特地整理了一下相关知识点分享给大家。1.使用临时文件1.1使用shell的重定向首先想到的方法就是将命令输出重定向到一个临时文件,在我们的应用程序中读......
  • Linux下如何在程序中获取某个命令执行的结果?【附源码】
    在工作中遇到一个问题,就是想获取某个函数执行之后打印的字符串信息。这个功能应用场景挺多的,特地整理了一下相关知识点分享给大家。1.使用临时文件1)使用shell的重定向将命令输出重定向到一个临时文件,在我们的应用程序中读取这个临时文件,获得外部命令执行结果,代码如下所示:/......
  • Linux 中 实现每一行连续重复
     001、sed实现[root@PC1test]#lsa.txt[root@PC1test]#cata.txt##测试数据010203040506070809101112131415161718192021222324252627282930[root@PC1test]#sed'1~1p'a.txt##每行连续重复两次......
  • Linux:Go应用实践目录权限
    在Linux系统中,文件和目录的权限管理是日常系统维护的重要组成部分。权限设置不当可能导致安全漏洞,而合理配置则是保障系统安全的基石。本文将深入探讨Linux目录权限的管理,并展示如何使用Go语言来自动化这一过程,特别是针对需要批量修改权限的场景。Linux权限概念简介在Linu......
  • linux: 同步容器和宿主机的时区设置, 一种实用的 Docker 配置方法
    在容器化的应用部署中,保证容器内的时区与宿主机时区一致是一项常见且重要的需求,特别是在处理日志、定时任务等与时间相关的操作时。本文将探讨如何在使用Docker和DockerCompose时实现时区的同步,并介绍相关命令和配置方法。1.Docker容器的时区同步问题默认情况下,Doc......
  • [20240816]oracle21c环境变量ORACLE_PATH与SQLPATH(linux).txt
    [20240816]oracle21c环境变量ORACLE_PATH与SQLPATH(linux).txt--//我记忆以前测试过这个问题,当时是家里的笔记本,安装oracle12.2cforwindows.OS:windows7,发现无法访问SQLPATH或者--//ORACLE_PATH环境变量定义的路径下login.sql文件.我当时解决办法就是登录手工执行init.sql......