- 博客(235)
- 资源 (9)
- 收藏
- 关注

原创 欢迎Fork我们的开源云手机项目--OPENVMI(Virtual Mobile Infrastructure)(VMI)
基于ARM+Linux体系构建的VMI(Virtual Mobile Infrastructure)云平台
2020-09-20 17:04:26
16889
59
原创 Android系统中的原理分析 - Android系统内event事件和inotify、I/O多路复用的关系
inotify 是 Linux 内核提供的一种文件系统事件监控机制,用于监控文件或目录的变化(如创建、删除、修改、移动、权限变更等)。它通过内核态与用户态的交互,让应用程序能实时感知文件系统的变动,常见的系统调用包括等。例如,当某个文件被修改时,inotify 可以触发一个事件通知,告知监控者该文件的变化。Android 中的绝大多数事件(如用户交互、系统广播、硬件事件等)与 inotify 无关,由 Android 自身的事件机制(如输入系统、Binder 通信、系统服务)独立处理。仅。
2025-07-21 13:17:06
933
原创 Android系统的问题分析笔记 - Android上的调试方式 bugreport
bugreport是Android生态中连接用户、开发者和系统工程师的“桥梁”。掌握其生成和分析方法,能大幅提升问题排查效率——对开发者而言,它是修复Bug的“线索库”;对用户而言,它是反馈问题的“证据链”。
2025-07-14 22:23:47
916
原创 Android系统的问题分析笔记 - Android上的调试方式 debuggerd
是 Android 系统中的一个重要调试工具,主要用于生成进程崩溃时的核心转储(core dump)和调试信息(如堆栈跟踪)。如果需要进一步分析崩溃,建议结合源码和编译生成的符号文件(生成 tombstone 文件,保存在。当进程崩溃时,系统会自动调用。或带调试信息的二进制)。用于远程 GDB 调试。
2025-07-14 17:59:13
505
转载 Linux操作系统中的SOCKET相关 -6- I/O多路复用、信号驱动I/O、epoll
大部分程序使用的 I/O 模型都是单个进程每次只在一个文件描述符上执行 I/O 操作,每次 I/O 系统调用都会阻塞直到完成数据传输。比如,当从一个管道中读取数据时,如果管道中恰好没有数据,那么通常 read()会阻塞。而如果管道中没有足够的空间保存待写入的数据时,write()也会阻塞。当在其他类型的文件如 FIFO 和套接字上执行 I/O 操作时,也会出现相似的行为。对于许多应用来说,传统的阻塞式 I/O 模型已经足够了,但这不代表所有的应用都能得到满足。特别的,有些应用需要处理以下某项任务,或者两者都
2025-07-07 11:48:43
43
原创 如何在x86_64 Linux上部署Android Cuttlefish模拟器运行环境
配置科学的网络(你懂我意思),然后因为我的bazel版本是8.3,需要再配置文件~/.bazelrc。最好在编译前执行一下(此命令会对bazel进行一些必要的配置)安装android依赖的软件包。下载cuttlefish源码。如果编译过程中提示下面的错误。
2025-06-26 21:54:06
1077
转载 Linux系统 -文件加锁
应用程序的一个常见需求是从一个文件中读取一些数据,修改这些数据,然后将这些数据写回文件。只要在一个时刻只有一个进程以这种方式使用文件就不会存在问题,但当多个进程同时更新一个文件时问题就出现了。假设各个进程按照下面的顺序来更新一个包含了一个序号的文件。从文件中读取序号。使用这个序号完成应用程序定义的任务。递增这个序号并将其写回文件。这里存在的问题是两个进程在没有采用任何同步技术的情况下可能会同时执行上面的步骤,从而导致(举例)出现图中给出的结果(这里假设序号的初始值为 1000)。
2025-06-17 14:06:08
66
转载 Linux系统 - 信号 -2- 信号处理器函数
所以,如果在信号处理器函数中调用了 printf(),而主程序又在调用 printf()或其他 stdio 函数期间遭到了处理器函数的中断,那么有时就会看到奇怪的输出,甚至导致程序崩溃或者数据的损坏。内核 2.6.24 之前,poll()也曾存在这种行为,2.6.22 之前的 sem_wait()、sem_timedwait()、futex(FUTEX_WAIT),2.6.9 之前的 msgrcv()和 msgsnd(),以及 Linux 2.4 及其之前的 nanosleep()也同样如此。
2025-06-13 16:14:02
51
转载 Linux系统 - 信号 -1- 基础
信号是事件发生时对进程的通知机制。有时也称之为软件中断。信号与硬件中断的相似之处在于打断了程序执行的正常流程,大多数情况下,无法预测信号到达的精确时间。一个(具有合适权限的)进程能够向另一进程发送信号。信号的这一用法可作为一种同步技术,甚至是进程间通信(IPC)的原始形式。进程也可以向自身发送信号。然而,发往进程的诸多信号,通常都是源于内核。引发内核为进程产生信号的各类事件如下。硬件发生异常,即硬件检测到一个错误条件并通知内核,随即再由内核发送相应信号给相关进程。
2025-06-12 11:41:16
71
转载 Linux系统 - 进程 -10- 编写安全的特权程序
特权程序能够访问普通用户无法访问的特性和资源(文件设备等)。一个程序可以通过下面两种方式以特权方式运行。y 程序在一个特权用户 ID 下启动,很多 daemon 和网络服务器通常以 root 身份运行,它们就属于这种类别。y 程序设置了 set-user-ID 或 set-group-ID 权限位。当一个 set-user-ID(set-group-ID)程序被执行之后,它会将进程的有效用户(组)ID 修改为与程序文件的所有者(组)一样的 ID。
2025-06-10 16:57:21
25
转载 Linux系统 - 进程 -9- DAEMON
daemon 是一种具备下列特征的进程。它的生命周期很长。通常,一个 daemon 会在系统启动的时候被创建并一直运行直至系统被关闭。它在后台运行并且不拥有控制终端。控制终端的缺失确保了内核永远不会为 daemon自动生成任何任务控制信号以及终端相关的信号(如 SIGINT、SIGTSTP 和 SIGHUP)。daemon 是用来执行特殊任务的,如下面的示例所示。cron:一个在规定时间执行命令的 daemon。
2025-06-10 16:37:21
47
转载 Linux系统 - 进程 -7- 进程优先级和调度
在一个系统上一般会同时运行交互式进程和后台进程,标准的内核调度算法一般能够为这些进程提供足够的性能和响应度。但实时应用对调度器有更加严格的要求,如下所示。实时应用必须要为外部输入提供担保最大响应时间。在很多情况下,这些担保最大响应时间必须非常短(如低于秒级)。如交通导航系统的慢速响应可能会是一个灾难。为了满足这种要求,内核必须要提供工具让高优先级进程能快速地取得 CPU 的控制权,抢占当前运行的所有进程。高优先级进程应该能够保持互斥地访问 CPU 直至它完成或自动释放 CPU。
2025-06-10 13:58:28
59
转载 Linux系统 - 线程 -5- 更多细节
创建线程时,每个线程都有一个属于自己的线程栈,且大小固定。。(在一些 64 位架构下,默认尺寸要大一些,例如,IA-64 有 32MB。。偶尔,也需要改变线程栈的大小。在通过线程属性对象创建线程时,调用函数 pthread_attr_setstacksize() 所设置的线程属性决定了线程栈的大小。而使用与之相关的另一函数 pthread_attr_setstack(),可以同时控制线程栈的大小和位置,不过设置栈的地址将降低程序的可移植性。
2025-06-09 15:19:41
33
转载 Linux系统 - 线程 -4- 线程取消
SUSv3 规定,实现若提供了下表中所列的函数,则这些函数必须是取消点。其中的大部分函数都有能力将线程无限期地堵塞起来。除表所列函数之外,SUSv3 还指定了大量函数,系统实现可以将其定义为取消点。其中包括 stdio 函数、dlopen API、syslog API、nftw()、popen()、semop()、unlink(),以及从诸如 utmp 之类的系统文件中获取信息的各种函数。
2025-06-08 21:28:59
52
转载 Linux系统 - 线程 -3- 线程安全和每线程存储
要使用线程特有数据,库函数执行的一般步骤如下。函数创建一个键(key),用以将不同函数使用的线程特有数据项区分开来。调用函数pthread_key_create()可创建此“键”,且只需在首个调用该函数的线程中创建一次,函数pthread_once()的使用正是出于这一目的。键在创建时并未分配任何线程特有数据块。调用 pthread_key_create()还有另一个目的,即允许调用者指定一个自定义解构函数,用于释放为该键所分配的各个存储块(参见下一步)。
2025-06-07 20:59:59
40
原创 Linux系统 - 线程 -6- 线程安全函数和可重入函数
线程安全函数是指在多线程环境中可以被多个线程同时调用而不会导致数据竞争或其他并发问题的函数。
2025-06-07 14:52:28
326
转载 Linux系统 - 线程 -2- 线程同步
线程用来同步彼此行为的两个工具:互斥量可以帮助线程同步对共享资源的使用,以防如下情况发生:线程甲试图访问一共享变量时,线程乙正在对其进行修改。条件变量则是在此之外的辅助补充,允许线程相互通知共享变量(或其他共享资源)的状态发生了变化。线程的主要优势在于,能够通过全局变量来共享信息。不过,这种便捷的共享是有代价的:必须确保多个线程不会同时修改同一变量,或者某一线程不会读取正由其他线程修改的变量。术语临界区(critical section)是指访问某一共享资源的代码片段,并且这段代码的执行应为原子(atomi
2025-06-06 22:00:00
29
转载 Linux系统 - 线程 -1- 线程基础
(因为左值可以修改,多线程程序依然能以 errno=value 的方式对 errno 赋值。)一言以蔽之,errno 机制在保留传统 UNIX API 报错方式的同时,也适应了多线程环境。
2025-06-05 20:30:00
30
转载 Linux系统 - 进程 -6- 进程创建和程序执行的细节问题
打开进程记账功能后,。这条账单记录包含了内核为该进程所维护的多种信息,包括终止状态以及进程消耗的CPU 时间。具体使用时再研究…
2025-06-04 22:12:39
25
转载 Linux系统 - 进程 -5- 程序的执行
调用 execve()之后,因为同一进程依然存在,所以进程 ID 仍保持不变。尤其是在特权进程中调用 exec()来启动一个未知程序时(并非自己编写),亦或是启动程序并不需要使用这些已打开的文件描述符时,从安全编程的角度出发,应当在加载新程序之前确保关闭那些不必要的文件描述符。无论是否更改了有效 ID,也不管这一变化是否生效,execve()都会以进程的有效用户 ID 去覆盖已保存的(saved)set-user-ID,以进程的有效组 ID 去覆盖已保存的(saved)set-group-ID。
2025-06-04 22:12:03
29
转载 Linux系统 - 进程 -3- 进程的终止
通常,进程有两种终止方式。其一为异常(abnormal)终止,如由对一信号的接收而引发,该信号的默认动作为终止当前进程,可能产生核心转储(core dump)。此外,进程可使用_exit()系统调用正常(normally)终止。_exit()的 status 参数定义了进程的终止状态(termination status),父进程可调用 wait()以获取该状态。虽然将其定义为 int 类型,但仅有低 8 位可为父进程所用。按照惯例,终止状态为 0 表示进程“功成身退”,而非 0 值则表示进程因异常而退出
2025-06-04 22:10:43
20
转载 Linux系统 - 进程 -2- 进程的创建
fork()、exit()、wait()以及 execve()这几个系统调用都各有变体。先对这 4 个系统调用及其典型用法简单加以介绍。下图对 fork()、exit()、wait()以及 exece()之间的相互协同作了总结。图中对 execve()的调用并非必须。有时,让子进程继续执行与父进程相同的程序反而会有妙用。最终,两种情况殊途同归:总是要通过调用 exit()(或接收一个信号)来终止子进程,而父进程可调用 wait()来获取其终止状态。同样,对 wait()的调用也属于可选项。
2025-06-04 21:30:00
23
转载 Linux系统 - 文件I/O - 缓冲
下图概括了 stdio 函数库和内核所采用的缓冲(针对输出文件),以及对各种缓冲类型的控制机制。从图中自上而下,首先是通过 stdio 库将用户数据传递到 stdio 缓冲区,该缓冲区位于用户态内存区。当缓冲区填满时,stdio 库会调用 write()系统调用,将数据传递到内核高速缓冲区(位于内核态内存区)。最终,内核发起磁盘操作,将数据传递到磁盘。图左侧所示为可于任何时刻显式强制刷新各类缓冲区的调用。
2025-05-29 16:10:30
55
转载 Linux系统 - 文件I/O - 深入的问题
在探究系统调用时会反复涉及原子操作的概念。所有系统调用都是以原子操作方式执行的。之所以这么说,是指内核保证了某系统调用中的所有步骤会作为独立操作而一次性加以执行,其间不会为其他进程或线程所中断。原子性是某些操作得以圆满成功的关键所在。特别是它规避了竞争状态。竞争状态是这样一种情形:操作共享资源的两个进程(或线程),其结果取决于一个无法预期的顺序,即这些进程1获得 CPU 使用权的先后相对顺序。将讨论涉及文件 I/O 的两种竞争状态,并展示了如何使用 open()的标志位,来保证相关文件操作的原子性,从而
2025-05-28 21:22:03
38
转载 Linux系统 - 文件I/O - 通用I/O模型
所有执行 I/O 操作的系统调用都以文件描述符,一个非负整数(通常是小整数),来指代打开的文件。文件描述符用以表示所有类型的已打开文件,包括管道(pipe)、FIFO、socket、终端、设备和普通文件。针对每个进程,文件描述符都自成一套。按照惯例,大多数程序都期望能够使用 3 种标准的文件描述符。在程序开始运行之前,shell 代表程序打开这 3 个文件描述符。更确切地说,程序继承了 shell 文件描述符的副本——在 shell 的日常操作中,这 3 个文件描述符始终是打开的。
2025-05-28 08:19:14
57
原创 Linux系统 - 系统编程概念
系统调用是,借助于这一机制,进程可以请求内核以自己的名义去执行某些动作。以应用程序编程接口(API)的形式,内核提供有一系列服务供程序访问。这包括创建新进程、执行 I/O,以及为进程间通信创建管道等。。为说明这点,下面以一个具体的硬件平台—x86-32 为例,按事件发生的顺序对这些步骤加以分析。外壳(wrapper)函数下图以系统调用 execve()为例,展示了上文述及事件的发生序列。在 Linux/x86-32 上,execve()的系统调用号为 11(__NR_execve)。
2025-05-27 21:00:00
749
原创 Android系统的JNI原理分析 - CallNonvirtualXXXMethod和CallXXXMethod的区别
是JNI中调用Java方法的标准方式,遵循Java的多态规则。:是一种特殊的调用方式,用于显式调用指定类中的方法,常用于需要精确控制方法调用行为的场景。
2025-05-20 11:06:20
44
原创 Linux中安装samba服务
通过以上步骤,你就可以在Linux服务器上成功安装和配置Samba服务,实现文件共享功能。为了访问Samba共享,需要创建一个Samba用户。安装完成后,需要对Samba进行配置。Samba的主配置文件是。首先,创建一个用于共享的目录,例如。
2025-05-15 16:00:59
418
原创 Linux操作系统中的SOCKET相关 -5- Socket字节序调整与网络传输
因为不同主机可能使用不同的字节序(大端序 Big-Endian 或小端序 Little-Endian),而网络协议标准规定使用**大端序(Network Byte Order)**作为统一格式。文本协议本身是字节流,无需处理字节序。字节序不影响单字节数据。
2025-05-13 21:30:00
410
转载 Linux操作系统中的SOCKET相关 -3- Internet Domain
计算机以二进制形式来表示 IP 地址和端口号,但人们发现名字比数字更容易记忆。使用符号名还能有效地利用间接关系,用户和程序可以继续使用同一个名字,即使底层的数字值发生了变化也不会受到影响。主机名和连接在网络上的一个系统(可能拥有多个 IP 地址)的符号标识符。服务名是端口号的符号表示。主机地址和端口的表示有下列两种方法。主机地址可以表示为一个二进制值或一个符号主机名或展现格式(IPv4 是点分十进制,IPv6 是十六进制字符串)。端口号可以表示为一个二进制值或一个符号服务名。
2025-05-13 21:00:00
98
原创 Linux/AndroidOS中进程间的通信&线程间的同步 -9- 终端/伪终端
在 Linux 系统中,**终端(Terminal)伪终端(Pseudo Terminal,PTY)**是用户与系统交互的重要组件,但它们的概念和实现方式有所不同。
2025-05-13 10:57:38
414
转载 Linux操作系统中的SOCKET相关 -2- UNIX DOMAIN
这可以通过使用两个 socket()调用和一个 bind()调用以及对 listen()、connect()、accept()(用于流 socket)的调用或对 connect()(用于数据报 socket)的调用来完成。为将一个 UNIX domain socket 绑定到一个地址上,需要初始化一个 sockaddr_un 结构,然后将指向这个结构的一个(转换)指针作为 addr 参数传入 bind()并将 addrlen 指定为这个结构的大小,如程序清单 57-1 所示。这种做法具备几点优势。
2025-05-12 22:00:00
92
转载 Linux操作系统中的SOCKET相关 -1- 基础
在一个典型的客户端/服务器场景中,应用程序使用 socket 进行通信的方式如下。各个应用程序创建一个 socket。socket 是一个允许通信的“设备”,两个应用程序都需要用到它。服务器将自己的 socket 绑定到一个众所周知的地址(名称)上使得客户端能够定位到它的位置。使用 socket()系统调用能够创建一个 socket,它返回一个用来在后续系统调用中引用该socket 的文件描述符。在后续将会对 socket domain 和类型进行介绍。
2025-05-12 10:25:37
106
本人编译的iconv.so 与其头文件
2017-09-18
我的博客中《关于如何在Android源码目录中建立自己的C工程,并用mm命令单独进行该C工程模块的编译,以及Android.mk的使用介绍(2)》源码包
2017-09-24
ffmpeg_x264.tar.gz
2020-03-17
Z-Stack_Home_1.2.2a.part1.rar
2017-09-18
Z-Stack_Home_1.2.2a.part3.rar
2017-09-18
Z-Stack_Home_1.2.2a.part2.rar
2017-09-18
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人