有以下三點區別:
1、Android沒有本地窗口系統,而Linux是有X窗口系統。
2、Android沒有glibc支持,而Linux是有glibc支持的。
3、Android是有自己專有的驅動程序。
雖然Android基於Linux內核,但是它與Linux之間還是有很大的差別。
(1)androidnandflash擴展閱讀
Android專有的驅動程序
1、Android Binder 基於OpenBinder框架的一個驅動,用於提供 Android平台的進程間通信(InterProcess Communication,IPC)功能。源代碼位於drivers/staging/android/binder.c。
2、Android電源管理(PM) 一個基於標准Linux電源管理系統的輕量級Android電源管理驅動,針對嵌入式設備做了很多優化。源代碼位於:
kernel/power/earlysuspend.c
kernel/power/consoleearlysuspend.c
kernel/power/fbearlysuspend.c
kernel/power/wakelock.c
kernel/power/userwakelock.c
3、低內存管理器(Low Memory Killer) 比Linux的標準的OOM(Out Of Memory)機制更加靈活,它可以根據需要殺死進程以釋放需要的內存。源代碼位於 drivers/staging/ android/lowmemorykiller.c。
4、匿名共享內存(Ashmem) 為進程間提供大塊共享內存,同時為內核提供回收和管理這個內存的機制。源代碼位於mm/ashmem.c。
5、Android PMEM(Physical) PMEM用於向用戶空間提供連續的物理內存區域,DSP和某些設備只能工作在連續的物理內存上。源代碼位於drivers/misc/pmem.c。
6、Android Logger 一個輕量級的日誌設備,用於抓取Android系統的各種日誌。源代碼位於drivers/staging/android/logger.c。
7、Android Alarm 提供了一個定時器,用於把設備從睡眠狀態喚醒,同時它還提供了一個即使在設備睡眠時也會運行的時鍾基準。源代碼位於drivers/rtc/alarm.c。
8、USB Gadget驅動 一個基於標准 Linux USB gadget驅動框架的設備驅動,Android的USB驅動是基於gaeget框架的。源代碼位於drivers/usb/gadget/。
9、Android Ram Console 為了提供調試功能,Android允許將調試日誌信息寫入一個被稱為RAM Console的設備里,它是一個基於RAM的Buffer。源代碼位於drivers/staging/android / ram_console.c。
10、Android timed device 提供了對設備進行定時控制的功能,目前支持vibrator和LED設備。源代碼位於drivers/staging/android /timed_output.c(timed_gpio.c)。
參考資料:網路——Android
網路——linux
⑵ android 模擬器怎麼模擬nmea
Android中提供了一個模擬器來模擬ARM核的移動設備。Android的模擬器是基於QEMU開發的,QEMU是一個有名的開源虛擬機項目 ,它可以提供一個虛擬的ARM移動設備。Android模擬器被命名為goldfish,用來模擬包括下面一些功能的ARM SoC:
* ARM926ej-S CPU
* Thumb support
* MMC
* RTC
* Keyboard
* USB Gadget
* framebuffer
* TTY driver
* NAND FLASH
Android模擬器所對應的源代碼主要在external/qemu目錄下。如果你想將Android移植到其他設備上,熟悉它目前所針對的模擬器環境可以提供一些參考。
對於應用程序的開發者,模擬器提供了很多開發和測試時的便利。無論在Windows下還是Linux下,Android模擬器都可以順利運行,並且Google提供了Eclipse插件,可將模擬器集成到Eclipse的IDE環境。當然,你也可以從命令行啟動Android模擬器。
這款模擬器功能非常齊全,電話本、通話等功能都可正常使用(當然你沒辦法真的從這里打電話)。甚至其內置的瀏覽器和Google Maps都可以聯網。用戶可以使用鍵盤輸入,滑鼠點擊模擬器按鍵輸入,甚至還可以使用滑鼠點擊、拖動屏幕進行操縱。
當然模擬器畢竟是模擬器,和真實的機子還是存在差別的,
android模擬器和真機的不同之處:
* 不支持呼叫和接聽實際來電;但可以通過控制台模擬電話呼叫(呼入和呼出)
* 不支持USB連接
* 不支持相機/視頻捕捉
* 不支持音頻輸入(捕捉);但支持輸出(重放)
* 不支持擴展耳機
* 不能確定連接狀態
* 不能確定電池電量水平和交流充電狀態
* 不能確定SD卡的插入/彈出
* 不支持藍牙
2、創建和啟動Android模擬器
要玩GPhone的模擬器,當然需要先去http://developer.android.com/sdk(如果打不開就用http://androidappdocs.appspot.com/sdk/index.html)上面下載Android 的SDK,解壓出來後在SDK的根目錄下有一個tools文件夾,裡面就是模擬器和一些非常有用的工具。(SDK詳細的安裝過程請參照 http://blog.csdn.net/magicyu2/archive/2009/11/02/4755747.aspx)
要正確的啟動模擬,你必須先要創建一個 AVD( Android Virtual Device 虛擬設備 ),你可以利用AVD創建基於不同版本的模擬器,下面就介紹如何創建AVD:
(1) 查看當前支持版本(在列出的版本中我們需要記住id值,這個值在第2步中使用):
magicyu@magicyu-desktop:~$ android list target
你可以看到幾個Available Android targets,比如:Name: Android 1.6,他們有各自的id號。
(2) 創建AVD:
magicyu@magicyu-desktop:~$ android create avd -n magicyu -t 2
-n後面接需要創建avd的名字,-t後面接需要創建虛擬器的類型,2即為步驟(1)中得到的類型id號。
(3) 查看是否創建成功(如果成功會顯示剛才我們創建的avd信息):
magicyu@magicyu-desktop:~$ android list avd
(4) 啟動模擬器:
magicyu@magicyu-desktop:~$ emulator @magicyu 或者
emulator -avd magicyu
其中@和-avd後接的是你創建過的avd名字
(5) 選擇啟動的皮膚
magicyu@magicyu-desktop:~$ emulator -avd magicyu -skin QVGA
skin後面接所要啟動皮膚的類型,所有的類型可以在/ platforms/android-1.*/skins目錄下找到,*為所指的版本。如在1.6版本的SDK下有HVGA,QVGA, WVGA800,WVGA854幾種。按Ctrl+F11,可以直接改變模擬器的橫縱擺放。
當然AVD也可以在Eclipse中創建和啟動。關於Eclipse+ADT+SDK的安裝請參見http://blog.csdn.net/magicyu2/archive/2009/11/02/4755747.aspx。
運行Eclipse,Window->Android SDK and AVD Manager,就能得到如下的界面,選擇新建即可新建一個AVD。
3、Android模擬器的一些工具
(1)adb:
ADB(Android Debug Bridge)是Android 提供的一個通用的調試工具,藉助這個工具,我們可以管理設備或手機模擬器的狀態還可以進行以下的操作:
a、快速更新設備或手機模擬器中的代碼,如應用或Android系統升級;
b、在設備上運行shell命令;
c、管理設備或手機模擬器上的預定埠;
d、在設備或手機模擬器上復制或粘貼文件
一些常用的操作:
進入Shell: adb shell
通過上面的命令,就可以進入設備或模擬器的shell環境中,在這個Linux Shell中,你可以執行各種Linux 的命令,另外如果只想執行一條shell命令,可以採用以下的方式:
adb shell [command]
如:adb shell dmesg會列印出內核的調試信息。
(Android的linux shell做了大量精簡,很多linux常用指令都不支持)
上傳文件: adb push
下載文件: adb pull
安裝程序: adb install
卸載軟體: adb shell rm /data/app/
補充一點,通過adb安裝的軟體(*.apk)都在」/data/app/」目錄下,所以安裝時不必制定路徑,卸載只需要簡單的執行」rm」就行。
結束adb: adb kill-server
顯示android模擬器狀態:
adb devices (埠信息)
adb get-proct (設備型號)
adb get-serialno (序列號)
等待正在運行的設備: adb wait-for-device
埠轉發: adb forward adb forward tcp:5555 tcp:1234
(將默認埠TCP 5555轉發到1234埠上)
查看bug報告: adb bugreport
adb shell sqlite3 訪問資料庫SQLite3
adb shell logcat -b radio 記錄無線通訊日誌: 一般來說,無線通訊的日誌非常多,在運行時沒必要去記錄,但我們還是可以通過命令,設置記錄
應用程序配置文件:
「AndroidManifest.xml」中
「」
決定是否應用程序是否顯示在Panel上
(2)am指令(在shell內使用am來載入android應用):
am [start|instrument]
am start [-a ]
[-d ]
[-t ]
[-c [-c ] …]
[-e [-e ...]
[-n ] [-D] []
am instrument [-e ]
[-p ]
[-w]
啟動瀏覽器:
am start -a android.intent.action.VIEW -d http://www.google.cn/
撥打電話:
am start -a android.intent.action.CALL -d tel:10086
啟動google map直接定位到北京:
am start -a android.intent.action.VIEW geo:00?q=beijing
(3)為模擬器加上SD卡:
emulator -sdcard dcard.img
下面我們再來說說如何創建」sdcard.img」文件:
「tools」目錄下還有另外一個很好用的工具mksdcard,一看名字就知道——make sdcard。對,就用它來創建一個「SD卡」。
命令為:
mksdcard 1024M D:dcard.img
OK這樣一個容量為1G的SD卡就創建完畢了。
使用SDCard:
創建: mksdcard
(bytes(default),K,M)
連接到模擬器: emulator -sdcard
傳文件到SDCard: adb push
(4)Android模擬器打電話發簡訊
GPhone的模擬器有個特有的號碼:15555218135,這個就類似我們實體手機的SIM卡號碼啦。要實現撥號,用手機?當然不行!
更簡單,三步:
1.打開終端
2.連接: telnet localhost 5554(5554是你打開模擬器後上面顯示的數字)
3.命令:gsm call 15555218135
look!是不是模擬器上顯示來電了?接聽/掛斷和實體手機一樣。
發簡訊也一樣簡單,重復上面1,2兩步,第三部命令改一下:
sms send 15555218135 Hellothis is a Message.
4、Android模擬器主要命令參數介紹
emulator [- []] … [-]
下面的表總結了可用的參數
Help
-help列印模擬器參數列表。
-help-all列印所有啟動參數明細。
-help-列印指定啟動參數的信息。
-help-debug-tags列印所有被-debug 打開的列表。
-help-disk-images列印正在使用的磁碟鏡像信息。
-help-environment列印模擬器環境變數信息。
-help-keys列印當前的鍵盤映射。
-help-keyset-file列印一個自定義的鍵盤映射文件的定義。
Disk Images
-cache 使用 指定網路緩存分區鏡像。
自定義,您可以指定一個當前工作目錄的相對路徑。如果沒有指定緩存文件,模擬器會指定一個零時文件作為緩存文件。更多信息請參考-help-disk-images.
-data 使用作為用戶數據磁碟鏡像。
自定義,您可以指定一個當前工作目錄的相對路徑。如果-data沒有被使用,模擬器會在指定的目錄下尋找名叫」userdata-qemu.img」的鏡像文件。默認情況下,模擬器會尋找~/.android (on Linux/Mac)或者C:Documents and Settings/Local SettingsApplication DataAndroid (on Windows)。
如果您使用了-data ,但是文件並不存在,模擬器將創建同名文件。
更多信息請參見運行多個模擬器實例和-help-disk-images。
-image 使用作為系統鏡像。
自定義,您可以指定一個當前工作目錄的相對路徑。默認為/system.img。
-initdata
重寫用戶數據鏡像時,(使用 -wipe-data),復制此文件內容到新用戶數據文件鏡像中。默認方式下,模擬器拷貝/userdata.img。
自定義,您可以指定一個當前工作目錄的相對路徑。參見-wipe-data。
更多信息請參見-help-disk-images。
-kernel 使用作為模擬器內核。自定義,您可以指定一個當前工作目錄的相對路徑。
-nocache啟動模擬器時無緩存分區。參見-cache 。
-ramdisk 使用作為虛擬內存鏡像。默認為/ramdisk.img. 自定義,您可以指定一個當前工作目錄的相對路徑。更多信息請參見-help-disk-images。
-sdcard 使用作為SD卡鏡像。默認為/sdcard.img. 自定義,您可以指定一個當前工作目錄的相對路徑。更多信息請參見-help-disk-images。
-system 在指定的下搜索系統、虛擬內存和用戶數據鏡像文件。為當前路徑的相對目錄。
-wipe- data重至用戶數據鏡像文件。(that is the file specified by -datadir and -data or the default file). 模擬器刪除所有用戶數據,然後復制右-inidata參數指定的數據到鏡像文件,在啟動之前。參見-initdata. 更多信息請參見-help-disk-images。
Debug
-debug 開啟/關閉指定tag的調試信息。
是一個被空格/逗號/縱列所分割的調試組建名稱列表。更多信息參見-help-debug-tags。
-debug-開啟/關閉指定tag的調試信息。使用-help-debug-tags獲得您可以指定為的調試組件列表。
-debug-no-關閉指定tag的調試信息。
-logcat 打開指定tag的日誌輸出。如果環境變數ANDROID_LOG_TAGS被指定且不為空,她的值將成為日誌輸出的默認值。
-shell創建一個擁有root許可權的命令行窗口。即使模擬器的UI界面無法使用了,您依然可以使用命令行窗口。按Ctr-c鍵中斷模擬器運行。
-shell-serial 打開具有root許可權的腳本窗口。必須是一個QEMU類型的設備。參見』serial -dev』在 http://www.bellard.org/qemu/qemu-doc.html#SEC10上關於設備類型的列表信息。這兒有一些例子:
· -shell-serial stdio is identical to -shell
· -shell-serial tcp::4444servernowait 讓您的shell可以通過4444埠通訊。
· -shell-serial fdpair:3:6 讓模擬器可以使用3 (in)和6(out)磁碟機。
· -shell-serial fdpair:0:1 uses the normal stdin and stdout fds except that QEMU won』t tty-cook the data.
-show-kernel 顯示內核信息。
-trace Enable code profiling (press F9 to start) written to a specified file.
-verbose 開啟冗長輸出。Equivalent to -debug-init. 您可以定義ANDROID_VERBOSE環境變數作為冗長輸出參數。定義你想用到的參數,用逗號分割。這樣可以省略像-debug-這樣的參數。下面是一個設置ANDROID_VERBOSE的例子,它帶有-debug-init和 -debug-modem 參數:
ANDROID_VERBOSE=initmodem更多信息參見.
Media
-audio 使用指定的音頻後端。
-audio-in 使用指定的音頻輸入後端。
-audio-out 使用指定的音頻輸出後端。
-noaudio在當前虛擬機實例中關閉音頻支持。
-radio 重新定向收音機介面到本地的位元組設備。
-useaudio打開模擬器實例的音頻支持。默認為打開。
Network
-dns-server 使用指定的DNS伺服器。必須是以逗號分割,多於4個的伺服器名或IP地址。
-http-proxy 配置TCP連接使用HTTP/HTTPS代理。
必須符合以下格式:http://:
http://:@: 前綴http://可以被忽略。如果-http-proxy 未被指定,模擬器將尋找http_proxy環境變數,並且自動尋找所有符號格式要求的 值。
-netdelay 設置網路延遲默認值為none。參見Network Delay Emulation中關於的值。
-netfast快捷的 -netspeed full -netdelay none
-netspeed 指定模擬器網路速度為.默認值為full。參見表格Network Speed Emulation 中的值。
-port 指定模擬器網路埠為.控制台埠號必須介於5554和5584之間,並且+1必須留作ADB使用。
-report-console 啟動前向第三方同志此模擬器實例的網路埠。 必須是以下幾種格式
tcp:[server][max=]
unix:[server][max=]
更多信息參見 -help-report-console
System
-cpu-delay 降低模擬器CPU的速度到。支持0到100的整數。注意與具體的時鍾或其他的絕對頻率無關。它只表現為一種抽象的,相對於當前模擬器運行狀況的速度調節。
-gps 重定向NMEA GPS到位元組設備。
使用此參數通知模擬器模擬一個NMEA-compatible GPS,連接到一個擴展的設備或socket埠。格式必須符合QEMU-specific所指定的設備格式。更多信息參見』serial -dev』 和 http://www.bellard.org/qemu/qemu-doc.html#SEC10.
-nojni在Dalvik運行時關閉JNI檢查
-qemu傳遞參數到qemu。
-qemu -h關閉qemu幫助。
-radio 重定向錄音機模塊到制定的字元設備。格式必須符合QEMU規定的序列設備。詳情參見http://www.bellard.org/qemu/qemu-doc.html#SEC10.
-timezone 設定模擬器時區為,替換為系統時區。必須按照時區格式指定。比如:」America/Los_Angeles」,」Europe/Paris」
-version顯示模擬器版本號。
UI
-dpi-device 修改模擬器的解析度適配物理設備。默認值為165。參見-scale.
-no-boot-anim關閉模擬器啟動時的動畫。禁用啟動動畫可以加快啟動速度。
-no-window關閉模擬器的繪制窗口。
-scale 調整模擬器窗口。 是介於0.1到3的數字,它是調整屏幕的比例因子。您也可以指定一個DPI值,在添加dpi前綴的情況下。Auto參數告訴模擬器選擇自己最合適的尺寸。
-raw-keys關閉Unicode鍵盤reverse-mapping.
-noskin不使用任何模擬器皮膚。
-keyset 用指定的鍵盤設置文件代替默認。指定宿主鍵盤和模擬器之間的鍵盤映射文件。更多信息參見-help-keyset。
-onion 用圖片覆蓋屏幕。不支持JPEG,只支持PNG
-onion-alpha 指定onion皮膚透明值(百分比) 默認為50.
-onion-rotation 指定onion皮膚旋轉。 必須是 0 1 2 3中的一個。
-skin 啟動模擬器,搭配指定皮膚。
-skindir 在指定目錄下搜索皮膚
⑶ linux和android的區別
雖然Android基於Linux內核,但是它與Linux之間還是有很大的差別,比如Android在Linux內核的基礎上添加了自己所特有的驅動程序。下面我們就來分析一下它們之間究竟有什麼關系?
android是否能稱為一種新的操作系統呢?至少我自己認為不算是,它最多算作一個新的應用程序罷了。
一、Android為什麼會選擇Linux
成熟的操作系統有很多,但是Android為什麼選擇採用Linux內核呢?這就與Linux的一些特性有關了,比如:
1、強大的內存管理和進程管理方案
2、基於許可權的安全模式
3、支持共享庫
4、經過認證的驅動模型
5、Linux本身就是開源項目
更多關於上述特性的信息可以參考Linux 2.6版內核的官方文檔,這便於我們在後面的學習中更好地理解Android所特有的功能特性。接下來分析Android與Linux的關系。
二、Android不是Linux
看到這個標題大家可能會有些迷惑,前面不是一直說Android是基於Linux內核的嗎,怎麼現在又不是Linux了?迷惑也是正常的,請先看下面幾個要點,然後我們將對每一個要點進行分析,看完後你就會覺得Android不是Linux了。
因為它沒有本地窗口系統,沒有glibc的支持,而且並不包括一整套標準的Linux使用程序,同時增強了Linux以支持其特有的驅動。
1.它沒有本地窗口系統
什麼是本地窗口系統呢?本地窗口系統是指GNU/Linux上的X窗口系統,或者Mac OX X的Quartz等。不同的操作系統的窗口系統可能不一樣,Android並沒有使用(也不需要使用)Linux的X窗口系統,這是Android不是Linux的一個基本原因。
我很奇怪的是linux的Xwindow並不是其核心程序,你可以看到很多嵌入式linux根本不會用到這個圖形界面系統,而手機上的android不使用Xwindow不是很正常嗎?我們學習的時候用QT難道就不叫做linux系統了么?
2.它沒有glibc支持
由於Android最初用於一些便攜的移動設備上,所以,可能出於效率等方面的考慮,Android並沒有採用glibc作為C庫,而是Google自己開發了一套Bionic Libc來代替glibc。
庫文件不同,好吧,因為移植顯然是要修改庫文件和頭文件的吧,求指教
3.它並不包括一整套標準的Linux使用程序
Android並沒有完全照搬Liunx系統的內核,除了修正部分Liunx的Bug之外,還增加了不少內容,比如:它基於ARM構架增加的Gold-Fish平台,以及yaffs2 FLASH文件系統等。
4.Android專有的驅動程序
除了上面這些不同點之外,Android還對Linux設備驅動進行了增強,主要如下所示。
1)Android Binder 基於OpenBinder框架的一個驅動,用於提供 Android平台的進程間通信(InterProcess Communication,IPC)功能。源代碼位於drivers/staging/android/binder.c。
2)Android電源管理(PM) 一個基於標准Linux電源管理系統的輕量級Android電源管理驅動,針對嵌入式設備做了很多優化。源代碼位於:
kernel/power/earlysuspend.c
kernel/power/consoleearlysuspend.c
kernel/power/fbearlysuspend.c
kernel/power/wakelock.c
kernel/power/userwakelock.c
如果給內核添加驅動也可以稱之為不同的話?
3)低內存管理器(Low Memory Killer) 比Linux的標準的OOM(Out Of Memory)機制更加靈活,它可以根據需要殺死進程以釋放需要的內存。源代碼位於 drivers/staging/ android/lowmemorykiller.c。
4)匿名共享內存(Ashmem) 為進程間提供大塊共享內存,同時為內核提供回收和管理這個內存的機制。源代碼位於mm/ashmem.c。
5)Android PMEM(Physical) PMEM用於向用戶空間提供連續的物理內存區域,DSP和某些設備只能工作在連續的物理內存上。源代碼位於drivers/misc/pmem.c。
6)Android Logger 一個輕量級的日誌設備,用於抓取Android系統的各種日誌。源代碼位於drivers/staging/android/logger.c。
7)Android Alarm 提供了一個定時器,用於把設備從睡眠狀態喚醒,同時它還提供了一個即使在設備睡眠時也會運行的時鍾基準。源代碼位於drivers/rtc/alarm.c。
8)USB Gadget驅動 一個基於標准 Linux USB gadget驅動框架的設備驅動,Android的USB驅動是基於gaeget框架的。源代碼位於drivers/usb/gadget/。
9)Android Ram Console 為了提供調試功能,Android允許將調試日誌信息寫入一個被稱為RAM Console的設備里,它是一個基於RAM的Buffer。源代碼位於drivers/staging/android / ram_console.c。
10)Android timed device 提供了對設備進行定時控制的功能,目前支持vibrator和LED設備。源代碼位於drivers/staging/android /timed_output.c(timed_gpio.c)。
11)Yaffs2 文件系統 Android採用Yaffs2作為MTD nand flash文件系統,源代碼位於fs/yaffs2/目錄下。Yaffs2是一個快速穩定的應用於NAND和NOR Flash的跨平台的嵌入式設備文件系統,同其他Flash文件系統相比,Yaffs2能使用更小的內存來保存其運行狀態,因此它佔用內存小。Yaffs2的垃圾回收非常簡單而且快速,因此能表現出更好的性能。Yaffs2在大容量的NAND Flash上的性能表現尤為突出,非常適合大容量的Flash存儲。
⑷ android webcam模塊
一鍵燒寫本質上是啟動位於SD卡中的Uboot,通過uboot讀取sd卡中的文件到SRAM最後通過nand指令實現一鍵燒寫,這一塊可以參考提供的uboot源碼中include\configs 中的smdk6410.h 的529行,代碼如下:
代碼1:
復制代碼
#elif defined(FORLINX_BOOT_SD)
#define FORLINX_DEBUG
#define CONFIG_MMC 1
#define CONFIG_LCD
#define CONFIG_BOOT_MOVINAND
#define CFG_ENV_IS_IN_MOVINAND
#define CONFIG_BOOTCOMMAND "nand led-start;nand erase ;fatload mmc 0:1 0x50008000 u-boot.bin;nand write.uboot 0x50008000 0 0x200000;fatload mmc 0:1 0x50008000 zImage;nand write.e 0x50008000 0x200000 0x500000; fatload mmc 0:1 0x50008000 rootfs.yaffs2; nand write.yaffs2 0x50008000 0x00700000 $filesize; nand beep; nand led-end"
復制代碼
從這段代碼代碼可以看出,uboot中通過宏定義的方式,當定義為FORLINX_BOOT_SD 式通過對相應配置相應的環境變數完成特定的操作,其中定義CONFIG_BOOTCOMMAND 後就可以自動進行nand的查處,從sd卡載入uboot等,這段代碼內容稍後繼續分析。
下面說一下tftp和地址相關的知識總結
tftp是指通過tftp協議通過網路的方式進行文件傳輸,需要說明的是ok6410的出廠uboot是不支持網路的,這也就意味著nfs根文件系統以及通過tftp下載內核等都無法操作,其實解決這個問題也很簡單,只需要替換網卡相關的文件就可以了,改動不是很大,這個可以找到很多資料,這里不再贅述。不過飛凌在12年9月的更新光碟中已經做了更新,uboot已經支持網路操作了,查一下源碼也就是改了那幾個文件,因此可以下載燒寫最新版uboot。
在進行tftp的操作時最開始可能容易搞混的就是燒寫內核啥的應該燒寫到哪一個地址去,最開始也有點混,比如有人的博客里是tftp c0008000 zImage 這個地址是c0008000,國嵌的視頻教程中是c0800000,各不相同,沒看到具體的敘述,而在通過usb等方式中通過usb傳送的地址是50008000,因此可能會存在混亂,因此覺得有必要在博客中總結一下。關於地址空間的分配首先還需要看一下晶元手冊。晶元手冊中關於地址空間的安排如圖所示。
image
有一點需要說明的是,圖中的地址空間是針對通過地址匯流排與數據匯流排進行操作的設備的,通過不同的片選信號來確定對應的地址,所以可以通過圖中查表可以確定ok6410的256M RAM的地址范圍為0x50000000-0x5FFFFFFF 256M的地址空間,因此通過tftp下載到0x50008000也就是載入到RAM中(向後偏移了32K的地址,稍後在介紹)。到這兒對於0x50008000這個地址的由來就初步了解了。
再來看看很多資料中都提到的0xc0008000這個地址,smdk6410.h這個文件的501行可以找到這部分配置:
代碼2
復制代碼
//uboot-2M ,zImage-5M ,FS-200M,user-other
#define CFG_NAND_ERASE_LEN 0xCF00000 //200MB
#if defined(FORLINX_BOOT_NAND)
#define CONFIG_BOOT_NAND
#define CFG_ENV_IS_IN_NAND
//#define CFG_NAND_LARGEPAGE_SAVEENV
//#define CFG_NAND_FLASH_BBT
#define CONFIG_BOOTCOMMAND "nand read 0xc0008000 0x200000 0x500000;bootm 0xc0008000"
復制代碼
這部分定義了nand flash的地址空間劃分和啟動的地址:bootm 0xc0008000,也就是說是從內存中的這個地址啟動內核的,但問題是在上圖的地址劃分中地址最大值也只到0x6FFFFFFF,0xc0008000這個地址是什麼地方呢?一樣從源碼入手,繼續找!
同樣從smdk6410.h這個文件的452行可以找到這部分配置。
代碼3
復制代碼
/* base address for uboot */
#ifdef CONFIG_ENABLE_MMU
#define CFG_UBOOT_BASE TEXT_BASE
#define CFG_PHY_UBOOT_BASE (MEMORY_BASE_ADDRESS + (TEXT_BASE - 0xC0000000))
#else
#define CFG_UBOOT_BASE TEXT_BASE
#define CFG_PHY_UBOOT_BASE TEXT_BASE
#endif
復制代碼
看了這段代碼就明白了,在使能了MMU之後,這段代碼相當於對地址做了一個重映射,經過(MEMORY_BASE_ADDRESS + (TEXT_BASE - 0xC0000000))計算後,因為MEMORY_BASE_ADDRESS 為0x50000000(可以在文件開始找到定義)所以經過這樣的一個計算,0xc0008000就是0x5000c000。而0xc0008000是內核啟動的起始虛擬地址,因此需要做這樣的一個映射來和內核對應。
到這兒可能很多人和我當初有一樣的疑惑,那就是如果tftp燒寫文件系統應該燒寫到哪一個地址去呢?在回到上面的地址圖表,在最開始我就說過,這個表是針對使用地址匯流排與數據匯流排操作的設備而言,因此對於NOR flash、SRAM、DRAM等都是可以直接定址讀寫的,而對於Nand Flash,可以參考下電路圖,使用的是8個IO進行操作,右Nand控制器彎沉相關的操作,因此是沒有一個絕對的地址的。需喲啊注意圖表中的黃色框部分,One Nand並不是普通Nand Flash,區別就在於這種Nand是和NOR、SRAM一樣的通過地址匯流排、數據匯流排進行操作的方式,因此它是有地址的,對於板子所用的Nand Flash來說只有偏移地址,沒有絕對地址。
到這里,對於tftp下載內核、文件系統的相關操作應該清楚了,具體地址其實看看uboot源碼就清楚了,可以參考代碼1中的這部分:
#define CONFIG_BOOTCOMMAND "nand led-start;nand erase ;fatload mmc 0:1 0x50008000 u-boot.bin;nand write.uboot 0x50008000 0 0x200000;fatload mmc 0:1 0x50008000 zImage;nand write.e 0x50008000 0x200000 0x500000; fatload mmc 0:1 0x50008000 rootfs.yaffs2; nand write.yaffs2 0x50008000 0x00700000 $filesize; nand beep; nand led-end"
如果通過sd卡啟動時跳過自動操作進入手動選擇操作的話就應該有印象,可以單獨選擇燒寫某一個文件,例如單獨燒寫文件系統,操作如下圖所示:
SNAGHTML1ac3bff
那麼通過找到對應的命令源碼也是可以的,源碼位於common/mian.c 343行:
復制代碼
void arm_USBfuse(void)
{
unsigned char select;
while(1)
{
printf("\n##### Select the fuction #####\n");
printf("[1] Flash u-boot\n");
printf("[2] Flash kernel\n");
printf("[3] Flash system\n");
printf("[4] Exit\n");
printf("Enter your Selection:");
select = getc();
printf("%c\n", select >= ' ' && select <= 127 ? select : ' ');
void arm_sdfuse(void)
{
unsigned char select;
while(1)
{
printf("\n##### flash from SDcard #####\n");
printf("\n##### Select the fuction #####\n");
printf("[1] Flash all image\n");
printf("[2] Flash u-boot\n");
printf("[3] Flash kernel\n");
printf("[4] Flash system\n");
printf("[5] Exit\n");
printf("Enter your Selection:");
select = getc();
printf("%c\n", select >= ' ' && select <= 127 ? select : ' ');
switch(select)
{
case '1':
ExecuteCmd("nand erase");
ExecuteCmd("fatload mmc 0:1 50008000 u-boot.bin");
ExecuteCmd("nand write.uboot 50008000 0 200000");
ExecuteCmd("fatload mmc 0:1 50008000 zImage");
ExecuteCmd("nand write.e 50008000 200000 500000");
ExecuteCmd("fatload mmc 0:1 50008000 rootfs.yaffs2");
ExecuteCmd("nand write.yaffs2 50008000 700000 $filesize");
break;
case '2':
ExecuteCmd("nand erase 0 200000");
ExecuteCmd("fatload mmc 0:1 50008000 u-boot.bin");
ExecuteCmd("nand write.uboot 50008000 0 200000");
break;
case '3':
ExecuteCmd("nand erase 200000 500000");
ExecuteCmd("fatload mmc 0:1 50008000 zImage");
ExecuteCmd("nand write.e 50008000 200000 500000");
break;
case '4':
ExecuteCmd("nand erase 700000");
ExecuteCmd("fatload mmc 0:1 50008000 rootfs.yaffs2");
ExecuteCmd("nand write.yaffs2 50008000 700000 $filesize");
break;
case '5':
return;
default:
break;
}
}
}
復制代碼
通過tftp單獨燒寫內核或者文件系統時只需要參考一鍵燒寫的命令燒寫到對應的nand 偏移地址即可。
⑸ 開發板怎麼燒android系統
首先是友善之臂的Mini6410,它提供了兩種Boot,一種是移植的三星提供U-Boot1.1.6,這個版本不支持UBI文件系統的燒寫,他們自己做了個superboot,支持UBI,但是不開源,沒用過。
然後就是飛凌的OK6410,他們使用的也是三星提供的U-Boot,不支持UBI。所以想出另外的方式來燒寫。他們的燒寫使用了自己的 SD卡燒寫工具:SD_Writer,首先燒寫了一個mmc.bin和一個zImage-sd的文件到SD卡中,前者mmc.bin其實就是用於SD卡啟動的,後者zImage-sd是一個內核文件。我們首先來看看mmc.bin做了哪些事情,從SD卡啟動,進入U-Boot的下載模式,使用printenv列印環境變數,可得:
SMDK6410 # printenv
bootargs=rootdelay=0 console=ttySAC0,115200
bootcmd=nand erase;
fatload mmc 0:1 0x50008000 u-boot.bin;nand write.uboot 0x50008000 0 0x100000;
fatload mmc 0:1 0x50008000 zImage;nand write.e 0x50008000 0x100000 0x500000;
movi read kernel 0x50008000;bootm 0x50008000
從上面得bootcmd可以知道做的事情分四步:
1、擦除整個NAND Flash;
2、從SD卡中將u-boot.bin文件下載到內存中,然後燒寫到NAND Flash上;
3、從SD卡中將zImage下載到內存中,然後燒寫到NAND Flash上;
4、從SD卡讀取內核(不是上一步燒寫的zImage,而是之前使用SD卡燒寫工具燒寫的zImage-sd)到內存,然後啟動這個內核。而啟動參數就是上面的bootargs所顯示。
進入這個內核之後,就會進入下面這個命令行,
可能有人會覺得之前燒寫了U-Boot和zImage-sd到SD卡上,並沒有燒寫文件系統,那這個內核怎麼啟動呢?這里我們看一下命令提示符前面「initramfs」這幾個字元就明白了。
所有的2.6版本linux內核都有一個特殊的文件系統rootfs,是內核啟動的初始始根文件系統,initramfs的文件會復制到rootfs。如 果把initramfs比作種子,那麼rootfs就是它生長的土壤。大部分linux系統正常運行後都會安裝另外的文件系統,然後忽略rootfs。
這下大家就知道了吧,但是由於飛凌沒提供的源文件,所以不知道yjsx這個程序具體是啥,只能通過看燒寫的過程知道了,這里我就不貼了。主要做的工作就是把拷貝到SD卡中的文件系統燒寫到NAND Flash上,注意,這里他們燒寫的是yaffs格式,而不是ubi,我猜想他們僅僅是為了方便用戶使用SD卡燒寫(畢竟友善之臂的燒寫方式確實非常好),而不是使用ubi文件系統。
這里再來說一些Real6410和TQ6410,他們做法類似,Real6410是在NAND分區的時候分了兩個文件系統區,一個是cramfs,一個是真正用到的文件系統區。先啟動內核進入cramfs文件系統,將NAND格式化為UBI格式的,再進行燒寫。同樣,TQ6410也是先掛載NFS文件系統,將NAND格式化UBI,然後進行燒寫。
不過貌似TQ6410V2已經支持了UBI燒寫,這個還沒看。
⑹ android 怎麼看nand flash 大小
1. 查看當前系統的分區情況
$ adb shell
$ cat /proc/mtd
2. 分區對應的img(源碼編譯後生成在out/target/proct/xxx/目錄下)
a) modem(多個,支持電話和GPS)
amss.mbn
b) bootloader(啟動用)
appsboot.mbn
c) 空中升級
fota*(升級用, 可能多個)
d) 內核和文件系統
boot.img(內核和基本文件系統)
e) 系統分區
system.img(系統分區)
f) 用戶數據分區
userdata.img(數據分區)
3. 參考
⑺ android手機EMMC是什麼硬碟分區
android手機eMMC=NAND Flash+快閃記憶體控制晶元+標准介面封裝
就是在原有內置存儲器的基礎上,又額外加了一個控制晶元,最後再以統一的方式封裝,並預留一個標准介面,以便手機客戶拿來直接使用。這有點類似於聯發科的MTK,或者是高通的Snapdragon解決方案,手機終端廠商買的不只是一顆CPU,而是一整套方案。如此一來,操作簡化了不少,還避免了不同廠牌硬體之間的兼容性問題。上述3款產品之所以能夠在SD卡讀取一項中脫穎而出,靠的就是eMMC,當然使用eMMC內置存儲的不止這三家,近期給筆者留下比較深印象的、移動首款Android4.0雙核智能機--中興U970也屬於eMMC陣營的產品。
1、 手機的內置存儲讀取速度提升,到來的直接好處就是手機執行效率的提升。無論是播放音樂視頻,還是瀏覽網頁,以及最耗硬體資源的玩游戲,在處理器、RAM之外,所謂的ROM讀取速度也是相當重要的一項指標。
2、MMC協會董事會成員包括:ATP、華碩、Gemplus、惠普、英飛凌、Intel、Itri、Kingston、Lexar媒體公司、Micron科技、諾基亞、Power Digital Card、三星電子、Silicon Motion。在最新的eMMC4.5之後,eMMC新規格將由三星電子的UFS(Universal Flash Storage)主導,未來甚至還會把RAM封裝打包,三星在這方面罕有敵手。
3、
⑻ 關於安卓跟LINUX的關系~
Android 和 MOTO V8 的系統完全是兩個概念。
現在各個手機網站的編輯大腦都是嚴重萎縮的,根本就不能理解 Linux 是什麼。
Linux 僅僅是內核,根本就不是一個完整的操作系統。
一個完整的操作系統,包括內核,功能庫,用戶界面三個主要部分。一個應用程序,主要運行的並不是依靠內核來運行,它主要是藉助功能庫提供程序功能函數支持,用戶界面層提供顯示和交互的功能函數支持,內核只是一個硬體驅動交互,任務分配,內存管理,IO 處理的最底層的支持。
也就是說,一個程序能不能運行,主要是看函數庫和用戶界面的支持情況。
但很明顯的,Android 和 MOTO V8 完全是兩種實現方法,根本就不能拿來做比較。
Android 是基於叫做 Dalvik 的 java 虛擬機而運行的一個上層系統,所有的 Android 程序其實都是 java 程序,直接運行在這個 java 虛擬機裡面,Android 的程序根本就不是一個真實的二進製程序。
MOTO V8 我要沒記錯,是基於QT 嵌入式開發的一個系統,叫做 EZX Linux 。QT 提供了一個完整的函數庫和用戶界面支持庫。他的程序理論上都是手機上面可以運行的本地二進製程序(記得是 ARMv5 的)。但實際上,MOTO 不允許二進製程序的開發和安裝,只能用 java 程序,也就是 j2me 的程序。
雖然兩個都是虛擬機,但這兩個虛擬機本質完全不同。
Dalvik 的虛擬機是針對 Android 手機的基本要求,也就是要有一個觸摸屏,4個物理按鍵,內存和 CPU 性能都要求很高的硬體進行設計的。j2me 是針對的手機就沒有這個要求。不同的 j2me 手機和程序,都有不同的功能和性能。
可以說,Andorid 系統和 MOTO V8 的 EZX ,就算都用 Linux 內核,Linux 內核提供的硬體支持,功能支持等等的東西,在手機這種針對性極強的硬體上,也會出現不同的兼容問題。
他們兩個除了都是基於 Linux 內核這個稱呼以外,其餘的他們根本就完全不同。
Linux 從來就沒有說過「二進制兼容」,Linux 遵循 POSIX 標准,Linux 之間還有一個 LSB 兼容標准,但這個不是強制標准,而且在手機上根本就沒辦法執行的。
⑼ 買了一台安卓系統的車載導航一體機,看資料上說是DDR 1G和nand flash 8g,感覺內存還
運行的內存說是有1G,但畢竟系統肯定要消耗掉一部分的,8G的儲存,除去車機自帶的應用軟體,還剩5.6G也很正常的