Android 深入系统完全讲解(三)

news2024/9/22 6:00:37

系统调用

操作系统提供了一些方法,让用户层可以调用,而为了安全起见,这些方法调用,都是在内核空间。于是,用户调用的时候,就会有个动作,叫做陷入内核。

在这里插入图片描述
当用户调用系统方法的时候,系统方法每一个都有一个具体的编号,调用的时候,会约定放在具体的一个寄存器里面,然后调用 TRAP 指令,陷入内核。

内核会从寄存器中读取编号,然后获知具体的调用方法,跳到对应位置执行,执行完后返回结果。

对我们使用者来说,系统调用跟普通的调用函数没差别,我们用户层是感知不到这个部分,这块是由操作系统帮我们完成的。

线程

前面描述了进程,操作系统把程序加载起来,加载到内存,操作系统把这个称之为进程,然后默认情况下,进程会运行 main 方法,开始执行起来。

但是,因为我们的程序开发起来,大多时候都不是单一的任务,需要多个任务执行,所以如果进程里面只有一个运行流,则在开发过程中,会让多个任务混淆在一起,没办法优雅的实现。

于是,操作系统便在进程里面,再细化了一个概念,叫做线程。而把默认进程起来运行的main 这个运行流,就喊成了主线程。(实际就是进程起来后,它运行的这个主流程)

然后我们在进程里面,创建一些线程,让每个线程完成自己的任务,通过线程之间的配合,最终实现我们想要的功能。

线程之间共享进程的数据,线程更加轻量,方便。所以我们默认不会启动子进程的方式去做配合。

如果我们开发过 DOS 系统,就知道它的流程是一个大循环,然后如果说这时候我们有按键发生,我们是需要执行到获取按键事件的地方,才能真正获取按键信息。

但是如果我们是多线程的系统,当我们按键发生的时候,这时候会直接进入中断处理函数,将按键信息获取,同时还能更快的让程序响应。

下面这个图可以简单的看下,进程和线程的关系。

在这里插入图片描述
我们的学习技巧,一直是遵循提供引子,细节化的东西,看相关的书籍,然后有任何疑问,提问这边答疑。

知识的掌握,一定是有主观性的。当我们理解不了的时候,可以来语音解惑,帮助大家打通串联起来,能够快速的厘清线索。

在操作系统的这个体系里面,核心掌握的是什么?

进程管理
进程间通信机制
内存管理
文件系统
CPU 调度切换机制
网络
驱动开发
当我们在看到这些内容的时候,为什么需要这个?它在解决什么问题。以及依据我们之前讲的,每个模块都是由几部分组成的。

数据结构,算法。

具体到进程管理就是:如何描述一个进程,操作系统如何对进程管理的,如何切换的。
这两部分就是,设计和实现。

每个模块都可以这样子去思考。同时每个模块都可以用示例来进行初步体验,理解。进程管理,深入到操作系统里面,我们该如何学习?

如果上来就是 Linux 系统,大家一定学的吃力,又担心学不会。所以这里我们会先给大家推荐的是,小型操作系统。

比如 ucos2,比如 freertos,小型操作系统,掌握了之后,我们学习什么是启动代码,uBoot,以及复杂的嵌入式操作系统 ucLinux。

这些掌握了,进入安卓就非常容易。

中断
中断的理解很简单,比如一个老师在讲课,突然校长喊话让去下办公室,这时候老师就要中断讲课,去处理事情。处理完后回来要继续接着讲。

这里就是中断。

在程序世界里面,就是当我们程序正在运行的时候,突然有外部消息进来,系统要去处理,这时候当前的进程就需要中断,等待中断事情处理完,再继续运行。

这里面因为 CPU 内部的寄存器只有一份,于是当我们进程被打断的时候,为了等会回来从正确的位置运行,所以需要保存这些寄存器。

这个就是由操作系统实现,叫做现场保护。

而大家一直不明白的是,中断是在什么时间监测的?

这里来说一下,CPU 执行的是一条一条指令,在每条指令执行完后,CPU 都会检测是否有外部中断发生,如果有就会切换,保存线程,进入对应的中断函数。

这里把所有的中断跳转函数,系统称之为中断向量表,而每个中断信号上来,都有一个中断号,依据这个会跳转到对应的中断函数上去。

当我们知道了,中断是在每一条指令完成后会发生,那么我们就能知道,一条指令在执行过程中不会被打断。

于是,我们在开发多线程项目的时候,对于全局变量如果要多个线程操作的时候,要做一个加锁操作。

也就是线程间的同步处理。

为什么要加锁,核心逻辑就是,对于全局多个线程要去访问的数据,一条指令执行不完,在这个访问的过程中,不能中断,于是需要加锁进行保护。

只有理解到,加锁是为了全局变量在操作的时候不被中断,理解了中断发生在一条指令完成后,这时候我们就能知道,如果我们设计一条指令,这条指令就是做一个变量检测,用于加锁操作,就是没问题的。

在这里说下,大家学习进程线程开发,一般建议大家使用 ubuntu Linux 桌面,然后使用默认的 GCC 编译器,同时在学习的时候可以多了解下 MakeFile 的编写,以及编译的整个过程。

编译整个过程,这块后面我们会再讲,如果感兴趣,直接找我就好了。我们简单聊下这块该如何开展。

对于互斥信号量,管道,socket 通信,以及消息传输,大家可以参考《Unix 系统编程》,来进行掌握。

一切皆文件的逻辑
在 Linux 里面,将一切的事物都当成文件来理解,那么这个具体指的什么呢?为什么可以当成文件。
这里其实我们从一个朴素的逻辑来讲。

对于每一个外设,或者是驱动,或者是一套 SDK。我们常规的动作就几个:

1 找到它
2 使用它

所以统一的都可以归类了。
默认情况下,找到它就是 open ,默认的使用它,就是 write,如果发现使用它的业务很多,系统做了一个 ioctl 来完善补充。

在这里插入图片描述
所以,我们的外设,驱动,都可以通过这些方法来进行操作。而这些方法常规上我们理解是打开文件,写入数据,操作数据的。

所以,就有一切都是文件的概念了。

而这里面,我们再说个更加普遍的概念,我们拿到一堆数据,必须有对应的解析格式,否则这堆数据具体的含义我们是不知道的。

举例,电报的加密数据,如果说我们没有对应的解密字典,这个加密数据就不晓得什么意思。

还有不加密的,摩斯密码,这个也是约定好的,俗称查字典。

所以,一切皆是文件。可以说是,一切都是数据和解析组成,这两个我们对应的就是 Linux中文件的通用接口,和对应的接口实现方法(解析)。

Android 操作系统

在我们的《Android 深入系统完全讲解》第一册里面,有一张图,完整的画出来了安卓操作系统的概况。

在这里插入图片描述

这里怎么来学习,一个是掌握启动流程,init 进程初始化过程,以及系统服务启动过程,这
些在我们的第一册里面做了详解。
那么,我们这里补充一些知识。就是 ps 命令里面,我们查找进程之间的关系链,用的是 ps
查看。
root 1433 1 54936 4696 ffffffff b7f1e875 S /system/bin/surfaceflinger
第三个值 1 就是父类进程,是由谁创建的。
通过开机后,adb shell 命令使用这个 ps 命令,查看进程 id 和父进程 pid,通过这个可以快速的梳理出来,进程的关系网。

能够让我们对系统有了一个完整的理解。

同时再一个就是查看每个进程的 maps 信息,从这个里面可以看到每个进程的内存映射,通过这个,可以获取的就是进程中存在的一些 jar,so 库。对于我们理解调用系统库,方法的时候,有很大的帮助。

像深入下去的 Hook,还有注入编程这些,大家可以关注,这类使用场景比较特殊,但是像patch 这种功能,其实市场需求很大,于是我们可以研究下它的实现原理。
在这里给出一个引子,就是 odex 的加载器。

我们实际运行的时候,就是 odex 里面找到对应的函数,去执行。那么如果说我们自己设计一个机制,在调用之前,我们判断一下,是不是我们要篡改的函数。

如果是,那么改掉它,替换成我们的函数,是不是就等于是动态的 patch 修复了?
这块知识点,后续我们从进程的格式开始讲起,把安卓里面的这些注入技巧,串一遍。

在学习操作系统的时候,一定记得要去看计算机组成原理,这个是硬性要求。大家在不懂得地方,及时找我沟通,了解。

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

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

相关文章

【k8s-device plugin】如何编写 k8s device plugin

参考 Device Plugin 入门笔记(一) Device Plugin 入门笔记(二) 从零开始入门 K8s:GPU 管理和 Device Plugin 工作机制 Kubernetes开发知识–device-plugin的实现 https://github.com/oceanweave/cola-device-plugi…

基于springboot的智慧物业管理系统的设计与实现(前后端分离)

项目描述 临近学期结束,还是毕业设计,你还在做java程序网络编程,期末作业,老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下,你想解决的问…

mysql 中间件 mycat2 的详细安装及配置步骤

下载 首先打开mycat官网:MyCat2 右上角下载里面有个文件下载服务,点进去发现无法访问 这里需要配置一下host,把下面内容复制到host文件中。host文件位置在C:\Windows\System32\drivers\etc 210.51.26.184 mycat.org.cn www.mycat.org.cn …

第五篇 - 数组的劫持

一,前言 上篇,主要介绍了 Vue 数据初始化流程中,对象属性的深层劫持是如何实现的 核心思路就是递归,主要流程如下; 1.通过 data isFunction(data) ? data.call(vm) : data;处理后的 data 一定是对象类型 2.通过 d…

如何定位Bug——Qt

1. 前言 在写程序的过程中,不可避免出现各种Bug,如何快速的定位到Bug的位置,是程序员必备的技能之一。 2. 几种方法 2.1. 逻辑分析 根据程序所出的问题,分析问题可能所在的几个位置,通过逻辑分析找出Bug&…

从 Nginx Ingress 窥探云原生网关选型

作者: 魁予 现今有越来越多的企业开始采纳云原生理念进行应用架构转型。而 K8s 和微服务是云原生的两大支柱,随着云原生浪潮而被广泛应用。 对多数应用而言,提供对外服务的使命并不会改变,相比于原来的单体应用,微服…

VUE3中,使用.env.development和.env.production

在实际项目开发过程中,可能开发环境和生产(测试)环境不一样,经常需要修改配置常量,才能满足对应的环境,才能使软件运行起来。在vue3中可以使用2个文件进行区分。 .env.development:开发环境 .…

Mysql存储引擎 初级(自用笔记)

内容来自于(https://www.bilibili.com/video/BV1Kr4y1i7ru?p58&vd_source3cf72bb393b8cc11b96c6d4bfbcbd890) 1.存储引擎 1.1Mysql体系结构 1.2什么是存储引擎呢? 存储引擎就是存储数据,建立索引,更新,查询数据等技术的实现方式. 存储引擎是基于表的,而不是基于数据库的…

魔兽世界开服教程wow服务器框架Trinirycore构建

首先明杰先给各位普及一下TrinityCore是什么TrinityCore 是c实现MMORPG框架来自MaNGOS,大型网络对象服务,随着时间的推移,该项目代码广泛的优化,改善和清理代码。需要准备的架设工具:端(版本)、…

皮尔逊相关性分析一文详解+python实例代码

目录 前言 一、数值类型 二、皮尔逊系数使用场景 二、皮尔逊相关系数(Pearson correlation) 1.定义 2.线性关系判定 3.正态检验 1.KS检验 4.计算代码 点关注,防走丢,如有纰漏之处,请留言指教,非常感谢 参阅 前言 相关性…

MySQL中这10个小玩意,让人眼前一亮

我最近几年用MYSQL数据库挺多的,发现了一些非常有用的小玩意,今天拿出来分享到大家,希望对你会有所帮助。 1.group_concat 在我们平常的工作中,使用group by进行分组的场景,是非常多的。 比如想统计出用户表中&…

给Kylin iso中添加自定义rpm包

前言 在日常产品交付中会有如下需求: 客户自己安装centos / ubuntu / kylin iso,然后我们把rpm包给到客户 我们直接将rpm包封装到iso,给客户交付整体iso,这样不管是对于客户还是对于公司都是最省心的,会避免很多因为系…

疯狂2023:科技迎来爆发之年,关注云计算这些方向

临近年末,熬过艰难苦恨繁霜鬓的2022,打工人已默默扛起来年的OKR 。根据市场研究机构Garner预测,2023将迎来科技爆发之年,最值得关注的云计算趋势是AI和ML、多云和混合云解决方案、物联网、云安全等。 及时了解不断变化的技术格局…

汇聚数据库创新力量 GBASE携手openGauss助企业数字化转型

12月29日,openGauss Summit 2022于线上举行。本次大会是由openGauss开源数据库社区联合行业组织、伙伴及客户共同举办的一场年度数据库产业界交流与分享峰会。天津南大通用数据技术股份有限公司(简称:GBASE)首次以openGauss社区理…

PDF转换成JPG图片怎么转换?这两招轻松搞定

PDF转换成JPG图片怎么转换?PDF文件是我们常用的一类文件,在现在的办公环境中,PDF真的用途很广,不仅是日常发送文件,还有学习工作中都会用到,不过有时候我们也需要将PDF文件转换成其他的格式,比如…

JUC并发编程学习笔记(五)读写锁和阻塞队列

8 读写锁 8.1 悲观锁和乐观锁介绍 回顾悲观锁和乐观锁的概念 悲观锁:单独每个人完成事情的时候,执行上锁解锁。解决并发中的问题,不支持并发操作,只能一个一个操作,效率低 顾名思义,就是比较悲观的锁&am…

配置文件中命名空间的作用

命名空间 实际上就是一个由程序设计者命名的内存区域,程序设计者可以根据需要指定一些有名字的空间域,把一些全局实体分别放在各个命名空间中,从而与其他全局实体分隔开来。 命名空间的作用 是建立一些互相分隔的作用域,把一些…

11_3、Java集合之迭代器Iterator接口

一、引入Iterator对象称为迭代器(设计模式的一种),主要用于遍历 Collection 集合中的元素。 GOF给迭代器模式的定义为:提供一种方法访问一个容器(container)对象中各个元 素,而又不需暴露该对象的内部细节。迭代器模式,就是为容器…

华脉智联铁路巡检及指挥调度系统

技术方案 整套系统基于云通讯平台和智能终端的结合,实现指挥中心和现场人员的实时互动,同时保证现场取证材料的实时上报以及指挥中心实时将决策及命令下发到现场人员。提高巡检效率及巡检准确性。 方案拓扑如下: 在指挥中心通信机房部署指挥…

k8s集群监控cadvisor+prometheus+grafana部署

目录 1.新建命名空间monitor 2.部署 2.1部署cadvisor 2.2部署node_exporter 2.3部署prometheus资源 2.4部署rbac权限 2.5.部署 metrics 2.6部署grafana 3.测试效果 参考文章: k8s集群部署cadvisornode-exporterprometheusgrafana监控系统 - cyh00001 - 博客园 …