zoukankan      html  css  js  c++  java
  • 转载.android 对linux 内核的改动,到底改了多少?

    我们知道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 添加了一个独立的日志模块,这样用户空间的进程能够读写日志消息,调试打印信息等。

  • 相关阅读:
    结巴分词 0.14 版发布,Python 中文分词库
    Lazarus 1.0.2 发布,Pascal 集成开发环境
    Android全屏 去除标题栏和状态栏
    服务器日志现 Android 4.2 传将添多项新特性
    Percona XtraBackup 2.0.3 发布
    长平狐 Android 强制设置横屏或竖屏 设置全屏
    NetBeans 7.3 Beta 发布,全新的 HTML5 支持
    CppDepend现在已经支持Linux
    GromJS 1.7.18 发布,服务器端的 JavaScript
    Apache OpenWebBeans 1.1.6 发布
  • 原文地址:https://www.cnblogs.com/gooogleman/p/2575776.html
Copyright © 2011-2022 走看看