Chinaunix首页 | 论坛 | 博客
  • 博客访问: 462610
  • 博文数量: 137
  • 博客积分: 3874
  • 博客等级: 中校
  • 技术积分: 1475
  • 用 户 组: 普通用户
  • 注册时间: 2010-07-05 10:50
文章分类

全部博文(137)

文章存档

2011年(37)

2010年(100)

分类: LINUX

2011-03-19 21:16:45

从Linux内核的角度来分析的内核,希望给初学者提够有用的信息。本章将简单的介绍 Android内核的全貌,起到一个抛砖引玉的作用。从下一篇开始将详细介绍每一个Android内核驱动程序及其作用。

内核是基于Linux 2.6内核的(目前最新开发版本是2.6.31),它是一个增强内核版本,除了修改部分Bug外,它提供了用于支持Android平台的设备驱动,其核心驱动主要包括: 

 Binder ,基于OpenBinder框架的一个驱动,用于提供Android平台的进程间通讯(IPC,inter-process communication)。
    源代码位于drivers/staging//binder.c 


电源管理(PM) ,一个基于标准Linux电源管理系统的轻量级的Android电源管理驱动,针对嵌入式设备做了很多优化。
    源代码位于kernel/power/earlysuspend.c 
                        kernel/power/consoleearlysuspend.c 
                        kernel/power/fbearlysuspend.c 
                        kernel/power/wakelock.c 
                        kernel/power/userwakelock.c 


低内存管理器(Low Memory Killer) ,相对于Linux标准OOM(Out Of Memory)机制更加灵活,它可以根据需要杀死进程来释放需要的内存。
    源代码位于drivers/staging//lowmemorykiller.c 


匿名共享内存(ashmem) ,为进程间提供大块共享内存,同时为内核提供回收和管理这个内存的机制。
    源代码位于mm/ashmem.c 


 PMEM(Physical) ,PMEM用于向用户空间提供连续的物理内存区域,DSP和某些设备只能工作在连续的物理内存上。
    源代码位于drivers/misc/pmem.c 

 Logger ,一个轻量级的日志设备,用于抓取Android系统的各种日志。
    源代码位于drivers/staging//logger.c 


 Alarm ,提供了一个定时器用于把设备从睡眠状态唤醒,同时它也提供了一个即使在设备睡眠时也会运行的时钟基准,
    源代码位于drivers/rtc/alarm.c 

USB Gadget驱动 ,一个基于标准Linux USB gadget驱动框架的设备驱动,的USB驱动是基于gaeget框架的,
    源代码位于drivers/usb/gadget/ 


 Ram Console ,为了提供调试功能,Android允许将调试日志信息写入一个被称为RAM Console的设备里,它是一个基于RAM的Buffer。
    源代码位于drivers/staging//ram_console.c。 

 timed device ,提供了对设备进行定时控制功能,目前支持vibrator和LED设备。
    源代码位于drivers/staging//timed_output.c(timed_gpio.c)。 

Yaffs2文件系统 , 采用Yaffs2作为MTD nand flash文件系统,源代码位于fs/yaffs2/目录下。Yaffs2是一个快速稳定的应用于NAND和NOR Flash的跨平台的嵌入式设备文件系统,同其他Flash文件系统相比,Yaffs2使用更小的内存来保存他的运行状态,因此它占用内存 小;Yaffs2的垃圾回收非常简单而且快速,因此能达到更好的性能;Yaffs2在大容量的NAND Flash上性能表现尤为明显,非常适合大容量的Flash存储。
 

内核添加或修改的文件很多,下面的列表描述了Android Emulator内核的文件:
drivers/misc/kernel_debugger.c
drivers/misc/pmem.c
drivers/misc/qemutrace/qemu_trace_sysfs.c
drivers/misc/qemutrace/qemu_trace.c
drivers/misc/qemutrace/qemu_trace.h
drivers/misc/uid_stat.c
drivers/staging//lowmemorykiller.c
drivers/staging//logger.c
drivers/staging//timed_output.h
drivers/staging//ram_console.c
drivers/staging//timed_gpio.c
drivers/staging//logger.h
drivers/staging//binder.h
drivers/staging//binder.c
drivers/staging//timed_output.c
drivers/staging//timed_gpio.h
drivers/rtc/alarm.c
drivers/rtc/rtc-goldfish.c
drivers/net/pppolac.c
drivers/net/ppp_mppe.c
drivers/net/pppopns.c
drivers/video/goldfishfb.c
drivers/switch/switch_class.c
drivers/switch/switch_gpio.c
drivers/char/dcc_tty.c
drivers/char/goldfish_tty.c
drivers/watchdog/i6300esb.c
drivers/input/misc/gpio_event.c
drivers/input/misc/gpio_input.c
drivers/input/misc/gpio_output.c
drivers/input/misc/keychord.c
drivers/input/misc/gpio_axis.c
drivers/input/misc/gpio_matrix.c
drivers/input/keyreset.c
drivers/input/keyboard/goldfish_events.c
drivers/input/touchscreen/synaptics_i2c_rmi.c
drivers/usb/gadget/.c
drivers/usb/gadget/f_adb.h
drivers/usb/gadget/f_mass_storage.h
drivers/usb/gadget/f_adb.c
drivers/usb/gadget/f_mass_storage.c
drivers/mmc/host/goldfish.c
drivers/power/goldfish_battery.c
drivers/leds/ledtrig-sleep.c
drivers/mtd/devices/goldfish_nand_reg.h
drivers/mtd/devices/goldfish_nand.c
kernel/power/earlysuspend.c
kernel/power/consoleearlysuspend.c
kernel/power/fbearlysuspend.c
kernel/power/wakelock.c
kernel/power/userwakelock.c
kernel/cpuset.c
kernel/cgroup_debug.c
kernel/cgroup.c
mm/ashmem.c
include/linux/ashmem.h
include/linux/switch.h
include/linux/keychord.h
include/linux/earlysuspend.h
include/linux/_aid.h
include/linux/uid_stat.h
include/linux/if_pppolac.h
include/linux/usb/.h
include/linux/wifi_tiwlan.h
include/linux/_alarm.h
include/linux/keyreset.h
include/linux/synaptics_i2c_rmi.h
include/linux/_pmem.h
include/linux/kernel_debugger.h
include/linux/gpio_event.h
include/linux/wakelock.h
include/linux/if_pppopns.h
net/ipv4/sysfs_net_ipv4.c
net/ipv4/af_inet.c
net/ipv6/af_inet6.c
net/bluetooth/af_bluetooth.c
security/commoncap.c
fs/proc/base.c

内核配置 
 是基于 Linux   对于一个新的设备,我们 首先要 编译一个支持 Android  Kernel ,那么如何 使 你的 Kernel Android 化呢?除了要移植前面提到的驱动之外,就是如何配置你的 Kernel 来支持 Android 平台,这可以参考 Goldfish 的内核配置文件 - arch/arm/configs/goldfish_defconfig  
一般来说,我们会基于一个平台标准内核配置选项来配置  内核,你可以根据具体的硬件平台来选择 Android 内核的配置选项,可以参考下面的 Android 内核配置列表: 

一般需要支持的内核选项Google对 2.6.25 内核里做了什么改动呢?

有家公司专门比较了标准内核和 内核,发现 google 修改了 75 个文件,增加了 88 个文件。改公司还对这些被修改的和新增的文件做了注解。

Goldfish -- 44 Files

模拟器运行了一个被 google  叫做 “ 金鱼 " 的虚拟 CPU. 金鱼运行 arm926t 指令集( arm926t 是属于 armv5 架构);并且仿真了输入输出:比如键盘输入和 LCD  输出。这个模拟器其实是在 qemu 之上开发的,输入输出基于 libSDL.

内核里这个Goldfish 接口实现了这个虚拟 “ 金鱼 ”CPU 的一些接口,如果想在真实设备上运行 , 这些接口肯定要去掉的。

arm926ej的介绍见

YAFFS2 -- 35 Files

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

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

蓝牙 -- 10 files

在蓝牙通讯协议栈里Google 修改了 10 个文件。这些改动解决了一些跟蓝牙耳机相关的明显的 bug ,以及一些蓝牙调试和访问控制相关的函数。

调度器 -- 5 files

内核还修改了进程调度和时钟相关策略,这个改动就比较深入了。其目的和效果估计在一段时间后才能找到。

为 新增的功能  -- 28 files

除了修正一些bug 以及其他的改动,  还增加了一些新的 “ 子系统 ” ,这些系统都比较重要。

IPC Binder

IPC Binder是一种 IPC( 进程间通信)机制。它是的进程能够为其他进程提供服务 —— 还是通过标准的 linux 系统调用 api 。 IPC Binder 的概念起源于一家叫做 “Be.Inc" 的公司,在 Google 之前就已经被然后被用到 Palm 软件里去了。

Low Memory Killer

其实内核里已经有一个类似的功能, 叫做"oom killer", 就是 out of memory killer, 当内存不够的时候,改策略会试图结束一个进程。不知道为什么 Google 重新实现了这个策略。

Ashmem

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

RAM Console and Log Device

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

 Debug Bridge

嵌入式设备的调试的确比较麻烦。为了便于调试,google 设计了这个调试工具,可以叫做 "ADB" ,使用 USB 作为连接方式 ,ADB 可以看作是链接  的设备和 PC 机的一套协议。

 还添加了其他的东西,比如  real-time clock, switch , timed GPIO 。

Power Management -- 5 files

电源管理对于移动设备来说相当重要,也是最复杂,开发难度最高的一个功能。Google 添加了一个新的电源管理系统,并没有原先 apm,dpm 等。

其他修改 -- 36 files

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

根据上述,google 对标准的内核做了很大的改动。相比其他的项目,比如 Nokia N810,Openmoko 等项目中,内核的改动仅仅是增加了某个平台的支持。所以移植最快也是最可能的办法是在 google 使用的 kernel 上增加平台支持。

也有一些开发人员将google 对 2.6.25 内核的改动做成补丁,直接打在自己开发的内核上 —— 当然,自己的内核也应该是 2.6.25 ,否则会出问题


_PARANOID_NETWORK
ASHMEM
CONFIG_FB_MODE_HELPERS
CONFIG_FONT_8x16
CONFIG_FONT_8x8
CONFIG_YAFFS_SHORT_NAMES_IN_RAM
DAB
EARLYSUSPEND
FB
FB_CFB_COPYAREA
FB_CFB_FILLRECT
FB_CFB_IMAGEBLIT
FB_DEFERRED_IO
FB_TILEBLITTING
HIGH_RES_TIMERS
INOTIFY
INOTIFY_USER
INPUT_EVDEV
INPUT_GPIO
INPUT_MISC
LEDS_CLASS
LEDS_GPIO
LOCK_KERNEL
LkOGGER
LOW_MEMORY_KILLER
MISC_DEVICES
NEW_LEDS
NO_HZ
POWER_SUPPLY
PREEMPT
RAMFS
RTC_CLASS
RTC_LIB
SWITCH
SWITCH_GPIO
TMPFS
UID_STAT
UID16
USB_FUNCTION
USB_FUNCTION_ADB
USER_WAKELOCK
VIDEO_OUTPUT_CONTROL
WAKELOCK
YAFFS_AUTO_YAFFS2
YAFFS_FS
YAFFS_YAFFS1
YAFFS_YAFFS2

但是推荐不要支持下面两个功能:
CONFIG_YAFFS_DISABLE_LAZY_LOAD 

DNOTIFY 

配置好后,就可以用Toolchain来编译内核了。编译内核比较简单,以Emulator的kernel为例:
    - git clone git://.kernel.org/kernel/common.git kernel-emulator 
    - cd kernel-emulator 
    - export ARCH=arm 
    - export CROSS_COMPILE=arm-eabi- 
    - export PATH= PATH 
    - make goldfish_defconfig 
    - make 

Google对 2.6.25 内核里做了什么改动呢?

有家公司专门比较了标准内核和 内核,发现 google 修改了 75 个文件,增加了 88 个文件。改公司还对这些被修改的和新增的文件做了注解。

Goldfish -- 44 Files

模拟器运行了一个被 google  叫做 “ 金鱼 " 的虚拟 CPU. 金鱼运行 arm926t 指令集( arm926t 是属于 armv5 架构);并且仿真了输入输出:比如键盘输入和 LCD  输出。这个模拟器其实是在 qemu 之上开发的,输入输出基于 libSDL.

内核里这个Goldfish 接口实现了这个虚拟 “ 金鱼 ”CPU 的一些接口,如果想在真实设备上运行 , 这些接口肯定要去掉的。

arm926ej的介绍见

YAFFS2 -- 35 Files

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

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

蓝牙 -- 10 files

在蓝牙通讯协议栈里Google 修改了 10 个文件。这些改动解决了一些跟蓝牙耳机相关的明显的 bug ,以及一些蓝牙调试和访问控制相关的函数。

调度器 -- 5 files

内核还修改了进程调度和时钟相关策略,这个改动就比较深入了。其目的和效果估计在一段时间后才能找到。

为 新增的功能  -- 28 files

除了修正一些bug 以及其他的改动,  还增加了一些新的 “ 子系统 ” ,这些系统都比较重要。

IPC Binder

IPC Binder是一种 IPC( 进程间通信)机制。它是的进程能够为其他进程提供服务 —— 还是通过标准的 linux 系统调用 api 。 IPC Binder 的概念起源于一家叫做 “Be.Inc" 的公司,在 Google 之前就已经被然后被用到 Palm 软件里去了。

Low Memory Killer

其实内核里已经有一个类似的功能, 叫做"oom killer", 就是 out of memory killer, 当内存不够的时候,改策略会试图结束一个进程。不知道为什么 Google 重新实现了这个策略。

Ashmem

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

RAM Console and Log Device

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

 Debug Bridge

嵌入式设备的调试的确比较麻烦。为了便于调试,google 设计了这个调试工具,可以叫做 "ADB" ,使用 USB 作为连接方式 ,ADB 可以看作是链接  的设备和 PC 机的一套协议。

 还添加了其他的东西,比如  real-time clock, switch , timed GPIO 。

Power Management -- 5 files

电源管理对于移动设备来说相当重要,也是最复杂,开发难度最高的一个功能。Google 添加了一个新的电源管理系统,并没有原先 apm,dpm 等。

其他修改 -- 36 files

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

根据上述,google 对标准的内核做了很大的改动。相比其他的项目,比如 Nokia N810,Openmoko 等项目中,内核的改动仅仅是增加了某个平台的支持。所以移植最快也是最可能的办法是在 google 使用的 kernel 上增加平台支持。

也有一些开发人员将google 对 2.6.25 内核的改动做成补丁,直接打在自己开发的内核上 —— 当然,自己的内核也应该是 2.6.25 ,否则会出问题



阅读(1481) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~