【Android-kernel】Android 核心改動

來源:互聯網
上載者:User

Google在核心裡做了什麼改動呢?

    有家公司專門比較了標準核心和android核心,發現google修改了75個檔案,增加了88個檔案。該公司還對這些被修改的和新增的檔案做了註解。

Goldfish -- 44 Files

kernel/arch/arm/mach-goldfish

kernel/include/asm-arm/arch-goldfish

Android模擬器運行了一個被google 叫做“金魚"的虛擬CPU.金魚運行arm926t指令集(arm926t是屬於armv5架構);並且模擬了輸入輸出:比如鍵盤輸入和LCD 輸出。這個模擬器其實是在qemu之上開發的,輸入輸出基於libSDL.

核心裡這個Goldfish介面實現了這個虛擬“金魚”CPU的一些介面,如果想在真實裝置上運行android,這些介面肯定要去掉的。

arm926ej的介紹見http://www.arm.com/products/CPUs/ARM926EJ-S.html

 

YAFFS2 -- 35 Files

kernel/fs/yaffs2

不同於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

Android核心還修改了進程調度和時鐘相關策略,這個改動就比較深入了。其目的和效果估計在一段時間後才能找到。

 

為android新增的功能 -- 28 files

除了修正一些bug以及其他的改動,android還增加了一些新的“子系統”,這些系統都比較重要。

 

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添加了一個功能,使得調試資訊可以輸入到一個記憶體塊中。此外,Android添加了一個獨立的日誌模組,這樣使用者空間的進程能夠讀寫日誌訊息,調試列印資訊等。

Android Debug Bridge

嵌入式裝置的調試的確比較麻煩。為了便於調試,google設計了這個調試工具,可以叫做"ADB",使用USB作為串連方式,ADB可以看作是連結android的裝置和PC機的一套協議。

Android 還添加了其他的東西,比如 real-time clock, switch,timed GPIO。

 

增加了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)

增加了switch處理, 相應的目錄為:

      kernel/drivers/switch/    

增加了一種新的共用記憶體處理方式, 相應增加的檔案為:

      kernel/mm/ashmem.c   

           
其他為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

 

Power Management -- 5 files

電源管理對於行動裝置來說相當重要,也是最複雜,開發難度最高的一個功能。Google添加了一個新的電源管理系統,並沒有原先apm,dpm等。

 

其他修改 -- 36 files

除了上述改動之外,還有一些小改動,比如新增的額外的調試功能, 鍵盤背光控制,TCP 網路管理等等,共涉及36個檔案。

 

根據上述,google對標準的核心做了很大的改動。相比其他的項目,比如Nokia N810,Openmoko等項目中,核心的改動僅僅是增加了某個平台的支援。所以移植最快也是最可能的辦法是在google使用的kernel上增加平台支援。

也有一些開發人員將google對2.6.25核心的改動做成補丁,直接打在自己開發的核心上——當然,自己的核心也應該是2.6.25,否則會出問題。

 

模擬器上的Kernel資訊

模擬器上kernel的資訊

運行emulator –show-kernel –avd <your avd name>

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的類比。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.