Android 内核的简单分析 Android 内核


Android 内 核 的 简 单 分 析内 核 的 简 单 分 析内 核 的 简 单 分 析内 核 的 简 单 分 析 Android 内 核 的 简 单 分 析 NeilWong ( neilwong@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 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 All bugs added by David S. Miller 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 内 核 的 大 致 分 析,希望能给有兴趣的人员以简单帮助。
还剩16页未读

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 8 金币 [ 分享pdf获得金币 ] 1 人已下载

下载pdf

pdf贡献者

zgzlwm

贡献于2012-11-14

下载需要 8 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!
下载pdf