[笔记分享] [Android] Android的Linux内核与驱动

时间:2024-03-21 12:30:24

3.1 Android的Linux和标准Linux区别
Android和标准Linux2.6相同,只是多增加了内容,有两种:Android专用驱动和Android使用的设备驱动。还增加了些内容,如yaffs文件系统。

3.2 Android专用驱动
这些驱动一般不操作实际硬件,只是辅助系统运行,包括:
1. Ashmen:匿名共享内存驱动。
2. Logger:轻量级Log驱动。
3. Binder:基于OpenBinder系统驱动,为Android平台提供IPC支持。
4. PM: 电源管理模块。
5. Low Memory Kill: 缺少内存时,杀死进程。
6. Android PMEM: 物理内存驱动

a)Ashmem
通过这种内核机制,可为用户空间程序提供内存分配机制。实现类似于malloc()功能。

b)Binder
Binder的驱动程序为用户层程序提供IPC支持,整个系统依赖于它。它是Android主要使用的IPC方式,通常只要按照模板定义相关类即可,不用直接调用驱动。

c)Logger
该驱动为用户层提供log支持,作为一个工具使用。

3.3 Android使用的设备驱动
a)Framebuffer
标准显示设备驱动。每个系统可以有多个显示设备,对应也可以有多个framebuffer。在用户空间大多使用ioctl、mmap等接口来操作。也可以直接write操作,直接输出显示内容。架构如下:
[笔记分享] [Android] Android的Linux内核与驱动

驱动中关键数据结构如下:
[笔记分享] [Android] Android的Linux内核与驱动

通常通过以下函数注册:

[笔记分享] [Android] Android的Linux内核与驱动

在注册之前,先要初始化fb_info信息,包括fb_ops。当上层用ioctl时,会调用fb_ops中的函数。

Android中的fb路径稍有不同,如下所示:
/dev/graphic/fb0
该节点由init进程创建,被libui库调用。

b)Event输入设备驱动
分成游戏杆、鼠标和事件设备三种驱动。其中事件驱动式通用驱动程序,包括键盘、鼠标、触摸屏等输入设备。
用户空间通过read、ioctl、poll等接口操作。Read读取输入信息,ioctl获得和配置信息、poll可以阻塞,当按键等中断来时,唤醒poll,这样Poll就可返回了。架构如下:
[笔记分享] [Android] Android的Linux内核与驱动

驱动中关键输入结构如下:
[笔记分享] [Android] Android的Linux内核与驱动

注册函数如下:

[笔记分享] [Android] Android的Linux内核与驱动

该节点由init进程创建,被libui库调用。

除了上述驱动之外,还有视频驱动、音频驱动、MTD驱动、蓝牙驱动和wifi驱动。这里就不一一介绍了。