我们知道Android是一个开源系统,但是并不彻底,而且Android从多个方面对Linux内核进行了改动与增强,尽管一度和Linux基金会在内核方面闹得不愉快,但是最终也达成了和解。下面将对此进行详细介绍和分析。

1 、Goldfish

Android模拟器通过运行一个Goldfish的虚拟CPU.Goldfish来运行arm926t指令集(arm926t属于armv5构架),并且仿真了输入/输出,比如键盘输入和LCD 输出。这个模拟器其实是在qemu之上开发的,输入/输出是基于libSDL的。既然Goldfish是被模拟器运行的虚拟CPU,那么当Android在真实的硬件设备上运行时,我们就需要去掉它,因此,只有知道Google对Goldfish做了哪些具体改动之后才能正确地去掉。据统计,Android 内核对Goldfish的改动主要涉及44个文件,具体汇总如下。

说明 本书中在被改动的文件前面加了Chg标记,在新增的文件前面加了New标记。

1Chgarch/arm/Makefile添加CONFIG_ARCH_GOLDFISH

2Newarch/arm/configs/goldfish_defconfig默认配置文件

3Newarch/arm/mach-goldfish/Kconfig为Goldfish CPU添加Kernel配置文件

4Newarch/arm/mach-goldfish/Makefile添加board-goldfish.o

5Newarch/arm/mach-goldfish/Makefile.boot为Goldfish CPU进行启动配置

6Newarch/arm/mach-goldfish/audio.c Audio的输入/输出

7Newarch/arm/mach-goldfish/board-goldfish.c中断请求、输入/输出等

8Newarch/arm/mach-goldfish/pdev_bus.c设备总线

9Newarch/arm/mach-goldfish/pm.c电源管理

10Newarch/arm/mach-goldfish/switch.cSwitch控制

11Newarch/arm/mach-goldfish/timer.c获取和设置时间

12Chgarch/arm/mm/Kconfig添加ARCH_GOLDFISH到支持列表

13Chgdrivers/char/Makefile添加goldfish_tty

14Newdrivers/char/goldfish_tty.cTTY驱动

15Chgdrivers/input/keyboard/Kconfig为Goldfish的键盘事件添加配置文件

16Chgdrivers/input/keyboard/Makefile添加goldfish_events事件

17Newdrivers/input/keyboard/goldfish_events.cGoldfish键盘驱动

18Chgdrivers/mmc/host/Kconfig添加Kernel配置选项Goldfish MMC卡

19Chgdrivers/mmc/host/Makefile添加Goldfish MMC卡驱动

20Newdrivers/mmc/host/goldfish.c多媒体驱动

21Chgdrivers/mtd/devices/Kconfig为Goldfish的NAND flash device添加Kernel配置选项

22Chgdrivers/mtd/devices/Makefile添加goldfish_nand

23Newdrivers/mtd/devices/goldfish_nand.cNAND flash驱动

24Newdrivers/mtd/devices/goldfish_nand_reg.hNAND flash驱动

25Chgdrivers/power/Kconfig为Goldfish的battery(电池)驱动添加kernel配置选项

26Chgdrivers/power/Makefile添加Goldfish电池

27Newdrivers/power/goldfish_battery.c能源和电池状态驱动

28Chgdrivers/rtc/Kconfig为Goldfish的rtc(时钟)驱动添加Kernel配置选项

29Chgdrivers/rtc/Makefile添加rtc-goldfish

30Newdrivers/rtc/rtc-goldfish.c实时时钟驱动

31Chgdrivers/video/Kconfig添加Goldfish的framebuffer

32Chgdrivers/video/Makefile添加Goldfish的framebuffer

33Newdrivers/video/goldfishfb.cframebuffer驱动

34Newinclude/asm-arm/arch-goldfish/dma.h

35Newinclude/asm-arm/arch-goldfish/entry-macro.S

36Newinclude/asm-arm/arch-goldfish/hardware.h

37Newinclude/asm-arm/arch-goldfish/io.h

38Newinclude/asm-arm/arch-goldfish/irqs.h

39Newinclude/asm-arm/arch-goldfish/memory.h

40Newinclude/asm-arm/arch-goldfish/system.h

41Newinclude/asm-arm/arch-goldfish/timer.h

42Newinclude/asm-arm/arch-goldfish/timex.h

43Newinclude/asm-arm/arch-goldfish/uncompress.h

44Newinclude/asm-arm/arch-goldfish/vmalloc.h

2 、YAFFS2

不同于PC机(文件是存储在硬盘上的),手机使用FLASH作为存储介质。HTC的G1使用的是NANDFLASH——这种存储目前已经相当普及了,而且种类也颇多(如SLC、MLC等),存储密度也越来越高(已经出现几十GB大小的NANDFLASH),价格也越来越低。

YAFFS2是专门用在FLASH上的文件系统,YAFFS2是“Yet Another Flash File System,2nd edition”的缩写。YAFFS2为Linux内核提供了一个高效访问NANDFLASH的接口。但是NANDFLASH的支持并不包含在标准的2.6.25内核中,所以Google在其中添加了对NANDFLASH的支持。据统计,为了支持YAFFS2,Google一共改动和增加了以下35个文件:

1Chgfs/Kconfig添加YAFFS配置

2Chg fs/Makefile添加YAFFS

以下为新增的YAFFS2:

1Newfs/yaffs2/Kconfig18Newfs/yaffs2/yaffs_mtddif2.h

2Newfs/yaffs2/Makefile19Newfs/yaffs2/yaffs_nand.c

3Newfs/yaffs2/devextras.h20Newfs/yaffs2/yaffs_nand.h

4Newfs/yaffs2/moduleconfig.h21Newfs/yaffs2/yaffs_nandemul2k.h

5Newfs/yaffs2/yaffs_checkptrw.c22Newfs/yaffs2/yaffs_packedtags1.c

6Newfs/yaffs2/yaffs_checkprtw.h23Newfs/yaffs2/yaffs_packedtags1.h

7Newfs/yaffs2/yaffs_ecc.c24Newfs/yaffs2/yaffs_packedtags2.c

8Newfs/yaffs2/yaffs_ecc.h25Newfs/yaffs2/yaffs_packedtags2.h

9Newfs/yaffs2/yaffs_fs.c26Newfs/yaffs2/yaffs_qsort.c

10Newfs/yaffs2/yaffs_getblockinfo.h27Newfs/yaffs2/yaffs_qsort.h

11Newfs/yaffs2/yaffs_guts.c28Newfs/yaffs2/yaffs_tagscompat.c

12Newfs/yaffs2/yaffs_guts.h29Newfs/yaffs2/yaffs_tagscompat.h

13Newfs/yaffs2/yaffs_mtdif.c30Newfs/yaffs2/yaffs_tagsvaliditiy.c

14Newfs/yaffs2/yaffs_mtdif.h31Newfs/yaffs2/yaffs_tagsvalidity.h

15Newfs/yaffs2/yaffs_mtddif1.c32Newfs/yaffs2/yaffsinterface.h

16Newfs/yaffs2/yaffs_mtddif1.h33Newfs/yaffs2/yportenv.h

17Newfs/yaffs2/yaffs_mtddif2.c

3、 蓝牙

在蓝牙通信协议栈里Google修改了10个文件。这些改动修复了一些与蓝牙耳机相关的明显的Bug,以及一些与蓝牙调试和访问控制相关的函数,具体如下所示。

1Chgdrivers/bluetooth/Kconfig添加HCI UART Debug

2Chgdrivers/bluetooth/hci_II.c如果HCI UART Debug定义在Kernel配置中,则添加BT_DBG()宏

3Chgnet/bluetooth/Kconfig添加配置选项L2CAP, HCI_CORE, HCI_SOCK,以及通用接口和语音

4Chgnet/bluetooth/af_bluetooth.c如果CONFIG_ANDROID_PARANOID_NETWORK被定义,则添加蓝牙功能的安全检查

5Chgnet/bluetooth/hci_event.c修正蓝牙的加密Bug和增加语音的支持

6Chgnet/bluetooth/rfcomm/core.c修正Bug

7Chgnet/bluetooth/rfcomm/sock.c修复Bug

8Chgnet/bluetooth/sco.c禁用SCO链接

9Chginclude/net/bluetooth/hci_core.h禁用LMP_ESCO

10Chginclude/net/bluetooth/rfcomm.h在rfcomm_dlc中添加“out”参数

4 、调度器(Scheduler)

Android内核还修改了与进程调度和时钟相关的策略。只改动了5个文件,如下:

1Chgkernel/sched.c添加NORMALIZED_SLEEPER

2Chgkernel/sched_fair.c修改内核的调度方式

3Chgkernel/softirq.c修改为CPU调度

4Chgkernel/time/tick-sched.c修改为CPU调度

5Chginclude/linux/tick.h如果CONFIG_NO_HZ被定义,则添加tick_nohz_ update_ stopped_ sched_tick()

5、 Android新增的驱动

Android在Linux的基础上新增了许多特有的驱动,如下所示。

1)IPC Binder 一种IPC(进程间通信)机制。它的进程能够为其他进程提供服务——通过标准的Linux系统调用API。IPC Binder的概念起源于一家名为Be.Inc的公司,在Google之前就已经被Palm软件采用了。

2)Low Memory Killer 其实内核里已经有一个类似的功能,名称为oom killer(out of memory killer)。当内存不够的时候,该策略会试图结束一个进程。

3)Ashmem 匿名共享内存。该功能使得进程间能够共享大块的内存。比如说,系统可以使用Ashmem保存一些图标,多个应用程序可以访问这个共享内存来获取这些图标。Ashmem为内核提供了一种回收这些使用完的共享内存块的方法,如果某个进程试图访问这些已经被回收的内存块,它将会得到错误的返回值,以便它重新进行内存块分配和数据初始化。

4)RAM Console and Log Device 为了调试方便,Android添加了一个功能,使调试信息可以输入到一个内存块中。此外,Android还添加了一个独立的日志模块,这样用户空间的进程就能够读写日志消息,以及调试打印信息等。

5)Android Debug Bridge 嵌入式设备的调试的确比较麻烦,为了便于调试,Google设计了这个调试工具,可以简称为ADB,使用USB作为连接方式,ADB可以看做是连接Android设备和PC机的一套协议。

除了这些主要的功能之外,Android还增加了诸如 real-time clock、switch、timed GPIO等功能,所有这些改动和增加包含在以下28个文件之中。

1Chgdrivers/Kconfig进入配置文件

2Chgdrivers/Makefile添加switch,驱动等

3Newdrivers/android/Kconfig添加BINDER_IPC、POWER、POWER_STAT、POWER_ ALARM、LOGGER、RAM_CONSOLE、TIMED_GPIO、PARANOID_NETWORK到配置中

4Newdrivers/android/Makefile添加binder.o、power.o、alarm.o、logger.o、ram_console.o、timed_gpio

5Newdrivers/android/alarm.c系统硬件时钟和实时时钟管理

6Newdrivers/android/binder.cIPC机制(Binder)

7Newdrivers/android/logger.cGoogle的日志API

8Newdrivers/android/ram_console.cRAM控制台和日志设备方便调试 [1]

9Newdrivers/android/timed_gpio.cGoogle的GPIO定时驱动

10Newdrivers/switch/Kconfig为GPIO添加配置选项

11Newdrivers/switch/Makefile引入GPIO驱动

12Newdrivers/switch/switch_class.c

13Newdrivers/switch/switch_gpio.c

14Chgdrivers/usb/gadget/Kconfig添加ADB配置选项

15Chgdrivers/usb/gadget/Makefile编译ADB所需的配置选项

16Newdrivers/usb/gadget/android_adb.cADB驱动

17Newinclude/linux/android_aid.h添加AIDs、INET、networking

18Newinclude/linux/android_alarm.h时钟功能设置

19Newinclude/linux/android_timed_gpio.hGPIO结构体

20Newinclude/linux/ashmem.hAndroid共享内存

21Newinclude/linux/binder.hBinder IPC API定义

22Newinclude/linux/logger.hLogger定义

23Newinclude/linux/switch.hGPIO switch接口

24Chgmm/Makefile添加ashmem.o

25Newmm/ashmem.c内存共享实现

26Chgdrivers/misc/Kconfig添加LOW_MEMORY_KILLER配置选项

27Chgdrivers/misc/Makefile添加lowmemorykiller.c

28Newdrivers/misc/lowmemorykiller.c当内存过低时,选择并结束进程

6 、电源管理

电源管理(Power Management)对于移动设备来说相当重要,也是最为复杂和开发难度最高的一个功能。Google添加了一个新的电源管理系统,不包含原有的apm和dpm等。这项改动主要涉及以下5个文件:

1Newinclude/linux/android_power.h定义电源管理API

2Newdrivers/android/power.c电源管理API实现

3Chgdrivers/input/evdev.c修改Android电源处理方式

4Chgfs/inotify_user.c修改Android电源处理方式

5Chgkernel/power/process.c修改Android电源处理方式

7、 杂项

除了上述改动之外,还有一些小改动,如新增的额外调试功能、键盘背光控制、TCP 网络管理等,共涉及36个文件,如下所示。

1NewDocumentation/vm/pagemap.txt

2Chgarch/arm/Kconfig添加HAVE_LATENCYTOP_SUPPORT和ARCH_GOLDFISH

3Chgarch/arm/kernel/process.c添加dump_task_regs方法

4Chgarch/arm/kernel/signal.c解决系统无法重新启动的问题

5Chgarch/arm/kernel/stacktrace.c改进调试栈跟踪

6Chgarch/arm/mm/abort-ev6.S

7Chgdrivers/char/Kconfig添加Memory device driver和Goldfish TTY driver

8Chgdrivers/char/mem.c使编译结果输出到/dev/kmem and /dev/mem

9Chgdrivers/leds/Kconfig当CPU运行时打开LEDS,但是屏幕是关闭的

10Chgdrivers/leds/Makefile添加编译ledtrig-sleep.o

11Newdrivers/leds/ledtrig-sleep.c睡眠(当关闭屏幕后CPU仍然运行)

12Chgdrivers/rtc/class.c修正实时时钟误差的Bug

13Chgfs/fat/dir.c添加VFAT_IOCTL_GET_VOLUME_ID到fat_dir_ioctl()

14Chg fs/fat/inode.c

15Chgfs/proc/base.c当内存不足时调整/proc文件

16Chgfs/proc/proc_misc.c修正kpagecount_read和kpageflags_read返回的一些错误

17Chgfs/proc/task_mmu.c简化add_to_pagemap中的错误检查

18Chginclude/asm-arm/elf.h添加ELF_CORE_COPY_TASK_REGS()宏调用dump_task_ regs(...)

19Chginclude/linux/mm.h添加shmem_set_file(...)函数原型

20Chginclude/linux/msdos_fs.h添加VFAT_IOCTL_GET_VOLUME_ID宏

21Chgkernel/hrtimer.c修复run_hrtimer_pending错误

22Chginit/Kconfig添加PANIC_TIMEOUT默认为0

23Chgkernel/panic.c设置默认的panic_timeout:从kernel配置到PANIC_TIMEOUT

24Chgkernel/power/console.c修复虚拟控制台的错误信息

25Chgkernel/printk.c修复printk错误

26Chgmm/filemap.c修正filemap_fault

27Chgmm/shmmem.c重构shmem_zero_setup

28Chgmm/tiny-shmem.c重构shmem_zero_setup

29Chginclude/linux/sockios.h添加SIOCKILLADDR控制

30Chginclude/net/tcp.h添加tcp_v4_nuke_addr函数

31Chgnet/ipv4/Makefile如果设置CONFIG_SYSFS,编译sysfs_net_ipv4

32Chgnet/ipv4/af_inet_c如果定义CONFIG_ANDROID_PARANOID_NETWORK,则添加安全检查

33Chgnet/ipv4/devinet.c添加SIOCKILLADDR

34Chgnet/ipv4/sysfs_net_ipv4.c控制TCP窗口长度

35Chgnet/ipv4/tcp_ipv4.c添加tcp_v4_nuke_addr函数

36Chgnet/ipv6/af_inet6.c如果定义CONFIG_ANDROID_PARANOID_NETWORK,则添加安全检查

上面这些看似简单,但是非常重要,当大家进行系统级应用开发和程序移植时都需要研究这些文件。对于每个文件的具体改动方式和实现,我们需要进一步查看Android的内核源代码,这是后面将要详细讲解的内容。

为了调试方便,Android 添加了一个功能,使得调试信息可以输入到一个内存块中。此外, Android 添加了一个独立的日志模块,这样用户空间的进程能够读写日志消息,调试打印信息等。

更多相关文章

  1. Android(安卓)程序的主要组成部分 和 Manifest 文件
  2. Android性能优化典范
  3. 深入探讨Android----必不可少的高级功能
  4. Android高性能文件类MemoryFile
  5. JIN学习一、Android使用已有C/C++代码、第三方SO库的方法
  6. Android中自定义组合控件
  7. 第三部分:Android(安卓)应用程序接口指南---第五节:计算---第一章
  8. Android(安卓)进阶解密:init 进程启动过程
  9. s5p4418 Android(安卓)4.4.2 驱动层 HAL层 服务层 应用层 开发流

随机推荐

  1. Android进阶之AIDL的使用详解
  2. Android api对应系统版本
  3. Android(安卓)Application基础
  4. 八款开源 Android 游戏引擎 (巨好的资源)
  5. Android 模拟返回键功能
  6. Android桌面组件App Widget用法入门教程
  7. cocos2dx3.2 Android环境配置
  8. 全局窗口一
  9. Android(安卓)扫一扫功能实现(Zbar)
  10. android 图片轮播(banner)无限轮播