日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

android 系统重启关机 方法 非常好的一篇文章

發布時間:2024/9/3 windows 59 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android 系统重启关机 方法 非常好的一篇文章 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1.5 android 系統重啟關機流程分析

1.5.1 c語言中調用 reboot 函數 ?HAL層中重啟系統的方法

bionic/libc/unistd/reboot.c:33:

使用需要的頭文件:#include?<sys/reboot.h>?

int reboot (int mode)

{

return __reboot( LINUX_REBOOT_MAGIC1, LINUX_REBOOT_MAGIC2, mode,NULL );

}

1.5.2 通過 adb 讓系統重啟

adb reboot recovery 進入 recovery 模式

adb reboot bootloader 進入 fastboot 模式

adb reboot-bootloader

adb reboot 不帶參數 系統正常重啟

adb 是pc端工具,adbd是服務端,運行在手機

adbd 讀取 socket 解析由 adb 傳過來的命令串

int service_to_fd(const char *name)

if(!strncmp(name, "reboot:", 7)) {

void* arg = strdup(name + 7);

if(arg == 0) return -1;

ret = create_service_thread(reboot_service, arg);

system/core/adb/services.c:176:

void reboot_service(int fd, void *arg)

{

。。。

ret = __reboot(LINUX_REBOOT_MAGIC1, LINUX_REBOOT_MAGIC2,

LINUX_REBOOT_CMD_RESTART2, (char *)arg);

。。。

}

bionic/libc/kernel/common/linux/reboot.h

#define LINUX_REBOOT_CMD_RESTART 0x01234567

#define LINUX_REBOOT_CMD_HALT 0xCDEF0123

kernel/include/linux/reboot.h:33:

#define LINUX_REBOOT_CMD_RESTART2 0xA1B2C3D4

arg 對應字符串: recovery bootloader

./kernel/arch/arm/mach-msm/pm2.c

system/core/adb/commandline.c

if (!strcmp(argv[0], "reboot-bootloader"))

snprintf(command, sizeof(command), "reboot:bootloader");

如果輸入 adb reboot-bootloader adb 會對該命令進行轉換 相當于執行 adb rebootbootloader

1.5.3 fastboot 模式下系統重啟

fastboot reboot 系統正常重啟

fastboot reboot-bootloader 重啟進入fastboot 模式

fastboot 是 appboot 提供的功能,可以用它來燒寫 system 等鏡像文件

bootable/bootloader/lk/app/aboot/aboot.c

APP_START(aboot)

.init = aboot_init,

void aboot_init(const struct app_descriptor *app)

。。。

fastboot_register("reboot", cmd_reboot);

fastboot_register("reboot-bootloader",cmd_reboot_bootloader);

。。。

void cmd_reboot(const char *arg, void *data, unsigned sz)

{

dprintf(INFO, "rebooting the device\n");

fastboot_okay("");

reboot_device(0);

}

void cmd_reboot_bootloader(const char *arg, void *data, unsignedsz)

{

dprintf(INFO, "rebooting the device\n");

fastboot_okay("");

reboot_device(FASTBOOT_MODE);

}

bootable/bootloader/lk/target/msm7630_surf/init.c:311:

void reboot_device(unsigned reboot_reason)

bootable/bootloader/lk/target/msm7627_ffa/init.c:174:

void reboot_device(unsigned reboot_reason)

void reboot_device(unsigned reboot_reason)

{

reboot(reboot_reason);

}

調用的是c函數:

bionic/libc/unistd/reboot.c:33:

int reboot (int mode)

{

return __reboot( LINUX_REBOOT_MAGIC1, LINUX_REBOOT_MAGIC2, mode,NULL );

}

bootable/bootloader/lk/app/aboot/aboot.c:59:

#define FASTBOOT_MODE 0x77665500

if (!strcmp(cmd, "bootloader")) {

restart_reason = 0x77665500;

}

1.5.4 系統關機

正常按鍵關機

./frameworks/policies/base/phone/com/android/internal/policy/impl/PhoneWindowManager.java

void showGlobalActionsDialog()

mGlobalActions.showDialog(keyguardShowing,isDeviceProvisioned());

調用文件:

./frameworks/policies/base/phone/com/android/internal/policy/impl/GlobalActions.java

中的函數:

public void showDialog(boolean keyguardShowing, booleanisDeviceProvisioned)

mDialog = createDialog();

調用本文件中的函數:

private AlertDialog createDialog()

public void onPress() {

ShutdownThread.shutdownAfterDisablingRadio(mContext, true);

}

調用文件:

./frameworks/policies/base/phone/com/android/internal/policy/impl/ShutdownThread.java

中的函數:

public static void shutdownAfterDisablingRadio(final Contextcontext, boolean confirm)

beginShutdownSequence(context)

調用本文件中的函數:

private static void beginShutdownSequence(Context context)

sInstance.start()

進入關機線程的run函數:

public void run() {

首先關藍牙,關射頻,然后再關電源

...

sBluetooth.disable(false)

...

sPhone.setRadio(false)

...

SystemClock.sleep(PHONE_STATE_POLL_SLEEP_MSEC);

...

Power.shutdown()

}

frameworks/base/core/java/android/os/Power.java:92:

public static native void shutdown();

frameworks/base/core/jni/android_os_Power.cpp:107:

{ "shutdown", "()V", (void*)android_os_Power_shutdown },

jni 調用

static void android_os_Power_shutdown(JNIEnv *env, jobjectclazz)

{

sync();

#ifdef HAVE_ANDROID_OS

reboot(RB_POWER_OFF);

#endif

}

因為有 bionic/libc/include/sys/reboot.h:42:

#define RB_POWER_OFF LINUX_REBOOT_CMD_POWER_OFF

所以實際相對執行

reboot(LINUX_REBOOT_CMD_POWER_OFF);

__reboot( LINUX_REBOOT_MAGIC1, LINUX_REBOOT_MAGIC2,LINUX_REBOOT_CMD_POWER_OFF, NULL );

這里的 __reboot 是libc中的系統調用

bionic/libc/arch-x86/syscalls/__reboot.S

#include<sys/linux-syscalls.h>

.text

.type __reboot, #function

.globl __reboot

.align 4

.fnstart

__reboot:

.save {r4, r7}

stmfd sp!, {r4, r7}

ldr r7, =__NR_reboot

swi #0

ldmfd sp!, {r4, r7}

movs r0, r0

bxpl lr

b __set_syscall_errno

.fnend

1.5.5 內核中的系統調用 reboot

__NR_reboot 執行的是內核中的系統調用:

kernel/kernel/sys.c:310:

SYSCALL_DEFINE4(reboot, int, magic1, int, magic2, unsigned int,cmd,

void __user *, arg)

{

char buffer[256];

int ret = 0;

if (!capable(CAP_SYS_BOOT))

return -EPERM;

if (magic1 != LINUX_REBOOT_MAGIC1 ||

(magic2 != LINUX_REBOOT_MAGIC2&&

magic2 != LINUX_REBOOT_MAGIC2A&&

magic2 != LINUX_REBOOT_MAGIC2B&&

magic2 != LINUX_REBOOT_MAGIC2C))

return -EINVAL;

if ((cmd == LINUX_REBOOT_CMD_POWER_OFF)&& !pm_power_off)

cmd = LINUX_REBOOT_CMD_HALT;

lock_kernel();

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();

unlock_kernel();

do_exit(0);

panic("cannot halt");

case LINUX_REBOOT_CMD_POWER_OFF:

kernel_power_off();

unlock_kernel();

do_exit(0);

break;

case LINUX_REBOOT_CMD_RESTART2:

if (strncpy_from_user(&buffer[0], arg,sizeof(buffer) - 1) < 0) {

unlock_kernel();

return -EFAULT;

}

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;

}

unlock_kernel();

return ret;

}

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);

machine_restart(cmd);

}

kernel/kernel/sys.c:341:

void kernel_power_off(void)

{

kernel_shutdown_prepare(SYSTEM_POWER_OFF);

if (pm_power_off_prepare)

pm_power_off_prepare();

disable_nonboot_cpus();

sysdev_shutdown();

printk(KERN_EMERG "Power down.\n");

machine_power_off();

}

./kernel/arch/arm/kernel/process.c:219:

void machine_restart(char *cmd)

{

arm_pm_restart(reboot_mode, cmd);

}

void machine_power_off(void)

{

if (pm_power_off)

pm_power_off();

}

因為./kernel/arch/arm/mach-msm/pm2.c:1740:中有:

arm_pm_restart = msm_pm_restart;

pm_power_off = msm_pm_power_off;

所以 arm_pm_restart 調用的是:

static void msm_pm_restart(char str, const char *cmd)

{

msm_rpcrouter_close();

msm_proc_comm(PCOM_RESET_CHIP, &restart_reason,0);

for (;;)

;

}

pm_power_off 調用的是:

static void msm_pm_power_off(void)

{

msm_rpcrouter_close();

msm_proc_comm(PCOM_POWER_DOWN, 0, 0);

for (;;)

;

}

msm_proc_comm 是芯片級別的操作

msm_proc_comm_reset_modem_now 對modem芯片進行重啟

kernel/arch/arm/mach-msm/proc_comm.c:98:

int msm_proc_comm(unsigned cmd, unsigned *data1, unsigned*data2)

{

。。。

writel(cmd, base + APP_COMMAND);

writel(data1 ? *data1 : 0, base + APP_DATA1);

writel(data2 ? *data2 : 0, base + APP_DATA2);

。。。

}

內核里面writel是如何實現的

http://blog.chinaunix.net/u2/77776/showart_1404857.html

補充信息:

static int msm_reboot_call

(struct notifier_block *this, unsigned long code, void*_cmd)

{

if ((code == SYS_RESTART) &&_cmd) {

char *cmd = _cmd;

if (!strcmp(cmd, "bootloader")) {

restart_reason = 0x77665500;

} else if (!strcmp(cmd, "recovery")) {

restart_reason = 0x77665502;

} else if (!strcmp(cmd, "eraseflash")) {

restart_reason = 0x776655EF;

} else if (!strncmp(cmd, "oem-", 4)) {

unsigned code = simple_strtoul(cmd + 4, 0, 16) &0xff;

restart_reason = 0x6f656d00 | code;

} else {

restart_reason = 0x77665501;

}

}

return NOTIFY_DONE;

}

static struct notifier_block msm_reboot_notifier = {

.notifier_call = msm_reboot_call,

};

static int __init msm_pm_init(void)

register_reboot_notifier(&msm_reboot_notifier);

內核編譯相關:

kernel/arch/arm/mach-msm/pm2.c:1701: restart_reason =0x77665500;

kernel/arch/arm/mach-msm/pm.c:696: restart_reason =0x77665500;

kernel/arch/arm/mach-msm/Makefile:84:

ifdef CONFIG_MSM_N_WAY_SMSM

obj-$(CONFIG_PM) += pm2.o

else

obj-$(CONFIG_PM) += pm.o

endif

kernel/arch/arm/configs/msm7630-perf_defconfig:256:CONFIG_MSM_N_WAY_SMSM=y

kernel/arch/arm/configs/msm7627-perf_defconfig:247:CONFIG_MSM_N_WAY_SMSM=y

make -C kernelO=../out/target/product/msm7627_ffa/obj/KERNEL_OBJ ARCH=armCROSS_COMPILE=arm-eabi- msm7627-perf_defconfig

out/target/product/msm7627_ffa/obj/KERNEL_OBJ/.config

CONFIG_MSM_N_WAY_SMSM=y

總結

以上是生活随笔為你收集整理的android 系统重启关机 方法 非常好的一篇文章的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产在线一区视频 | 色姑娘天天操 | 日韩精品乱码久久久久久 | 国产a∨精品一区二区三区仙踪林 | 国产综合久久久久久鬼色 | 日日夜夜免费精品视频 | 超碰在线国产 | 四房婷婷| 99精品视频一区二区三区 | 欧美日韩123区 | 日韩欧美在线观看一区二区 | 亚洲av成人片色在线观看高潮 | 国产精品一卡二卡在线观看 | 国产精品高潮呻吟久久久 | 视频免费1区二区三区 | 中文字幕久久熟女蜜桃 | av av片在线看 | www.黄色片.com| 久久精品美乳 | 欧美色图自拍 | 国产区在线观看视频 | av在线播放免费 | 97视频在线免费观看 | 中文在线免费视频 | 蜜桃av在线免费观看 | 国产色在线视频 | 欧美人与性动交α欧美精品 | 亚洲人成无码网站久久99热国产 | 欧美国产一区二区 | 九九热这里有精品 | 免费高清毛片 | 无码少妇一级AV片在线观看 | 国产精品一区一区三区 | 69色视频| 久久影院一区 | av成人免费在线观看 | 国产青青草在线 | 无码人妻h动漫 | 怡红院av亚洲一区二区三区h | 激情影音 | 在线播放网址 | 国产一级免费看 | 91在线视频网址 | 亚洲乱码国产乱码精品精大量 | 亚洲a∨无码无在线观看 | 亚洲一区二区在线 | 国产观看 | av中文在线| 夜夜躁日日躁狠狠久久av | 国产精品久久久久久久妇 | 国产精品亚洲综合 | 中文字幕手机在线视频 | 亚洲九九视频 | 精品综合久久 | 免费观看一区二区三区毛片 | 91亚洲精品乱码久久久久久蜜桃 | 亚洲制服一区二区 | 亚洲第一狼人区 | 午夜精品一区二区三区在线播放 | 亚洲国产经典 | 中文字幕人妻一区二区三区在线视频 | 中文字幕人妻一区二区三区视频 | 亚洲国产91| 日本在线h | 日本成人午夜 | 无码国产色欲xxxx视频 | 日本精品一区二区三区视频 | 97久久国产亚洲精品超碰热 | 久久久久亚洲日日精品 | 美女三级黄色片 | 久久久久久久中文字幕 | 成年人在线免费观看网站 | 精品播放 | 久久动态图| 日韩高清免费观看 | 国产精品无码自拍 | 可以看的黄色网 | 色老大视频 | 中文无码精品一区二区三区 | 亚洲乱码久久 | 欧美一级艳片视频免费观看 | 内射一区二区 | 日韩三区视频 | 欧美不卡高清 | 综合网五月天 | 亚洲成人h| 欧美日韩一区二区视频在线观看 | 91视频啊啊啊 | 不卡一区在线 | 麻豆一区二区三区在线观看 | 69av在线播放| 久久曰视频 | 男女一级片| 亚洲成人一二三区 | a中文在线 | 亚洲熟女一区二区 | 亚洲精品小说 | 亚洲黄色中文字幕 | 久久日av|