基于android2.3.5系统:开天辟地Android启动机制[四]

Android2.3.5系统编译环境的搭建与Android系统源代码情景分析例子 1. 下载Android2.3.5及期kernel 以下是参考资料: https://blog.csdn.net/hty1053240123/article/details/78333007 android2.2-8.0百度网盘 https://pan.baidu.com/s/1eRNFNLw 密码:wthp Android2.3.5版本下载 https://download.csdn.net/... 阅读详情

***************************************************************************************************************************
作者:EasyWave                                                                                 时间:2013.02.08

类别:Android系统源码分析                                                              声明:转载,请保留链接

注意:如有错误,欢迎指正。这些是我学习的日志文章......

***************************************************************************************************************************

在我的博文基于android2.3.5学习之:开天辟地Android启动机制[三]中,详细的介绍了ueventd的解析机制,在分析andriod2.3.5中的action_list、action_queue、service_list,之前,还是先来详细介绍在Andriod是如何调用内核中的一些函数,比如:chown以及chroot等等。Andriod中的三大链表如下图所示:

详细的介绍,将留在后面的文章中详细解释,因为,在这之前,需要先了解下linux中的syscall,就是系统调用。以chown命令为例,详细的解析Android中是如何执行chown这个命令的,在system/core/init/keywords.h中,我们可以看到如下的定义:

这里只分析红色圈中的部分,其他部分的代码,请自行分析,都是大同小异啦。进入do_chown函数中,可以看到如下的代码(在/system/core/init/Builtins.c):

进入深入进去发现chown是调用bionic\libc\arch-arm\syscalls下的chown.s文件,当然如果是其它的平台,那么路径是不一样的,这里只讨论ARM架构下的代码,如下图所示:

看到了吗,最终是调用__NR_chown32这个标号指定的函数地址,它是在哪里调用的呢,我们可以从上面的#include <sys/linux-syscalls.h>中找到答案。如下代码:

/* auto-generated by gensyscalls.py, do not touch */
#ifndef _BIONIC_LINUX_SYSCALLS_H_

#if !defined __ASM_ARM_UNISTD_H && !defined __ASM_I386_UNISTD_H
#if defined __arm__ && !defined __ARM_EABI__ && !defined __thumb__
  #  define __NR_SYSCALL_BASE  0x900000
  #else
  #  define  __NR_SYSCALL_BASE  0
  #endif

#define __NR_exit                         (__NR_SYSCALL_BASE + 1)
#define __NR_fork                         (__NR_SYSCALL_BASE + 2)
#define __NR_clone                        (__NR_SYSCALL_BASE + 120)
......
#define __NR_chown32                      (__NR_SYSCALL_BASE + 212)
#define __NR_lchown32                     (__NR_SYSCALL_BASE + 198)
......
#ifdef __arm__
#define __NR_exit_group                   (__NR_SYSCALL_BASE + 248)
#define __NR_waitid                       (__NR_SYSCALL_BASE + 280)
#define __NR_vfork                        (__NR_SYSCALL_BASE + 190)
#define __NR_openat                       (__NR_SYSCALL_BASE + 322)
......
#define __NR_ARM_set_tls                  (__NR_SYSCALL_BASE + 983045)
#define __NR_ARM_cacheflush               (__NR_SYSCALL_BASE + 983042)
#endif


#endif

#endif /* _BIONIC_LINUX_SYSCALLS_H_

从上面的代码中,我们看到#define __NR_chown32                      (__NR_SYSCALL_BASE + 212) 这行代码,不错,这个就是我们需要了解的。

在bionic\libc\kernel\arch-arm\asm中的Unistd.h文件中,我们也可以看到如下的代码,注意,这个是linux内核相关的。如下所示:

红色圈中的部分,看出来什么名堂没有呢,当然它们都是指向__NR_SYSCALL_BASE + 212 这个偏移地址,而在linux系统中定义如下(arch\arm\include\asm\Unistd.h):

看到了吗,上面红色圈中的部分的定义是跟Andriod中的定义是一样的,都是:#define __NR_chown32   (__NR_SYSCALL_BASE+212) 这个偏移地址。我们再来看看syscall调用的定义是在哪里的呢。最终调用的是:arch\arm\kernel\entry-common.S下的syscall函数,如下图所示:

同时syscall的函数代码如下所示:

最终会将#include "calls.S"文件加入进来,而calls.S文件主要是定义了一个sys_call_table表格而已,如下所示:

/*
 *  linux/arch/arm/kernel/calls.S
 *
 *  Copyright (C) 1995-2005 Russell King
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
 *
 *  This file is included thrice in entry-common.S
 */
/* 0 */		CALL(sys_restart_syscall)
		CALL(sys_exit)
		CALL(sys_fork_wrapper)
		CALL(sys_read)
		CALL(sys_write)
/* 5 */		CALL(sys_open)
		CALL(sys_close)
		CALL(sys_ni_syscall)		/* was sys_waitpid */
		CALL(sys_creat)
		CALL(sys_link)
......
/* 210 */	CALL(sys_setresgid)
		CALL(sys_getresgid)
		CALL(sys_chown) //212 : 调用sys_chown函数
		CALL(sys_setuid)
		CALL(sys_setgid)
......
/* 300 */	CALL(sys_semctl)
		CALL(sys_msgsnd)
		CALL(sys_msgrcv)
		CALL(sys_msgget)
		CALL(sys_msgctl)
/* 305 */	CALL(sys_shmat)
		CALL(sys_shmdt)
		CALL(sys_shmget)
		CALL(sys_shmctl)
		CALL(sys_add_key)
/* 310 */	CALL(sys_request_key)
		CALL(sys_keyctl)
		CALL(ABI(sys_semtimedop, sys_oabi_semtimedop))
/* vserver */	CALL(sys_ni_syscall)
		CALL(sys_ioprio_set)
/* 315 */	CALL(sys_ioprio_get)
		CALL(sys_inotify_init)
		CALL(sys_inotify_add_watch)
		CALL(sys_inotify_rm_watch)
		CALL(sys_mbind)
/* 320 */	CALL(sys_get_mempolicy)
		CALL(sys_set_mempolicy)
		CALL(sys_openat)
		CALL(sys_mkdirat)
		CALL(sys_mknodat)
......
		CALL(sys_preadv)
		CALL(sys_pwritev)
		CALL(sys_rt_tgsigqueueinfo)
		CALL(sys_perf_event_open)
/* 365 */	CALL(sys_recvmmsg)
#ifndef syscalls_counted
.equ syscalls_padding, ((NR_syscalls + 3) & ~3) - NR_syscalls
#define syscalls_counted
#endif
.rept syscalls_padding
		CALL(sys_ni_syscall)
.endr

 

       至此,我们了解了Anriod系统中的chown命令是通过syscall来调用linux内核中的系统函数chown函数,现在应该明白了吧,其他的命令基本一致,其实在busybox中也是采用内似的方法来做的。具体关于syscall的调用方法,可以到网络上去搜索,我这里就不详细的解释了。

 

深入理解Android进程间通信机制 ​通信是Android开发必不可少的一部分,不管是我们做应用App开发,还是Android系统,都使用了大量的通信。通信又分为进程间通信和进程内通信,在这篇文章,我主要深入讲解Android系统所涉及到的所有进程间通信方式。 Android系统中有大量IPC(进程间通信)的场景,比如我们想要创建一个新的进程,需要通过Socket这种IPC方式去让Zygote Fork新进程;如果我们要杀掉一个进程,需要通过信号这种IPC方式去将SIGNAL_KILL信号传递到系统内核;如果我们想要唤醒主线程处于休眠中的Lo 阅读详情

相关推荐

基于android2.3.5系统:开天辟地Android启动机制[一]

在android的系统中init程序是第一个运行的程序,这是一个守护进程,而具体的代码在android2.3.5的源码中,位于system/core/init/init.c文档中,这个是main函数的入口,也是android启动机制的入口。

嵌入式与人工智能天地 4440

在Linux上,编写一个每秒接收100万UDP数据包的程序究竟有多难

转载自:http://chuansong.me/n/1489325 在上周的一次非正式谈话中,我偶然听同事说:“Linux的网络栈太慢了!你别指望每秒在每个核上传输超过5万的数据包”。 这让我陷入了沉思,虽然对于任意的实际应用来说,每个核5万的速率可能是极限了,但Linux的网络栈究竟可能达到多少呢?我们换一种更有趣的方式来问: 在Linux上

IT小小鸟 1万+

安卓 2.3.5 rom

安卓 索爱x8 系统 安卓 2.3.5 rom

基于android2.3.5系统:源码下载及android体系架构

先熟悉整个android的架构,弄明白android系统的各个组件的分布以及代码分析,并将学习过程放在我的blog上。到时候可以回过头来看看,自己到底得到了什么。主要是没有钱去卖开发板,因此只能用goldfish的代码来了解和分析android与内核之间的硬件抽象层的关系,因为在整个android的移植过程中,硬件抽象层是最重要的,毕竟它是android和linux内核的中间桥梁。

嵌入式与人工智能天地 1万+

安卓手机系统2.3.5ROOT权限获得

想要获取Android手机ROOT权限吗? 拿到新机,总有不少系统定制的软件。无用,还删不了。 这时只有ROOT了。就是获取最高权限。安卓2.3.3以上版本我试了很多方法。终于还是成功破解。 不多说,首先在电脑上装上豌豆荚,手机连接电脑。在虚礼光盘中只装手机驱动。这样就可以连接电脑了。 然后解压并安装APK软件里的Superuser.apk,接着解压出来Root.bat到电脑双击运行,按提示操作,操作完后手机会自动重启,重启后机器就得到ROOT权限了,这样你能删除手机内置的一些没用软件,只要你照做就能成功。

qt5.14.2+vs2019配置msvc2017编译器

qt5.14.2+vs2019配置msvc2017编译器 在使用qt编译程序时此前一直使用的是自带的MinGW 32-bit和64-bit,现在想使用msvc编译器。本次使用的是qt5.14.2,vs2019,需要配置msvc2017的32-bit和64-bit编译器。 1、首先安装好qt5.14.2和vs2019,其次在visual studio installer选择修改,然后选择msvc2017对应的组件,本次安装的是这两个 2、打开qt creator的工具–选项–kits–编译器,选择Manu

bangtanhui的博客 1万+

基于Android2.3.5系统:Android.mk文件解析

在Linux下编辑经常要写一个Makefile文件, 可以把这个Makefile文件理解成一个编译配置文件,即指导编译器如何来编译程序,并决定编译的结果是什么。当然在Linux对于大项目而言手工编写Makefile文件是很可怕的一件事,因此出现了automake,autoconf这类工具,而在Android下的Android.mk文件也是这种类似的功能,即Android.mk文件是针对Android的Makefile的文件

嵌入式与人工智能天地 2158

基于 OptiSystem 的掺铒光纤放大器(EDFA)分析

通过构建 EDFA 仿真模型,系统分析了铒离子掺杂半径、离子浓度、光纤长度及泵浦功率等关键参数对放大器增益和噪声特性的影响规律,为 EDFA 的优化设计提供了理论依据与仿真支撑。继续增大至 9μm,增益趋于稳定(约 19dB)。继续增加至 200mW,增益仅增加 2dB,表明泵浦功率存在阈值效应(约 100mW),超过后增益饱和明显。:作为增益介质,主要参数包括光纤长度(5~50m)、铒离子掺杂半径(1~10μm)、离子浓度(1×10²⁵~5×10²⁵m⁻³)、纤芯半径 2.2μm、数值孔径 0.24。

2501_91855190的博客 2677

基于android2.3.5系统:开天辟地Android启动机制[二]

在我的博文基于goldfish和android2.3.5学习之:开天辟地Android启动机制[一]中,介绍了整个android系统的启动机制,这次将更深入的详细分析android的uevent的机制以及如何android是如何透过内核传递过来的数据通过uevent建立设备节点以及一些hotplug事件。在Andorid2.3.5源码system/core/init.c函数中ueventd_main()函数

嵌入式与人工智能天地 5119

箱式连续提升机

箱式连续提升机,是对具有高度差较大(>1500mm)的输送线之间进行连接,将箱式物资进行连续输送的提升(或下降)的输送设备,可根据输送线的具体输送要求作相应的参数设计。目前的箱式连续提升机种类比较多,常用的形式主要有Z型和C型,工作原理相同,只是入口和出口分别在两侧和同侧。

月生沧溟 1250

使用cubeMX生成USB HID设备

本文主要介绍如何使用stm32开发板和cubeMX生成HID设备,供参考。

专注音频,高效工作,快乐生活! 970

基于android2.3.5系统:开天辟地Android启动机制[三]

在我的博文基于goldfish和android2.3.5学习之:开天辟地Android启动机制[二]中,部分的介绍了uevent事件机制,这篇博文将更深入的详细分析uevent的机制以及如何android是如何透过内核传递过来的数据通过uevent机制检测设备的hotplug事件。

嵌入式与人工智能天地 4135

STM32 SAES硬件加密协处理器全模式工程实践指南

AES(高级加密标准)是嵌入式系统中最基础且关键的对称密码算法,其硬件加速实现直接影响安全、性能与功耗平衡。Secure AES Coprocessor(SAES)作为STMicroelectronics在STM32U5等高安全MCU中集成的专用密码协处理器,不仅支持标准ECB/CBC/CTR模式,更原生兼容GCM和CCM等认证加密模式,具备抗侧信道、密钥保护与DMA卸载能力。理解其寄存器状态机(CHMOD/MODE/CPHASE)、NPBLB数据对齐机制及GCM四阶段编程范式,是规避Tag校验失败、IV错

weixin_42311427的博客 77

Android内核学习文章

0、android系统启动 《Android系统启动流程 -- bootloader》 《The Android boot process from power on》 1、init 《深入理解android 卷1》 第3章 深入理解init 《Android框架揭秘》第3章 init进程 《Android的init过程详解(一)》 《

xin128888的专栏 1099

数控系统(CNC)系列:Fanuc 31i-B_(5).基本操作与编程

Fanuc 31i-B 系统使用 G 代码和 M 代码进行编程。G 代码主要用于控制机床的运动,M 代码用于控制辅助功能,如冷却液开关、主轴启动等。G 代码:用于指定机床的运动方式。例如,G00 用于快速定位,G01 用于直线插补,G02 用于顺时针圆弧插补,G03 用于逆时针圆弧插补。M 代码:用于控制机床的辅助功能。例如,M03 用于启动主轴顺时针旋转,M05 用于停止主轴,M08 用于开启冷却液,M09 用于关闭冷却液。

2401_87715305的博客 1766

编织数据的实时脉络——构建基于MySQL的数据编织平台,实现实时数据治理

除了上述基本设置外,我们还可以根据实际应用场景自定义一些特定的监控项目。例如,对于某些高并发读写的表,可能需要特别关注它们的锁等待时间和回滚段使用率;而对于涉及到跨库关联查询的操作,则应当着重检查网络延迟及缓存命中率等因素。-- 获取InnoDB行级锁等待情况-- 统计各表的缓存命中率这段SQL脚本不仅展示了如何查询InnoDB引擎下的锁争用状况,还介绍了计算表级别缓存命中率的方法,有助于深入理解系统的运行状态。

墨夶的博客 1789

11月26日:操作系统实验杂记 msgget(创建消息队列) msgsnd(发送消息) msggrcv(接收消息) msgctl(控制消息队列)

注意:下面介绍的函数都需要导入头文件

hanmo22357的博客 2610

【Godot】【工程】中文字体与多语言(缺字/体积/打包:一次性配置到位)

本文介绍了Godot游戏开发中的中文字体配置与多语言支持方案。主要内容包括:1)中文字体的全局与局部设置;2)使用子集化技术减小字体体积;3)多语言资源管理及翻译系统实现;4)语言切换机制与控件刷新方法;5)字体回退策略优化显示效果;6)打包优化建议。文章提供了从字体导入到多语言实现的完整解决方案,帮助开发者系统性解决中文显示和多语言支持问题,同时优化资源体积和性能表现。配套案例可供学习参考。

技术小甜甜:传播可落地技术,帮助个人和企业降低解决真实场景问题的成本 598

android通过c调用shmat函数,编译可在Android上运行的qemu user mode

编译可在Android上运行的qemu user mode@(Android研究)[android|qemu][TOC]前言本文在Ubuntu 64位系统上对qemu项目进行交叉编译,并且只编译与qemu user mode有关的代码。下文中的"NDK"若无特殊说明均指"Android NDK"。下文中"$NDK"表示的是NDK的根目录。步骤1. 下载并安装Android NDK下载并安装Andr...

weixin_32862641的博客 684

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

android ndk机制,我们可以在android NDK代码中使用System IPC吗?

一年前,我写了一篇关于这个话题的调查.这是它的一部分:2 Unix IPC机制Unix IPC机制包括:> Unix信号.> Unix管道.> Unix域套接字.同时Android System-V IPC机制不包含在Android中.仿生故意不提供对System-V IPC机制的支持,例如由semget(),shmget(),msgget()提供的.这样做的原因是为了避免拒绝 ...

weixin_39587010的博客 410

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

android+5系统,Android2.3.5系统+华为UI

好的系统需要一个好的屏幕来展示,因此在说系统之前我们还是先简单说下华为U8860采用的屏幕吧。该机采用的是长宽16:9的TFT面板,分辨率为854x480可以获得良好的互联网体验。同时该机采用了半透膜技术,在保证屏幕透光率的同时确保了在强光下能够正常显示。因此实际的体验效果来看华为U8860的现实效果也是非常的出色,无论是强光下还是正常室内灯光,现实效果都非常不错,配合多点触控的屏幕UI界面运行的...

weixin_42514752的博客 292

低版本ulibc支持recvmmsg sendmmsg功能

最近调试openwrt,发现低版本的ulibc不支持recv/send mmsg API,故简单写个实现一个测试程序,直接贴代码吧!,这里的程序可能兼容新版版本的ulibc出现问题,所以使用wrap_简单封装一下。 #define _GNU_SOURCE #include <netinet/ip.h> #include <stdio.h> #include <st...

striver1205的专栏 989

使用reuseport和recvmmsg优化UDP服务器_应用服务器

地址:http://www.shangxueba.com/jingyan/2216074.html 最近刚好完成了一个DNS服务器的开发,因此积累一点对高性能UDP服务器的开发经验。如果你也遇到UDP服务器的性能不佳,远不如你的预期,也许你也可以采用本文的手段去优化一下试试。     udp不像tcp是有连接的,因此udp不能通过建立多个连接来提高对服务器的并发访问,然后我

chenycbbc0101的博客 6365

Android系统启动(上篇)

前面我准备开始讲性能优化,讲到一半发现根本讲不下去。性能优化是基于对Framework深入理解的基础上的应用,如果对Framework没有深入的理解的话,又怎么能去很好的去做性能优化呢?所以,我调整了一下顺序。先讲清楚Framework这一块,然后再去补充性能优化专题。我们也是从开机到应用程序画面显示在我们面前这一流程开始。

qq_36428821的博客 2348

msgget();msgsnd();msgrcv();msgctl(); 消息队列 Linux进程间的通信方式之消息队列

Linux进程间的通信方式 -———消息队列。 消息队列和共享内存类似 消息队列它允许一个或多个进程向它写消息,一个或多个进程向它写读消息。 消息队列存在于系统内核中,消息的数量受系统限制。 我们来看一下有关消息队列的函数。 msgget();msgsnd();msgrcv();msgctl(); 第一个函数: #include int msgget(key_t    key,in

顾修忠的博客 1万+
上一篇: Linux内核中kzalloc函数详解
下一篇: 基于android2.3.5系统:Android中native层C++单例模式
wang-bob
博客等级 码龄20年 356粉丝 112原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值