x86平台下Android系统的Linux部分的重启分析

VMware虚拟机安装Android-x86:打造纯净可控的安卓开发测试环境 虚拟化技术通过在单一物理硬件上创建多个隔离的虚拟环境,实现了资源的高效利用与环境的灵活部署。其核心原理在于通过Hypervisor层抽象硬件资源,为每个虚拟机提供独立的操作系统实例。这项技术的价值在于为软件开发、测试和安全研究提供了高度可控、可复现且与宿主机隔离的沙箱环境。在移动应用生态中,安卓应用开发、自动化测试以及安全分析等场景,尤其需要一个稳定、纯净且配置灵活的安卓系统环境。传统的商业模拟器往往存在系统定制、捆绑软件或控制权有限的问题。通过将Android-x86项目移植到VMware这类专业虚拟化平 阅读详情

-----------------------------------------------------------------------
本文系本站原创,欢迎转载!
转载请注明出处:http://blog.youkuaiyun.com/android_huber
交流邮箱:dp.shao@gmail.com
-----------------------------------------------------------------------

        在Android下,我们在命令行中敲入reboot后系统的重启首先是执行的reboot这个应用程序。这是一个比较简单的小程序,其源码在   system/core/toolbox/reboot.c,主要的代码如下:

    if(poweroff)
        ret = __reboot(LINUX_REBOOT_MAGIC1, LINUX_REBOOT_MAGIC2, LINUX_REBOOT_CMD_POWER_OFF, NULL);
    else if(argc > optind)
        ret = __reboot(LINUX_REBOOT_MAGIC1, LINUX_REBOOT_MAGIC2, LINUX_REBOOT_CMD_RESTART2, argv[optind]);
    else
        ret = reboot(RB_AUTOBOOT);
这边都是通过系统调用进入内核的,LINUX_REBOOT_MAGIC1和LINUX_REBOOT_MAGIC2是两个幻数。进入kernel/sys.c中

/*
 * Reboot system call: for obvious reasons only root may call it,
 * and even root needs to set up some magic numbers in the registers
 * so that some mistake won't make this reboot the whole machine.
 * You can also set the meaning of the ctrl-alt-del-key here.
 *
 * reboot doesn't sync: do that yourself before calling this.
 */
SYSCALL_DEFINE4(reboot, int, magic1, int, magic2, unsigned int, cmd,
		void __user *, arg)
{
	char buffer[256];
	int ret = 0;

	/* We only trust the superuser with rebooting the system. */
	if (!capable(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;

	/* 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:
		if (strncpy_from_user(&buffer[0], arg, sizeof(buffer) - 1) < 0) {
			ret = -EFAULT;
			break;
		}
		buffer[sizeof(buffer) - 1] = '\0';

		kernel_restart(buffer);
		break;

#ifdef CONFIG_KEXEC
	case LINUX_REBOOT_CMD_KEXEC:
		ret = kernel_kexec();
		break;
#endif

#ifdef CONFIG_HIBERNATION
	case LINUX_REBOOT_CMD_SW_SUSPEND:
		ret = hibernate();
		break;
#endif

	default:
		ret = -EINVAL;
		break;
	}
	mutex_unlock(&reboot_mutex);
	return ret;
}
我们通过命令行敲reboot的话进入的是LINUX_REBOOT_CMD_RESTART这个分支,可以看到接下来会调用kernel_restart(NULL);

/**
 *	kernel_restart - reboot the system
 *	@cmd: pointer to buffer containing command to execute for restart
 *		or %NULL
 *
 *	Shutdown everything and perform a clean reboot.
 *	This is not safe to call in interrupt context.
 */
void kernel_restart(char *cmd)
{
        kernel_restart_prepare(cmd);
	if (!cmd)
		printk(KERN_EMERG "Restarting system.\n");
	else
		printk(KERN_EMERG "Restarting system with command '%s'.\n", cmd);
	kmsg_dump(KMSG_DUMP_RESTART);
	machine_restart(cmd);
}
这个函数里面会打印出我们常看到的log,Restarting system.

kernel_restart_prepare(cmd);里会去调用设备的shutdown接口,去power off设备,并且发送SYS_RESTART的广播,

void kernel_restart_prepare(char *cmd)
{
	blocking_notifier_call_chain(&reboot_notifier_list, SYS_RESTART, cmd);
	system_state = SYSTEM_RESTART;
	device_shutdown();
	sysdev_shutdown();
}
接着执行machine_restart(cmd);我们会调到arch/x86/kernel/reboot.c中,这里需要知道一个ops

struct machine_ops machine_ops = {
	.power_off = native_machine_power_off,
	.shutdown = native_machine_shutdown,
	.emergency_restart = native_machine_emergency_restart,
	.restart = native_machine_restart,
	.halt = native_machine_halt,
#ifdef CONFIG_KEXEC
	.crash_shutdown = native_machine_crash_shutdown,
#endif
};
machine_restart就是执行这行这里的native_machine_restart

static void native_machine_restart(char *__unused)
{
	printk("machine restart\n");

	if (!reboot_force) {
		printk("native_machine_restart reboot_force:%d\n", reboot_force);
		machine_shutdown();
	}
	__machine_emergency_restart(0);
}
machine_shutdown();中执行一些shutdown工作,重启的工作在__machine_emergency_restart(0);
static void __machine_emergency_restart(int emergency)
{
	reboot_emergency = emergency;
	machine_ops.emergency_restart();
}
调用ops中的emergency_restart

static void native_machine_emergency_restart(void)
{
	int i;

	if (reboot_emergency)
		emergency_vmx_disable_all();

	tboot_shutdown(TB_SHUTDOWN_REBOOT);
	
	/* Tell the BIOS if we want cold or warm reboot */
	*((unsigned short *)__va(0x472)) = reboot_mode;

	for (;;) {
		/* Could also try the reset bit in the Hammer NB */
		switch (reboot_type) {
		case BOOT_KBD:			
			mach_reboot_fixups(); /* for board specific fixups */

			for (i = 0; i < 10; i++) {
				printk("%d\n", i);
				kb_wait();
				udelay(50);
				outb(0xfe, 0x64); /* pulse reset low */
				udelay(50);
			}

		case BOOT_TRIPLE:
			
			load_idt(&no_idt);
			
			__asm__ __volatile__("int3");
			
			reboot_type = BOOT_KBD;
			break;

#ifdef CONFIG_X86_32
		case BOOT_BIOS:
                        machine_real_restart(jump_to_bios, sizeof(jump_to_bios));
                        reboot_type = BOOT_KBD;
			break;
#endif

		case BOOT_ACPI:
			
			acpi_reboot();
			reboot_type = BOOT_KBD;
			break;

		case BOOT_EFI:
			
			if (efi_enabled)
				efi.reset_system(reboot_mode ?
						 EFI_RESET_WARM :
						 EFI_RESET_COLD,
						 EFI_SUCCESS, 0, NULL);
			reboot_type = BOOT_KBD;
			break;

		case BOOT_CF9:
			
			port_cf9_safe = true;
			/* fall through */

		case BOOT_CF9_COND:
			
			if (port_cf9_safe) {
				u8 cf9 = inb(0xcf9) & ~6;
                          
				outb(cf9|2, 0xcf9); /* Request hard reset */
				udelay(50);
				outb(cf9|6, 0xcf9); /* Actually do the reset */
				udelay(50);
			}
			reboot_type = BOOT_KBD;
			break;
		}
	}
}
        这边就是重启的最后部分了,默认的是通过BOOT_KBD方式重启的,这种方式是通过键盘控制器去模拟按下键盘上的reset键来重启的,往0x64端口中写0xfe即可,然后系统会在__asm__ __volatile__("int3");中中断。int3是一个breakpoint,用来使程序停止在这,等待重启。

        这里再说下,通过cf9来重启,用注释来解释Use the so-called "PCI reset register", CF9,通过这个寄存器可以使系统hard reset。

        对于上面的一些重启方式,我将在下一篇文章里去介绍他们的用法,以及我在调试reboot中遇到的一些问题,这篇文章主要就是分析一下reboot的流程。

同样,附一张流程图:




需要清晰大图的请留邮箱


安卓Imgui Mod管理器开发:C#与Java跨平台GUI解决方案 即时模式GUI(Immediate Mode GUI)是一种高效的图形界面编程范式,其核心原理在于每帧完全重建界面,简化了状态管理并提升了渲染性能。在移动开发领域,这种技术价值尤为突出,能够为性能敏感型应用提供流畅的交互体验。Dear Imgui作为其知名实现,常被用于游戏开发工具和调试界面。将此类高性能GUI库与安卓平台结合,面临的主要挑战在于如何跨语言集成系统API并适配移动端触控交互。本项目通过C#与Java技术栈的协同,构建了一个面向安卓设备的Mod管理器框架,为游戏模组管理和应用配置提供了触控友好 阅读详情

相关推荐

Cuckoo Sandbox多平台恶意软件分析环境搭建与配置实战指南

恶意软件分析是网络安全领域的核心实践,其核心原理在于在受控环境中执行可疑代码并监控其行为,从而揭示其意图与能力。这项技术的价值在于能够自动化、规模化地识别威胁,提取攻击指标,为安全运营和威胁情报提供关键数据。在实际应用场景中,分析师常面临跨平台威胁的挑战,例如同一恶意家族可能同时针对Windows、Linux和Android系统。Cuckoo Sandbox作为开源的自动化分析系统,通过其主从架构和虚拟化集成能力,有效解决了这一痛点。它允许安全团队在一个统一平台下管理多种操作系统分析环境,实现样本的并行分析

cuyi7076的博客 472

内核ACPI函数API之acpi_reboot

acpi_reboot 这个函数用于写pci/io/memory的相关寄存器让其重启 其源码分析如下: void acpi_reboot(void) { struct acpi_generic_address *rr; struct pci_bus *bus0; u8 reset_value; unsigned int devfn; if (acpi_disabled) ret...

jason的笔记 1513

安卓SO层逆向实战:从静态分析到动态调试的完整指南

在移动安全领域,SO(共享库)层逆向是深入分析应用核心逻辑的关键技术。其原理在于,安卓应用常将关键算法、加密验证等敏感代码编译为原生SO文件,以提升逆向难度。掌握SO逆向技术,对于安全研究、漏洞挖掘和CTF竞赛具有重要价值,尤其在分析金融、游戏等高安全需求的应用场景时不可或缺。本文以实战案例为基础,系统讲解如何通过动静结合的方法,运用IDA Pro等工具进行SO文件分析,并重点演示动态调试技巧,帮助读者理解如何绕过反调试机制,高效定位关键函数与算法逻辑。

weixin_30268071的博客 426

android x86安装到硬盘不能启动,PC下安装androidx86一些问题的解决方法,gui start

1、使用UltraISO刻录镜像到U盘安装时出现的问题启动后停在:syslinux 3.86 2010-04-01 ebios copyright (C)11994-2010 Hpeter Anvim et albaidu或google中大部分解决方法是修改syslinux.cfg文件。按照说明修改重启后,提示Could not find kernel image: linux。解决方法:换用Un...

weixin_29006187的博客 5388

Android逆向分析平台搭建:Frida环境部署与实战指南

在移动安全领域,动态分析技术是理解应用运行时行为的关键手段。其核心原理在于通过代码注入和运行时监控,实现对目标应用内部逻辑的探查与干预。这项技术的工程价值在于能够帮助安全研究人员、开发者深入分析应用的数据流、加密算法和通信协议,从而应用于漏洞挖掘、恶意软件分析、协议逆向等场景。Frida作为当前主流的动态分析框架,以其跨平台、脚本化、高灵活性的特点,成为构建逆向分析平台的首选工具。本文聚焦于Android平台,针对Frida环境部署中的常见痛点,如版本兼容性、模拟器配置、真机Root等,提供了一套从控制端到

weixin_34195142的博客 325

安卓高版本HTTPS抓包实战:从证书信任链到系统证书安装

HTTPS协议通过SSL/TLS证书信任链确保通信安全,其核心原理是客户端验证服务器证书是否由受信任的根证书颁发机构签发。在移动应用开发和安全测试领域,为了分析网络流量、调试接口或进行安全评估,常需对HTTPS流量进行解密,这便引入了中间人攻击的技术场景。抓包工具通过扮演中间人角色,拦截并解密流量,其技术价值在于为开发调试、安全审计和性能分析提供了关键可见性。然而,自Android 7.0起,系统默认只信任预置的系统证书,不再信任用户安装的证书,这直接导致常规抓包方法失效。本文聚焦于解决这一核心挑战,详细阐

aiman5818的博客 423

x86平台下 Android 系统的 Linux 部分的重启分析

在 Android 下, 我们在命令行中敲入 reboot 后系统的重启首先是执行的 reboot 这个 应用程序。这是一个比较简单的小程序,其源码在 代码如下: 1 if  if(poweroff) 2 ret system/core/toolbox/reboot.c,主要的 = __reboot(LINUX_REBOOT_MAGIC1, LINUX_REBOOT_MAGIC

JK198310的专栏 1445

安卓7+ HTTPS抓包实战:非Root设备安装系统级CA证书详解

HTTPS协议通过TLS/SSL加密保障数据传输安全,其核心机制依赖于CA证书的信任链验证。中间人抓包工具的工作原理是在客户端与服务器之间建立代理,通过动态生成并由自有CA签发的证书完成双向通信解密,这要求客户端必须信任抓包工具的根证书。在安卓7.0及以上版本中,系统引入了更严格的网络安全配置,默认仅信任系统凭据存储区的证书,不再自动信任用户安装的证书,这直接导致了传统抓包方法失效。为解决这一工程难题,技术实践的关键在于将抓包工具的CA证书安装到系统证书目录。本文以Charles为例,详细阐述了在非Root

cixu3288的博客 369

Android 系统自动重启Bug(高通平台)

最近客户反馈了一个Bug,安

visionliao的专栏 1万+

NOIP2008年普及组初赛题目答案及解析

NOIP2008年初赛详细题解

城南蝈蝈 926

C#实战:如何用winmm.dll打造毫秒级高精度定时器(附完整代码)

本文详细介绍了在C#中利用winmm.dll实现毫秒级高精度定时器的完整方案。针对.NET内置定时器精度不足的问题,通过调用timeSetEvent等原生API,提供了超越系统时钟中断周期的精准定时能力。文章包含核心原理剖析、完整的封装类代码以及音视频处理、游戏开发等场景下的实战应用与性能调优指南。

ujm5678901的博客 690

X86硬件底层之硬件cpu 重启&关机&开机

一、CPU重启问题 1.关于硬件重启有如下三种方式:KBC reset、PORT 92h(端口值控制SUS#)、Ware reset

sdl0358的博客 3226

FinRL实战:5步搞定股票量化交易策略(附Python代码)

本文详细介绍了如何使用FinRL框架,通过5个步骤构建基于深度强化学习的股票量化交易策略。内容涵盖从环境搭建、数据获取与预处理,到交易环境构建、模型训练(如PPO算法),以及策略回测评估与优化的完整流程,并提供了可运行的Python代码示例,帮助读者快速入门AI驱动的量化交易。

weixin_29062865的博客 628

Android 手机的高级终端 Termux 安装使用、busybox、安卓 手机 web

手机已经 root安装 tsu,这是一个 su 的 Termux 版本,是一个真正的 root 权限,用来在 Termux上替代su,操作不慎可能对手机有安全风险,因为官方封装了,所以安装也很简单:安装 tsu:pkg install tsu -y切换到 root:tsu退出 root:exittsu切换 root 用户时会弹出 root 授权提示,给予其 root 权限即可。在管理员身份下输入 exit 可回到普通用户身份。

freeking101的博客 10万+

别再花屏了!手把手教你用STM32CubeIDE搞定LVGL 8.3移植(附完整源码)

本文详细介绍了如何在STM32CubeIDE环境下成功移植LVGL 8.3,解决常见的花屏问题。从环境配置、显示驱动优化到编译警告处理,提供完整的实战方案和源码示例,帮助开发者快速实现流畅的嵌入式GUI界面。特别针对STM32平台的DMA2D加速和内存管理进行了深度优化。

weixin_33739646的博客 243

全国大学生软件测试大赛Web应用测试(二)Selenium功能测试环境配置

全国大学生软件测试大赛Web应用测试(二)Selenium功能测试环境配置指南配置JAVA配置mooctest配置ChromeDriver配置SeleniumSelenium的使用 环境配置指南 配置JAVA 首先进入JDK8官方安装地址 然后找到Windows 64位 jdk8 点击下载(这里下载需要登录Orcale 账户) 下载后JDK的安装根据提示进行,还有安装JDK的时候也会安装JRE,一并安装就可以了。 安装JDK,安装过程中可以自定义安装目录等信息,例如我们选择安装目录为 D:\java\jav

Kennen0_0的博客 9606

如何在Android设备上快速部署多系统环境:完整实战指南

Limbo是一款基于QEMU的强大Android虚拟机软件,能够将你的手机或平板变身为功能完整的虚拟计算机。这款开源项目支持x86、ARM、PowerPC和SPARC等多种架构模拟,让你在移动设备上轻松运行Windows、Linux等操作系统。无论你是开发者测试跨平台应用,还是技术爱好者学习操作系统原理,Limbo都能为你提供安全、便捷的虚拟化解决方案。 ## 项目概览与核心价值 ### 为什

gitblog_01114的博客 1124

【Proteus仿真】51单片机+DAC0832+数码管制作0-25V电压可调

【Proteus仿真】51单片机+DAC0832+数码管制作0-25V电压可调

perseverance51博客 2117

linux关机时emmc驱动处理流程

代码如下: /** * kernel_restart - reboot the system * @cmd: pointer to buffer containing command to execute for restart * or %NULL * * Shutdown everything and perform a clean reboot. * This is not s

dengziliang001的专栏 7591

【ArcGIS Pro微课1000例】0073:ArcGIS Pro3.5.2学习版下载及安装教程

ArcGIS Pro 3.5.2安装教程摘要:系统需Windows10及以上,8GB内存(推荐32GB)。安装步骤:1)安装.NET 8.0运行环境;2)执行主程序安装包,按向导完成基础安装;3)安装升级补丁;4)替换AfCore.dll文件并导入注册表。注意安装后删除临时文件节省空间。软件下载地址包含在百度网盘链接。安装过程需依次完成环境配置、主程序安装、补丁更新及破解步骤。

智慧空间实验室 1779

【用unity实现100个游戏之1】制作类元气骑士、挺进地牢——俯视角射击游戏多种射击效果(二)(附源码)

这篇文章我们将继续实现曲线射击与两种不需要实体子弹的射击方式 源码在文章末尾。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 5061

Linux reboot命令底层原理与系统重启机制解析

reboot是Linux系统中最基础却最易被误解的管理命令,其本质是触发内核级复位操作的系统调用接口。它并非简单终止进程,而是通过init系统(SysVinit/Upstart/systemd)协调服务停止、日志刷盘、设备卸载等完整生命周期流程。在systemd架构下,reboot已演变为D-Bus总线上的权限受控事件,依赖polkit策略与login1服务实现安全审计;而在嵌入式或容器环境(如ADB、Docker),则绕过用户空间直接作用于BootROM或命名空间隔离层。理解reboot的执行路径、参数语

cmff98425的博客 445

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Windows平台Frida+Python安卓APP逆向分析实战:从环境搭建到Hook脚本编写

动态插桩技术是软件逆向分析与安全测试领域的核心方法之一,它允许在不修改原始程序的情况下,实时监控和干预其运行时行为。其原理是通过向目标进程注入代码,拦截函数调用、读写内存数据,从而实现对程序内部逻辑的深度洞察。这项技术在移动安全、漏洞挖掘、协议分析和自动化测试中具有极高价值,尤其适用于安卓APP的运行时行为分析。Frida作为一款主流的动态插桩框架,以其跨平台、支持JavaScript脚本和强大的动态交互能力,成为逆向工程师和安全研究员的得力工具。结合Python进行自动化脚本开发,可以构建高效的分析工作流

weixin_34186128的博客 378

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Android逆向工程环境搭建:从零构建静态分析与动态调试平台

在移动应用安全领域,逆向工程是分析应用内部逻辑、检测漏洞和识别恶意行为的核心技术。其原理在于通过静态与动态分析相结合的方式,深入理解应用运行机制。静态分析通过反编译工具将字节码转换为可读代码,揭示程序结构和逻辑;动态分析则借助调试和插桩技术在应用运行时监控和修改其行为,这对理解复杂交互和加密算法至关重要。掌握逆向工程不仅能提升应用安全评估能力,还能帮助开发者优化代码和进行兼容性测试。在Android平台,搭建一个高效的逆向环境是开展这些工作的基础,涉及Java环境配置、Android SDK部署以及Frid

weixin_30861459的博客 494

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Windows 10下Frida环境搭建与安卓应用动态分析实战指南

动态代码插桩技术是现代移动安全与逆向工程的核心手段,它允许开发者在应用运行时注入并执行自定义代码,实现对函数调用、数据流和程序逻辑的实时监控与修改。其原理是通过在目标进程内存中注入代理,拦截并重定向指定的函数执行路径。这项技术的核心价值在于弥补了静态分析的不足,能够直观揭示运行时行为,广泛应用于应用安全审计、漏洞挖掘、协议分析和恶意软件检测等领域。在安卓平台,Frida作为主流动态插桩框架,通过客户端-服务器架构实现高效Hook。本文聚焦于Windows 10平台,详细解析如何配置Python环境、部署Fr

weixin_34032621的博客 413
上一篇: ubuntu10.04 浏览器flash安装方法
下一篇: BIOS启动原理
huber
博客等级 码龄15年 79粉丝 24原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值