`
mintelong
  • 浏览: 396136 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Android内核的简单分析

阅读更多
Android内核的简单分析
mintelong (vkafei@hotmail.com)

   Google的Android操作系统已经成功面市,因为Android操作系统是基于Linux-2.6.25内核的,并且目前所有的源代码也都全部开放,因此可以简单地加以分析以方便以后向其他平台的移植工作.

   首先需要了解的就是Android的一些基本情况,并下载Android的源代码以方便分析.

   Android的官方站点:

   http://www.android.com/

   Android Source 的官方安装方法:

   http://source.android.com/download



   Android的中文站点:

   http://www.androidin.com/


   源代码包的相应联结地址:
 
   http://www.androidin.com/bbs/viewthread.php?tid=2337



   我们可以采用Android官方站点推荐方式来下载Android的源代码,也可以从Android中文站点直接下载源代码程序包,随后再更新和同步.
 
   当采用Android官方推荐方式下载或者需要更新你的源代码时,都需要git工具支持, 当你的系统没有安装git或者git版本过低时,建议从下面的地址更新到最新的git包.(Android要求git版本必须大于1.5.4)

   http://git.or.cz/

   给git自动升级的方式:

   git clone git://git.kernel.org/pub/scm/git/git.git

    
   如果采用下载源代码包的方式,下载并展开后,在 .repo/repo 目录下有同步执行的文件repo, 你可以将其拷贝到你的PATH所在路径以备使用,例如/usr/bin等等. 或者也可以从Android站点得到最新的repo文件并复制到PATH所在路径.

   wget http://android.git.kernel.org/repo

   源代码包解开后,其主目录下存在repo_sync.sh文件, 其主要是执行repo sync以实现和Android站点同步代码包的目的, 当执行出错后将再一次运行repo sync命令直到同步正常结束,但原文件包含错误,建议改成下面的程序:(原文件中少了一个空格)

#!/bin/bash
echo "============start repo sync================="
repo sync
while [ $? = 1 ]; do
echo "============sync failed, re-sync again ====="
sleep 3
repo sync
done


   这样, 运行sh repo_sync.sh就可以自动实现本地代码包的同步和更新动作了.

   我在Fedora Core 6上经过同步之后, du -h ./mydroid, 占用空间大约是2.1G

   以下为Android官方公布的架构图:

 




   在kernel子目录下存放的就是Android的Linux Kernel了, 通过和标准的Linux 2.6.25 Kernel的对比,我们可以发现,其主要增加了以下的内容:



   1. 基于ARM架构增加Gold-Fish平台,相应增加的目录如下:

      kernel/arch/arm/mach-goldfish

      kernel/include/asm-arm/arch-goldfish





      目前Google的基于Gold-Fish的手机为G1手机,明年G2手机将面世。

      该手机采用QualComm公司的高性能处理芯片MSM7201A,该芯片以ARM 11作为Application应用处理器,以ARM926T作为BaseBand主处理器(主要承载GSM/GPRS/EDGE/3G等协议栈处理),支持JAVA硬加速(ARM本身也自带JAVA硬件处理),包含GPS Processor, 支持2D/3D图形加速(每秒可处理4百万个多边形),另外还支持最大800万像素的Sensor, 支持MPEG 4/H.263/H.264/Real Media等多种Codec。

      其中ARM926T采用的主频为274M HZ, ARM11的主频为528MHZ. (MSM7200的ARM11的主频为400M HZ)

      因为没有找到MSM7201A的详细DataSheet, 因此可以简单地参考MSM7200的规格:


      MSM7200_DataSheet.pdf


      下面为MSM7200架构图:

       




   2. 增加了yaffs2 FLASH文件系统,相应增加的目录为:

      kernel/fs/yaffs2

      实际上,Android包经过编译后生成的system.img和ramdisk.img文件就是yaffs2格式的包.
  

   3. 增加了Android的相关Driver,相应目录为:

      kernel/drivers/android 


      主要分为:

           Android IPC系统:       Binder (binder.c)

           Android 日志系统:       Logger (logger.c)

           Android 电源管理:       Power (power.c)

           Android 闹钟管理:       Alarm  (alarm.c)

           Android 内存控制台:     Ram_console (ram_console.c)

           Android 时钟控制的gpio: Timed_gpio (timed_gpio.c)


   4. 增加了switch处理, 相应的目录为:

      kernel/drivers/switch/  


   5. 增加了一种新的共享内存处理方式, 相应增加的文件为:

      kernel/mm/ashmem.c 

         
   6.  其他为Linux-2.6.25内核所做的补丁等等,例如BlueTooth, 在此不做详细分析






 
   另外GoldFish平台相关的驱动文件如下:

   1. 字符输出设备:

      kernel/drivers/char/goldfish_tty.c   

   2. 图象显示设备: (Frame Buffer)

      kernel/drivers/video/goldfishfb.c

   3. 键盘输入设备:

      kernel/drivers/input/keyboard/goldfish_events.c

   4. RTC设备: (Real Time Clock)

      kernel/drivers/rtc/rtc-goldfish.c

   5. USB Device设备:

      kernel/drivers/usb/gadget/android_adb.c

   6. SD卡设备:

      kernel/drivers/mmc/host/goldfish.c
    
   7. FLASH设备:

      kernel/drivers/mtd/devices/goldfish_nand.c

      kernel/drivers/mtd/devices/goldfish_nand_reg.h

   8. LED设备:

      kernel/drivers/leds/ledtrig-sleep.c

   9. 电源设备:

      kernel/drivers/power/goldfish_battery.c

   10. 音频设备:

       kernel/arch/arm/mach-goldfish/audio.c

   11. 电源管理:

       kernel/arch/arm/mach-goldfish/pm.c

   12. 时钟管理:

       kernel/arch/arm/mach-goldfish/timer.c



   下面的链接为Android Kernel和标准Linux-2.6.25包相比较所产生的PATCH包, 其中比较小的other patch包是除了上面列出的增加文件之外所修改的文件细节,供大家参考。

   http://blogimg.chinaunix.net/blog/upfile2/090102095410.gz


   以下为Android内核启动信息:

Uncompressing Linux.................................................................................... done, booting the kernel.
emulator: emulator window was out of view and was recentred

Linux version 2.6.25-00350-g40fff9a (android-build@apa27.mtv.corp.google.com) (gcc version 4.2.1) #1 Wed Jul 23 18:10:44 PDT 2008
CPU: ARM926EJ-S [41069265] revision 5 (ARMv5TEJ), cr=00003137
Machine: Goldfish
Memory policy: ECC disabled, Data cache writeback
CPU0: D VIVT write-through cache
CPU0: I cache: 4096 bytes, associativity 4, 32 byte lines, 32 sets
CPU0: D cache: 65536 bytes, associativity 4, 32 byte lines, 512 sets
Built 1 zonelists in Zone order, mobility grouping on.  Total pages: 24384
Kernel command line: qemu=1 console=ttyS0 android.checkjni=1 android.qemud=ttyS1 android.ndns=2
Unknown boot option `android.checkjni=1': ignoring
Unknown boot option `android.qemud=ttyS1': ignoring
Unknown boot option `android.ndns=2': ignoring
PID hash table entries: 512 (order: 9, 2048 bytes)
Console: colour dummy device 80x30
Dentry cache hash table entries: 16384 (order: 4, 65536 bytes)
Inode-cache hash table entries: 8192 (order: 3, 32768 bytes)
Memory: 96MB = 96MB total
Memory: 94268KB available (2380K code, 445K data, 100K init)
Mount-cache hash table entries: 512
CPU: Testing write buffer coherency: ok
net_namespace: 152 bytes
android_power_init
android_power_init done
NET: Registered protocol family 16
NET: Registered protocol family 2
IP route cache hash table entries: 1024 (order: 0, 4096 bytes)
TCP established hash table entries: 4096 (order: 3, 32768 bytes)
TCP bind hash table entries: 4096 (order: 2, 16384 bytes)
TCP: Hash tables configured (established 4096 bind 4096)
TCP reno registered
checking if image is initramfs... it is
Freeing initrd memory: 136K
goldfish_new_pdev goldfish_interrupt_controller at ff000000 irq -1
goldfish_new_pdev goldfish_device_bus at ff001000 irq 1
goldfish_new_pdev goldfish_timer at ff003000 irq 3
goldfish_new_pdev goldfish_rtc at ff010000 irq 10
goldfish_new_pdev goldfish_tty at ff002000 irq 4
goldfish_new_pdev goldfish_tty at ff011000 irq 11
goldfish_new_pdev smc91x at ff012000 irq 12
goldfish_new_pdev goldfish_fb at ff013000 irq 13
goldfish_new_pdev goldfish_audio at ff004000 irq 14
goldfish_new_pdev goldfish_memlog at ff006000 irq -1
goldfish_new_pdev goldfish-battery at ff014000 irq 15
goldfish_new_pdev goldfish_events at ff015000 irq 16
goldfish_new_pdev goldfish_nand at ff016000 irq -1
goldfish_new_pdev goldfish-switch at ff017000 irq 17
goldfish_new_pdev goldfish-switch at ff018000 irq 18
goldfish_pdev_worker registered goldfish-switch
goldfish_pdev_worker registered goldfish-switch
goldfish_pdev_worker registered goldfish_nand
goldfish_pdev_worker registered goldfish_events
goldfish_pdev_worker registered goldfish-battery
goldfish_pdev_worker registered goldfish_memlog
goldfish_audio_probe
goldfish_pdev_worker registered goldfish_audio
goldfish_pdev_worker registered goldfish_fb
goldfish_pdev_worker registered smc91x
goldfish_pdev_worker registered goldfish_tty
goldfish_pdev_worker registered goldfish_tty
goldfish_pdev_worker registered goldfish_rtc
goldfish_pdev_worker registered goldfish_timer
goldfish_pdev_worker registered goldfish_device_bus
goldfish_pdev_worker registered goldfish_interrupt_controller
ashmem: initialized
Installing knfsd (copyright (C) 1996 okir@monad.swb.de).
yaffs Jul 23 2008 18:10:35 Installing.
io scheduler noop registered
io scheduler anticipatory registered (default)
io scheduler deadline registered
io scheduler cfq registered
allocating frame buffer 320 * 480, got ffc10000
Console: switching to colour frame buffer device 40x30
console [ttyS0] enabled
brd: module loaded
loop: module loaded
nbd: registered device at major 43
smc91x.c: v1.1, sep 22 2004 by Nicolas Pitre <nico@cam.org>
No IRQF_TRIGGER set_type function for IRQ 12 (goldfish)
eth0: SMC91C11xFD (rev 1) at c6800000 IRQ 12 [nowait]
eth0: Ethernet addr: 52:54:00:12:34:56
goldfish nand dev0: size 4000000, page 2048, extra 64, erase 131072
goldfish nand dev1: size 4000000, page 2048, extra 64, erase 131072
goldfish nand dev2: size 4000000, page 2048, extra 64, erase 131072
mice: PS/2 mouse device common for all mice
*** events probe ***
events_probe() addr=0xc6804000 irq=16
events_probe() keymap=qwerty2
input: qwerty2 as /class/input/input0
goldfish_rtc goldfish_rtc: rtc core: registered goldfish_rtc as rtc0
logger: created 64K log 'log_main'
logger: created 64K log 'log_events'
logger: created 64K log 'log_radio'
IPv4 over IPv4 tunneling driver
GRE over IPv4 tunneling driver
TCP cubic registered
NET: Registered protocol family 1
NET: Registered protocol family 17
RPC: Registered udp transport module.
RPC: Registered tcp transport module.
802.1Q VLAN Support v1.8 Ben Greear <greearb@candelatech.com>
All bugs added by David S. Miller <davem@redhat.com>
VFP support v0.3: implementor 41 architecture 1 part 10 variant 9 rev 0
goldfish_rtc goldfish_rtc: setting system clock to 2009-01-02 07:43:01 UTC (1230882181)
Freeing init memory: 100K
init: cannot open '/initlogo.rle'
yaffs: dev is 32505856 name is "mtdblock0"
yaffs: passed flags ""
yaffs: Attempting MTD mount on 31.0, "mtdblock0"
yaffs: dev is 32505857 name is "mtdblock1"
yaffs: passed flags ""
yaffs: Attempting MTD mount on 31.1, "mtdblock1"
yaffs: dev is 32505858 name is "mtdblock2"
yaffs: passed flags ""
yaffs: Attempting MTD mount on 31.2, "mtdblock2"
sh: can't access tty; job control turned off
# init: cannot find '/system/bin/playmp3', disabling 'bootsound'
eth0: link up
warning: `rild' uses 32-bit capabilities (legacy support in use)
init: sys_prop: mis-match msg size recieved: -1 expected: 128

  从启动信息可以看出,其主CPU为ARM926EJ-S,并非ARM11 CPU, 说明下载的Emulator内核并非是针对G1手机的,估计只是实现了对ARM926EJ-S CPU的模拟。

   以上为Android内核的大致分析,希望能给有兴趣的人员以简单帮助。 
分享到:
评论

相关推荐

    Android内核的简单分析 Android 内核

    ### Android内核的简单分析 #### 一、概述 Android作为一个全球范围内广泛应用的移动操作系统,其内核基于Linux-2.6.25版本,并且所有源代码均已开放。这为开发者提供了极大的便利,便于他们深入研究Android内核...

    Android内核的简单分析.rar

    至于"Android内核的简单分析"部分,可能涉及了Android内核与标准Linux内核的区别,例如Android特有的服务架构、硬件抽象层(HAL)、Android运行时环境(ART)以及对Android特定功能的支持,如Binder IPC(进程间通信...

    Android内核的简单分析+Android+内核

    ### Android内核的简单分析 #### 一、概述 随着Google的Android操作系统的成功发布,其基于Linux-2.6.25内核的特点引起了广泛关注。由于所有源代码的完全开放,这为开发者们提供了宝贵的资源,使得对Android内核...

    Android内核与标准Linux内核对比分析.pdf

    《Android内核与标准Linux内核对比分析》 Android内核是Google开发的开源移动操作系统Android的核心组成部分,基于Linux 2.6内核,但在针对移动设备的特性上进行了诸多定制化修改。本文旨在深入探讨Android内核与...

    Android 内核剖析之Framework的启动分析

    ### Android 内核剖析之Framework的启动分析 #### 9.1 Framework运行环境综述 在深入了解Android框架(Framework)的启动过程之前,我们首先需要理解其运行环境的基本构成。框架启动过程的本质在于构建一系列支持...

    Android 内核相关内容总结.txt

    通过对Android内核的深入研究,我们可以发现Android不仅仅是在Linux的基础上简单修改而成的操作系统,而是经过了大量的定制和优化,以适应移动设备的特点和需求。无论是从硬件平台的支持、文件系统的选择还是各种...

    linux 内核情景分析 清晰版

    - **移动设备**:Android操作系统就是基于Linux内核开发的,这使得Linux在移动设备领域也占据了重要的位置。 - **嵌入式系统**:由于其小体积和高灵活性,Linux也被广泛应用于嵌入式系统中,如路由器、智能电视等。 ...

    Android嵌入式系统架构及内核浅析_王茜

    Android内核基于Linux 2.6内核,但并不是简单的继承,而是进行了部分修改和新增。Android内核主要实现了以下几个核心功能: 1. 安全性:增加了额外的安全机制,保护系统免受恶意软件影响。 2. 内存管理:优化内存...

    android bugreport 分析

    ### Android Bugreport 分析:掌握核心技能 在深入解析Android bugreport之前,我们先了解其基本概念。Android bugreport是一个全面的系统日志文件,它包含了大量的系统信息,旨在帮助开发者诊断和解决Android设备...

    Android底层开发技术实战详解——内核、移植和驱动

    1. **Android内核**:Android系统基于Linux内核,它是整个操作系统的基石。内核负责管理硬件资源,如处理器、内存、I/O设备,并提供进程管理、内存管理、文件系统、网络协议栈等核心服务。开发者需要理解内核如何与...

    读懂linux内核源代码

    《读懂Linux内核源代码》这本书旨在为初学者提供一条清晰的学习路径,并为Android开发人员提供宝贵的知识资源。本文将深入探讨Linux内核开发的重要性、学习方法以及如何有效地分析Linux内核源代码。 #### 二、Linux...

    android内核剖析

    ### Android内核剖析之Binder机制详解 #### 一、引言 在Android系统中,Binder作为核心组件之一,主要用于实现跨进程通信(Inter-Process Communication, IPC)。它不仅支持简单的数据传输,还能够进行复杂的对象...

    Android属性系统分析

    init进程是Android系统中的第一个用户空间进程,它由内核在启动阶段创建。init进程的源码位于/system/core/init/init.c。在init进程的初始化过程中,最重要的一项工作是解析init.rc文件,这是一个脚本文件,用于定义...

    Android闹钟内核驱动——Alarm.pdf

    - **Alarm 驱动**: 在 Android 中, Alarm 驱动不仅仅是一个简单的定时器, 它更是一个能够管理和调度各种不同类型定时任务的高级驱动。它依赖于 RTC 驱动, 但本身不是 RTC 驱动的一部分, 其主要职责是实现定时闹钟的...

    一个公司上千元的Android培训资料.part2

    Android内核的简单分析 Android应用开发揭秘 Android应用软件前景分析 android中文文档 Android Application Development Hello, Android 2nd Edition Hello, Android 2nd Edition (November 2009) (ATTiCA)

Global site tag (gtag.js) - Google Analytics