Linux线程池
前言基本上每一种编程语言都会支持多线程,这里我们只讲C/C++,C/C++是真正的native language。
现代操作系统都是支持多线程的,不管是单核还是多核,多线程的编程,也可以非常有效的利用CPU的执行来解决很多复杂的问题,并且在多核的情况下更好的让多核CPU核心共同协调工作。
Posix Threads(pthread): 对不同platform的支持很好,你可以非常稳定可靠的使用,如果想让你的代码可移植性非常强的话,使用pthread是毫无疑问的
std::thread: 是从C++11中引入,在不同的平台上表现各异,比如在一些Android和Win64平台下不支持,或者有性能瓶颈,当然了如果你的代码只是考虑到Linux/gcc平台编译器的话,是个不错的选择,特别是对C++11的类非常友好
boost::thread: 对std::thread是个非常好的替代品,而且API也非常相似,但是boost::thread是一个第三方库,一般都需要移植到你正在使用的平台
但是总的来说还是要以发展的眼光看待std::thread,毕竟C++的所谓现代化API也一直在更新发展 ...
Android智能指针
Android的核心库基本都是由C++代码编写的,这也证明了C++代码的潜力,面向对象的可扩展性很强,而且不失性能的流失,确实是大型项目的首选编程语言。
那么引入“智能”指针的目的是为了解决C++语言中经常性会发生的内存泄漏的问题,因为使用C/C++语言很多地方需要手动去分配内存,在C++语言中指针的使用使得很多时候会在不恰当的时候去释放内存,或者说忘记释放内存,导致内存泄漏,那么这里引入了智能指针可以比较有效的防止类似事情大量的发生,我这里只是保守的说防止大量发生,这是因为即使有了很好的工具,不正确的使用,也是无法防止错误的发生。
其实原理很简单,就是使用强指针(sp)、弱指针(wp)来代替普通的指针,这种指针基于引用计数,来智能的管理对象指针,并不需要开发者做过多的内存管理操作。
1234567891011121314151617181920class Student: public RefBase {public: Student(const char* name) { LOG(INFO) << "Create & ...
dma-buf深入浅出--(1)简介
前言由于最近在开发新平台和新的Android 11的移植工作,需要把以前的一些驱动和方案移植到最新的Android OS上,有遇到一些Android OS间的差异,导致了有一些代码的调整,我这里就遇到了ION接口的改动导致需要做一些代码的调整,具体ION的接口差异可以查看下面的文章:
https://zhangjie201412.github.io/2021/02/16/Android-ION-3-DMA-BUF/
以前对dma-buf有一些认知,既然这还是比较新的一个知识点,那么我们就来系统的学习一下,以便于后面遇到了可以很方便的读懂代码。
dma-buf在Linux驱动中出现最多的就是在多媒体模块方面了,如果你接触过Android的Video、Camera、Display还是GPU,他们使用的buffer都是通过ION分配的,而现在Android的kernel中的ION的实现都是基于dma-buf。
历史dma-buf 最初的原型为 shrbuf,由 Marek Szyprowski (Samsung)于2011年8月2日首次提出,他实现了 “Buffer Sharing” 的 ...
Android ION内存管理(3) -- dma-buf
前面讲了如何在内核空间以及用户空间利用ion的接口分配内存、共享内存、同步内存数据,但是最近在浏览最新的AOSP的系统变更的时候发现接口都发生了改变:
https://source.android.com/devices/architecture/kernel/ion_abi_changes
意思就是在kernel 4.14版本和之后ION的接口有一个重大的重构,使得在使用kernel 4.14和之后的版本之后的一些代码都需要注意很多地方需要修改。特别是Display,Camera,DRM等模块的kernel驱动和硬件抽象层的代码。
下面来看看有哪些改动的地方。
其实在kernel 4.12已经开始重构ion的内核代码了,清除了一些和Android 框架层强耦合的代码,一些ion的ioctl接口被移除了。
移除ION clients和handles在kernel 4.12之前,通过打开dev/ion获取到ion client,然后通过IOC_ION_ALLOC ioctl 来分配一块新的buffer,到用户空间就是返回一个ion handle,这个handle就代表了一块buf ...
Android Input子系统 -- EventHub
前言前面其实也有提到EventHub的构造函数,里面就是创建epoll实例,然后把一些事件触发的文件描述符加入到epoll里面统一管理。
监控/dev/input/目录的iNotify文件mINotifyFd
接收Kernel驱动事件(/dev/input/eventX)的文件描述符
用来唤醒InputReader线程的管道读文件
EventHub是服务于InputReader线程的,前面在InputRead的构造函数里面有创建EventHub的实例。
InputReader线程InputReader线程主要就是查看threadLoop接口中代码的实现,threadLoop返回值是true代表的是会不断的循环,返回false的话就不会继续在调用threadLoop函数。
1234bool InputReaderThread::threadLoop() { mReader->loopOnce(); return true;}
不停的调用InputReader的loopOnce函数
loopOnce函数InputReader.cpp
12345 ...
Android Input子系统 -- InputManagerService启动
InputManagerService是Android framework中核心service之一,Android framework层涉及的代码也是非常多,
123456789101112131415161718frameworks/native/services/inputflinger/ - InputDispatcher.cpp - InputReader.cpp - InputManager.cpp - EventHub.cpp - InputListener.cppframeworks/native/libs/input/ - InputTransport.cpp - Input.cpp - InputDevice.cpp - Keyboard.cpp - KeyCharacterMap.cpp - IInputFlinger.cppframeworks/base/services/core/ - java/com/android/server/input/InputManagerService.java - jni/com_android_ser ...
Android Input子系统 -- Linux
前言上一节有展示Android Input子系统的架构图,这里我们关心Linux kernel层
可以看到kernel层分为三层:
输入子系统设备驱动:处理与硬件相关的信息,调用input API注册输入设备,并把数据往上报
输入子系统核心层:为事件处理层和设备驱动层提供API接口调用
输入子系统事件处理:通过核心层的API获取输入事件上报的数据,定义input API与应用层交互
数据结构
数据结构
代码位置
描述
struct input_dev
input.h
input设备驱动中的实例
struct evdevstruct mousedevstruct keybdev
evdev.cmousedev.ckeybdev.c
Event Handler层逻辑input设备的数据结构
struct input_handler
input.h
Event Handler的结构,handler层实例化对象
struct input_handle
input.h
用于创建驱动层input_dev和handler链表
123456789101112131415 ...
Android Input子系统开篇
前言Input子系统在整个Android 系统中主要管理一些输入设备:按键、触摸屏鼠标等,他是建立在Linux的input子系统上的一套应用层软件架构,主要是处理用户的一些输入行为,反馈给前台的应用或者系统窗口。
Linux的input子系统的范围要更广,包含sensor等设备。
Input子系统系统框架
从框架上看出来,主要分为三部分
Linux 输入设备驱动:处理硬件的输入事件,通过文件系统发送到用户态程序
Android EventHub:通过监控/dev/input/设备节点,来获取Linux输入事件,转化为Android的KeyCode
Android Input Manager Service:将EventHub转化的Android KeyCode发送到合适的window上
分别对应下面的文章进行阐述。
Android ION内存管理(2) -- 共享内存使用
内存共享和大块内存的使用,在实际场景下面的需求是很多的,这里,举三个简单的应用场景:
用户态和内核态共享内存
用户态不同进程内存共享
内核态中使用ION分配buffer
用户态和内核态共享内存
在Android的BSP代码中有一个ion的library封装了一些对ion驱动设备操作的接口system/core/libion/
123456789101112int ion_open();int ion_close(int fd);int ion_alloc(int fd, size_t len, size_t align, unsigned int heap_mask, unsigned int flags, ion_user_handle_t *handle);int ion_alloc_fd(int fd, size_t len, size_t align, unsigned int heap_mask, unsigned int flags, int *handle_fd);int ion_sync_fd(int fd, i ...
Android ION 内存管理
ION的设计初衷Android为了更好的针对移动设备内存的管理,设计出了ION内存管理机制,主要是为了解决以下几个问题:
预留大块连续内存,比如camera,display,GPU等模块
避免内存随便花
用户控件和硬件之间实现”零拷贝”(zero-copy)的内存共享
做Android系统的,特别是跟Display,camera模块相关的
ION的官方介绍和历史由来查看下面的介绍:
https://lwn.net/Articles/480055/
ION的实现Android系统的ION实现依赖于不同的CPU/GPU硬件,Android提供了ION的框架供CPU厂商(NXP, Qualcomm, MTK, 海思等)在自己的BSP里面实现ION机制。
默认的ION驱动会提供以下三种不同的ION heaps实现:
ION_HEAP_TYPE_SYSTEM: memory allocated via vmalloc_user()
ION_HEAP_TYPE_SYSTEM_CONFIG: memory allocated via kzalloc
ION_HEAP_TYPE_CARVEOUT ...









