动物摄影网站/真正免费的网站建站平台

动物摄影网站,真正免费的网站建站平台,免费制作链接的软件,青之峰网站建设机器出现开机 自动进入fastboot模式。可能是init 那个进程挂了 然后调用了 RebootSystem(ANDROID_RB_RESTART2, “bootloader”); 函数进入重启流程,然后重启后进入fastboot 浅读一下reboot流程和怎么进入的fastboot 比如说是那个进程挂了调用了这个函数&#xff0c…

机器出现开机 自动进入fastboot模式。可能是init 那个进程挂了 然后调用了
RebootSystem(ANDROID_RB_RESTART2, “bootloader”); 函数进入重启流程,然后重启后进入fastboot
浅读一下reboot流程和怎么进入的fastboot
比如说是那个进程挂了调用了这个函数,然后就是会调用到 RebootSystem
在这里插入图片描述
在查看一下RebootSystem(unsigned int cmd, const std::string& rebootTarget)的paramete
paramete 1 :cmd 就是 reboot 命令是poweroff 还是restart
paramete 2: rebootTarget 就是重启的参数只有restart才会用到这个参数(reboot recovery/bootloader)重启后进入指定模式 例如fastboot
recovery模式
在这里插入图片描述
看重启流程:
syscall是一个系统调用 在这调用_NR_reboot指令
系统调用之后就是进入内核
include\linux\syscall.h 中调用SYSCALL_DEFINE4 因为 _NR_reboot后面带4个参数 实际
SYSCALL_DEFINE4会根据你的命令(reboot star stop 等一下关于内核的命令调用实际函数)
在这里插入图片描述
就是这个name
-------------------------分界线---------------
比如_NR_reboot 就是调用sys_reboot函数,其他exit或者shutdown同理
在这里插入图片描述
那么我们就在内核中调用了sys_reboot并且系统层给了参数
asmlinkage long sys_reboot(int magic1, int magic2, unsigned int cmd, void __user *arg);
syscall(__NR_reboot, LINUX_REBOOT_MAGIC1, LINUX_REBOOT_MAGIC2,LINUX_REBOOT_CMD_RESTART2, rebootTarget.c_str()
对应就是 magic1 = LINUX_REBOOT_MAGIC1
magic2 =LINUX_REBOOT_MAGIC2
cmd = LINUX_REBOOT_CMD_RESTART2(重启)
rebootTarget.c_str() = 重启参数在开头给的是“bootloder”
--------------------------分界线-------------------------------------------
分界线内的说明好像不正确,他不是调用的sys_reboot函数,而是把函数重新定义
在这里插入图片描述
实际调用的还是SYSCALL_DEFINE4(name ,arg…)
reboot: SYSCALL_DEFINE4(reboot ,arg…)

kernel-4.9/kernel/reboot.c中
SYSCALL_DEFINE4(reboot, int, magic1, int, magic2, unsigned int, cmd,void __user *, arg)
{struct pid_namespace *pid_ns = task_active_pid_ns(current);char buffer[256];int ret = 0;/* We only trust the superuser with rebooting the system. */if (!ns_capable(pid_ns->user_ns, CAP_SYS_BOOT))return -EPERM;/* For safety, we require "magic" arguments. */if (magic1 != LINUX_REBOOT_MAGIC1 ||(magic2 != LINUX_REBOOT_MAGIC2 &&magic2 != LINUX_REBOOT_MAGIC2A &&magic2 != LINUX_REBOOT_MAGIC2B &&magic2 != LINUX_REBOOT_MAGIC2C))return -EINVAL;/** If pid namespaces are enabled and the current task is in a child* pid_namespace, the command is handled by reboot_pid_ns() which will* call do_exit().*/ret = reboot_pid_ns(pid_ns, cmd);if (ret)return ret;/* Instead of trying to make the power_off code look like* halt when pm_power_off is not set do it the easy way.*/if ((cmd == LINUX_REBOOT_CMD_POWER_OFF) && !pm_power_off)cmd = LINUX_REBOOT_CMD_HALT;mutex_lock(&reboot_mutex);switch (cmd) {case LINUX_REBOOT_CMD_RESTART:kernel_restart(NULL);break;case LINUX_REBOOT_CMD_CAD_ON:C_A_D = 1;break;case LINUX_REBOOT_CMD_CAD_OFF:C_A_D = 0;break;case LINUX_REBOOT_CMD_HALT:kernel_halt();do_exit(0);panic("cannot halt");case LINUX_REBOOT_CMD_POWER_OFF:kernel_power_off();do_exit(0);break;case LINUX_REBOOT_CMD_RESTART2:ret = strncpy_from_user(&buffer[0], arg, sizeof(buffer) - 1);if (ret < 0) {ret = -EFAULT;break;}buffer[sizeof(buffer) - 1] = '\0';kernel_restart(buffer);break;#ifdef CONFIG_KEXEC_COREcase LINUX_REBOOT_CMD_KEXEC:ret = kernel_kexec();break;
#endif#ifdef CONFIG_HIBERNATIONcase LINUX_REBOOT_CMD_SW_SUSPEND:ret = hibernate();break;
#endifdefault:ret = -EINVAL;break;}mutex_unlock(&reboot_mutex);return ret;
}

如果走重启流程调用:kernel_restart(buffer);

void kernel_restart(char *cmd)
{kernel_restart_prepare(cmd);migrate_to_reboot_cpu();syscore_shutdown();if (!cmd)pr_emerg("Restarting system\n");elsepr_emerg("Restarting system with command '%s'\n", cmd);kmsg_dump(KMSG_DUMP_RESTART);machine_restart(cmd);
}

调用 machine_restart(cmd)
kernel4.9/arch/arm/kernel/reboot.c
在这里插入图片描述
调用do_kernel_restart

void do_kernel_restart(char *cmd)
{atomic_notifier_call_chain(&restart_handler_list, reboot_mode, cmd);
}

atomic_notifier_call_chain做的是向注册restart_handler_list的驱动发送一个通知,通知各个通过register_restart_handler注册的钩子函数,执行这个关机函数
在kernel4.9/drivers/watchdog_core.c
__watchdog_register_device函数中注册
在这里插入图片描述
调用:watchdog_restart_notifier
在这里插入图片描述
调用:wdd->ops->restart(wdd, action, data);
看一下restart的实现在哪里
mtk_wdt.c

static int mtk_reset_handler(struct notifier_block *this, unsigned long mode,void *cmd)
{struct mtk_wdt_dev *mtk_wdt;void __iomem *wdt_base;u32 reg;mtk_wdt = container_of(this, struct mtk_wdt_dev, restart_handler);wdt_base = mtk_wdt->wdt_base;/** WDT_STATUS will be cleared to  zero after writing to WDT_MODE, so we backup it in WDT_NONRST_REG,* and then print it out in mtk_wdt_probe() after reset*/writel(__raw_readl(wdt_base + WDT_STATUS), wdt_base + WDT_NONRST_REG);reg = ioread32(wdt_base + WDT_MODE);reg &= ~(WDT_MODE_DUAL_EN | WDT_MODE_IRQ_EN | WDT_MODE_EN);reg |= WDT_MODE_KEY;iowrite32(reg, wdt_base + WDT_MODE);if (cmd && (strcmp(cmd, "rpmbpk") == 0)) {iowrite32(ioread32(wdt_base + WDT_NONRST_REG2) | (1U << 0), wdt_base + WDT_NONRST_REG2);} else if (cmd && (strcmp(cmd, "recovery") == 0)) {iowrite32(ioread32(wdt_base + WDT_NONRST_REG2) | (1U << 1), wdt_base + WDT_NONRST_REG2);#ifdef CONFIG_MT6397_MISCmtk_misc_mark_recovery();#endif} else if (cmd && (strcmp(cmd, "bootloader") == 0)) {iowrite32(ioread32(wdt_base + WDT_NONRST_REG2) | (1U << 2), wdt_base + WDT_NONRST_REG2);#ifdef CONFIG_MT6397_MISCmtk_misc_mark_fast();#endif} else {//do nothing}if (!arm_pm_restart) {while (1) {writel(WDT_SWRST_KEY, wdt_base + WDT_SWRST);mdelay(5);}}return NOTIFY_DONE;
}

这里就是resart实现的地方,那么我们传下来的参数是bootloader
iowrite32(ioread32(wdt_base + WDT_NONRST_REG2) | (1U << 2), wdt_base + WDT_NONRST_REG2);
看到这是写看了一个寄存器,这要看数据手册才知道写的是那个寄存器了,不过在lk阶段就是判断RTC的寄存器来判断进入fasterboot模式的。
vendor\mediatek\proprietary\bootable\bootloader\lk\platform\mt8163\boot_mode.c

void boot_mode_select(void)
{int factory_forbidden = 0;//  int forbid_mode;
/*We put conditions here to filer some cases that can not do key detection*/extern int kedump_mini(void) __attribute__((weak));if (kedump_mini){if (kedump_mini()){mrdump_check();return;}}if (meta_detection()){return;}mrdump_check();#if defined (HAVE_LK_TEXT_MENU)
/*Check RTC to know if system want to reboot to Fastboot*/if(Check_RTC_PDN1_bit13()){dprintf(CRITICAL, "[FASTBOOT] reboot to boot loader\n");g_boot_mode = FASTBOOT;Set_Clr_RTC_PDN1_bit13(false);return;}/*If forbidden mode is factory, cacel the factory key detection*/if(g_boot_arg->sec_limit.magic_num == 0x4C4C4C4C){if(g_boot_arg->sec_limit.forbid_mode == F_FACTORY_MODE){//Forbid to enter factory modedprintf(CRITICAL, "%s Forbidden\n",MODULE_NAME);factory_forbidden=1;}}//  forbid_mode = g_boot_arg->boot_mode &= 0x000000FF;/*If boot reason is power key + volumn down, thendisable factory mode dectection*/if(mtk_detect_pmic_just_rst()){factory_forbidden=1;}/*Check RTC to know if system want to reboot to Recovery*/if(Check_RTC_Recovery_Mode()){g_boot_mode = RECOVERY_BOOT;return;}/*If MISC Write has not completed  in recovery modebefore system reboot, go to recovery mode tofinish remain tasks*/if(unshield_recovery_detection()){return;}ulong begin = get_timer(0);/*we put key dectection here to detect key which is pressed*/

所以这俩个就是通过判断RTC_PDN1_bit13这个位进入fastboot模式。
同理我们使用adb 命令 adb reboot bootloader 就是reboot d带bootloader参数也是一样的进fastboot

不一样的是系统层下发命令进入fastboot是由于系统崩溃导致,可以查看在哪里崩溃的日志定位问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/612763.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

实现目标检测中的数据格式自由(labelme json、voc、coco、yolo格式的相互转换)

在进行目标检测任务中&#xff0c;存在labelme json、voc、coco、yolo等格式。labelme json是由anylabeling、labelme等软件生成的标注格式、voc是通用目标检测框&#xff08;mmdetection、paddledetection&#xff09;所支持的格式&#xff0c;coco是通用目标检测框&#xff0…

cosmos及特定应用程序的区块链

特定应用程序的区块链,简单来说&#xff0c;一个区块链就是一个专门的应用程序。为了实现某一特定的去中心化应用而专门实现一个区块链。 传统的用智能合约构建去中心化应用不行吗&#xff1f; 灵活性不足&#xff1a;智能合约本质上受到虚拟机本身的限制。例如&#xff0c;以…

【Spring Boot】SpringBoot maven 项目创建图文教程

创建一个Spring Boot项目并使用Maven进行构建是一项相对简单的任务。以下是使用IntelliJ IDEA创建Spring Boot Maven项目的详细教程&#xff1a; 步骤 1&#xff1a;安装 IntelliJ IDEA 确保你已经安装了最新版本的 IntelliJ IDEA。你可以从官方网站下载并安装。 步骤 2&am…

基于SpringBoot+Redis的前后端分离外卖项目-苍穹外卖微信小程序端(十一)

加入redis缓存 1. 缓存菜品1.1 问题说明1.2 实现思路1.3 代码开发1.4 功能测试 2. 缓存套餐2.1 Spring Cache2.1.1 介绍2.1.2 常用注解2.1.3 入门案例 2.2 具体实现思路2.3 代码开发 1. 缓存菜品 1.1 问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得&#xff0c;…

MySQL一主一从读写分离

​ MySQL主从复制 一、主从复制概念 主从复制是指将主数据库的DDL和DML操作通过二进制日志传到从服务器中&#xff0c;然后在从服务器上对这些日志重新执行也叫重做&#xff0c;从而使得从数据库和主库的数据保持同步。 MySQL支持一台主库同时向多台从库进行赋值&#xff0c;从…

20240110-Python实现读取当前文件夹下所有视频名称和时长并生成一张表

代码 import os import cv2 import csv# 获取当前文件夹路径 folder_path os.getcwd() # 如果当前文件夹就是目标文件夹可以直接使用 ./&#xff0c;否则修改为目标文件夹的路径# 获取当前文件夹中所有视频文件的名称 video_files [f for f in os.listdir(folder_path) if …

腾讯云对象存储COS计算文件的大小

properties配置类 TencentCos.APPIDxxxxx TencentCos.SecretIdxxxxxxx TencentCos.SecretKeyxxxxxx TencentCos.testBucketxxxxxx TencentCos.CosPathhttps://xxxxxxxx.cos.ap-chengdu.myqcloud.com TencentCos.regionap-chengdu读取properties中的配置 import lombok.AllArg…

kubeSphere DevOps自定义容器环境JDK11

kubeSphere DevOps自定义容器环境JDK11 &#x1f342;前言&#x1f342;增加JDK11容器环境&#x1f341;检查是否成功 &#x1f342;不生效的原因排查&#x1f341;按步骤执行如下命令 &#x1f342;前言 kubeSphere 版本v3.1.1 遇到问题:kubeSphere默认支持容器只有JDK8,目前…

Ubuntu22.04,Nvidia4070配置llama2

大部分内容参考了这篇非常详细的博客&#xff0c;是我最近看到的为数不多的保姆级别的教学博客&#xff0c;建议大家去给博主点个赞【Ubuntu 20.04安装和深度学习环境搭建 4090显卡】_ubuntu20.04安装40系显卡驱动-CSDN博客 本篇主要是基于这篇博客结合自己配置的过程中一些注…

DC电源模块技术的未来发展趋势

BOSHIDA DC电源模块技术的未来发展趋势 随着科技的不断发展&#xff0c;DC电源模块技术也在不断演进。以下是DC电源模块技术未来发展的一些趋势&#xff1a; 1. 高效能&#xff1a;未来DC电源模块的效能将得到进一步提高。通过改进转换拓扑结构、优化控制算法和使用高效能元器…

Kafka 除了用作消息队列还能干吗?

Kafka 除了用作消息队列还能干吗&#xff1f; 本文转自 公众号 ByteByteGo&#xff0c;如有侵权&#xff0c;请联系&#xff0c;立即删除 Kafka 最初是为大规模处理日志而构建的。它可以保留消息直到过期&#xff0c;并让各个消费者按照自己的节奏提取消息。 与其之前的竞品不…

CPT203-Software Engineering 笔记

Week 1 -- Introduction failure reason professional software development*** maintain, security, efficiency, acceptability two kinds***: generic, customized software deterioration 软件退化 reduce changes/ side effects after changes software engineering …

VMware Visio OmniGraffle模板和图标

VMware Visio OmniGraffle模板和图标 包含可用于Visio、omnigraffle的图标和SVG矢量图。 简介 这组资源适用于 IT 管理员、系统架构师、网络工程师和其他需要可视化 VMware 基础架构的专业人士创建精确的 VMware 网络和数据中心部署图&#xff0c;通过使用这些模板和图标&am…

了解开源协议吗,简单介绍下开源协议

简单图解 开源协议的简单图解 列表图解

计算机毕业设计-----SSH校园精品课程网前后台

项目介绍 本项目是很不错的一个校园精品课程网源码&#xff0c;前台和后台源码都有&#xff0c;分为管理员与学生两种角色&#xff1b; 前台功能&#xff1a;网站首页&#xff0c;校园新闻&#xff0c;课程中心&#xff0c;资源下载&#xff0c;互动交流&#xff0c;个人中心…

chrony 时间同步

一.chrony简介 chrony 的优势&#xff1a; ① 更快的同步&#xff0c;从而最大程度减少了时间和频率误差&#xff0c;对于并非全天 24 小时运行的虚拟计算机而言非常有用。 相对于NTP来说&#xff0c;chrony性能更好 NTP是网络时间协议(Network Time Protocol)&#xff0c;它…

VUE购物车商品的添加、删除和计算总金额功能

效果 代码 <template><div id"box"><!--全选功能--><input type"checkbox" change"handleChange" v-model"isAllChecked" /><!--绑定事件&#xff0c;不选用click&#xff0c;使用change每次check值改变会…

【人工智能】智能电网:未来能源的革命

未来能源的革命 智能电网革命的意义在于将电力行业从传统的集中式发电和集中式输配电模式转变为智能化、分布式、互动式的能源网络。 现在我们从以下方面详细认真的了解一下智能电网&#xff1a; 智能变电站&#xff0c;智能配电网&#xff0c;智能电能表&#xff0c;智能交互…

基于传统机器学习模型算法的项目开发详细步骤

1 场景分析 1.1 项目背景 描述开发项目模型的一系列情境和因素&#xff0c;包括问题、需求、机会、市场环境、竞争情况等 1.2. 解决问题 传统机器学习在解决实际问题中主要分为两类&#xff1a; 有监督学习&#xff1a;已知输入、输出之间的关系而进行的学习&#xff0c;从而…

MySQL 从零开始:04 增删改查

文章目录 1、准备工作2、insert 增加数据2.1 添加所有列的数据2.2 添加部分列2.3 一次插入多条数据 3、delete 删除记录4、update 更新记录5、select 查询记录5.1 查询所有行所有列5.2 查询指定行的所有列5.3 查询所有行的指定列5.4 查询指定行的指定列 在上一小节中介绍了 MyS…