Android内核的大致分析

  以下为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的模拟。

 

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Android内核驱动移植是将特定硬件设备的驱动程序适配到Android操作系统上的过程。在移植过程中需要考虑硬件设备与操作系统之间的兼容性,确保硬件设备能够在Android系统上正常工作。 首先,进行Android内核驱动移植的前提是要了解硬件设备的驱动程序。开发人员需要对设备硬件结构有一定了解,并获取硬件设备的相关驱动程序源代码和文档。 然后,开发人员需要将硬件设备的驱动程序源代码与Android内核进行集成,确保代码的兼容性。这可能涉及到对驱动程序的修改、添加和删除,以适应Android内核的要求。同时,需要进行相应的配置工作,将硬件设备与Android内核进行绑定。 接下来,需要编译和构建移植后的Android内核。开发人员需要使用交叉编译工具链,将修改后的驱动程序源代码编译为与目标平台兼容的二进制文件。构建过程中还需要确保相关的编译选项和依赖库的设置是正确的。 最后,将编译完成的Android内核镜像烧录到目标硬件设备上,进行测试和调试。通过测试和调试,开发人员可以验证驱动程序的正确性和稳定性,确保硬件设备在Android系统上的正常工作。 总之,Android内核驱动移植需要开发人员对硬件设备驱动编程有一定的了解,同时具备一定的编译和调试技能。通过适配和修改驱动程序,将硬件设备与Android内核进行集成,最终实现硬件设备在Android系统上的正常工作。 ### 回答2: Android内核驱动移植是指将一个已存在的硬件设备驱动程序移植到Android系统上,以便在该系统上能够对该设备进行控制和使用。移植步骤大致包括对硬件设备的硬件接口进行理解、准备移植环境、修改设备驱动源代码、编译并生成可以在Android系统上运行的设备驱动模块。下面对Android内核驱动移植的过程进行详细说明。 首先,进行移植前需要对目标硬件设备的硬件接口进行全面理解,并获得相关的文档和驱动源代码,以便后续修改和适配。 其次,需要准备一个适合的开发环境,包括正确的Android内核版本,相应的编译工具链和必要的库文件。 然后,根据目标硬件设备的特点和Android系统的要求,修改设备驱动源代码。这一步需要根据硬件设备的数据结构、寄存器配置和控制寄存器等,对驱动程序进行相应的修改和适配。 接下来,进行编译工作。根据移植好的设备驱动源代码,在准备的开发环境中使用正确的编译工具链进行编译,生成可以在目标Android系统上运行的设备驱动模块。 最后,将生成的设备驱动模块移植到Android系统中。通过adb等工具将驱动模块传输到Android设备上,并将其加载到内核中,使得系统能够识别并正确控制硬件设备。 需要注意的是,Android内核驱动移植过程中可能会遇到各种问题,例如硬件兼容性、驱动与内核版本不匹配等。因此,在移植过程中需要仔细分析和解决这些问题,确保驱动移植成功并能够正常工作。 综上所述,Android内核驱动移植是一项复杂的工作,需要对目标设备的硬件接口有深入理解,并进行相关的修改和适配,最终使得设备能够在Android系统中正常运行。 ### 回答3: Android内核驱动移植是指将一个设备的硬件驱动程序从一个硬件平台(如手机、板卡)移植到另一个硬件平台上,以使设备能够在新的硬件平台上正常工作。 移植Android内核驱动的过程包括以下几个步骤: 1. 硬件分析:首先,需要对目标硬件进行详细的分析,包括内部的组件、接口等。根据硬件的特点,了解所需移植的驱动程序。 2. 源代码准备:在移植过程中,需要准备源代码,包括Android内核和相关的驱动程序。确保源代码的版本与目标硬件的兼容性。 3. 驱动程序移植:根据目标硬件的需求,对原有的驱动程序进行修改。这可能包括修改硬件接口、端口或中断处理程序,以适配新的硬件平台。 4. 编译和测试:完成驱动程序的移植后,需要进行编译和测试。确保驱动程序在新的硬件平台上能够正确运行,与其他系统组件相互协调。 5. 修复问题和优化:在测试过程中可能会出现问题,需要进行修复和优化。这可能包括调整配置参数、修复驱动程序中的错误或与其他组件的兼容性问题。 移植Android内核驱动可以使不同型号的设备在使用相同版本的Android系统时,能够充分发挥其硬件的功能。同时,也可以支持新的硬件平台加入到Android生态系统中,为用户提供更多的选择。 需要注意的是,Android内核驱动移植是一个复杂的过程,需要掌握相关的技术和知识。对于一些特殊的设备,可能需要进行更多的工作和定制。因此,在进行移植之前,要充分了解目标硬件的特性和要求,保证移植的成功和稳定性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值