作者 主題: 2011 十二月份 SA@Tainan 用 Android 學習系統程式 12/24 (六)  (閱讀 18084 次)

0 會員 與 1 訪客 正在閱讀本文。

AirMan

  • SA 苦力組
  • 憂鬱的高中生
  • ***
  • 文章數: 94
    • 檢視個人資料
活動議題:
    Android 學習系統程式

議題簡介:
        自 2006 年起,講者分享了名為「深入淺出 Hello World」的系列演講後,獲得一些迴響與啟發,而隨著
        Android 裝置的普及與整體硬體的提昇後,實際在大量使用的裝置如智慧型手機上,做觀察、分析,進而研究系統程式的原理,已是相當便利。本議程可視為「深入淺出
        Hello World」的實務篇,企圖從觀察 ARM/Linux 的運作開始,延伸去年的演講主題「自己動手,豐衣足食 -- 淺談探索
        Linux 系統設計之道」,透過現有 Linux 核心與 Android 系統的若干機制,逐步揭開系統程式的面紗。   
議題大綱:
        (0) 握在手心的 Linux 核心: 工具與環境準備
        (1) 從 Hello World 等級的程式分析起
        (2) 探索記憶體模型、系統呼叫,與就在你身邊的「週邊」
        (3) 程式載入器的原理與追蹤
        (4) 核心與使用者層級程式的互動
備註:
        若想配合議程作實習,請準備一台已 root 過的 Android 裝置與裝有 GNU/Linux 的電腦

講師:
        jserv
講師簡介:
    Jim Huang (黃敬群),慣用網路暱稱為 "jserv",熱血工讀生。自 1999 年開始投入 open source 開發,於
        2005 年起提供相關的技術資訊服務,涉及手機、GPS 導航、數位電視、電子廣告系統、機器人等嵌入式系統設計。目前是 0xlab 與
        Linaro 開發者,並參與 Android Open Source Project 的開發工作。

時間:
        2011 年 12 月 24 日 (星期六)
        上午 10:30~12:00
        下午 1:30 ~ 4:30

地點:
        崑山科技大學 資訊科技學院 I5401教室 台南市永康區大灣路949號
        http://www.ksu.edu.tw/cht/introduction/map_inside.aspx
        若不知上課地點請跟著酷!學園旗幟走

地理位置/交通路線:
      台南火車站到崑山科技大學的公車:台南市公車2路公車路線圖 http://tinyurl.com/yfjyu2a
      提醒搭客運到台南的朋友,下車處是兵工廠停車場,請往台南火車站步行一段至火車站前圓環就有公車站。
      搭高鐵的朋友,欲搭乘大眾運輸系統,可搭乘H32公車,請參考此篇文章 http://hueimin0218.pixnet.net/blog/post/24063150


費用: 免費

活動報名網址:
     http://samc.study-area.org/registry/add/100

主辦單位:
      酷學園


協辦單位:
      台灣網路資訊中心(TWNIC) http://www.twnic.net.tw/
« 上次編輯: 2012-03-16 17:57 由 sakana »

thx

  • 鑽研的研究生
  • *****
  • 文章數: 510
    • 檢視個人資料
    • http://www.osslab.com.tw
這講座如果在台北應該會被秒殺..台北是不是缺場地阿?  如果有缺跟我講一下....

凍仁翔

  • 可愛的小學生
  • *
  • 文章數: 9
  • 性別: 男
    • 檢視個人資料
    • 凍仁的筆記
@thx 您就搭個車下來聽不就得哩 XDD
chusiang@study-area:~$ cat profile.txt
- 凍仁翔
- https://note.drx.tw

micmic3

  • 俺是博士!
  • *****
  • 文章數: 1692
    • 檢視個人資料
不過要 root 有點風險 XD

sakana

  • 酷!學園 學長們
  • 俺是博士!
  • *****
  • 文章數: 2588
  • 性別: 男
    • 檢視個人資料
    • sakananote
這講座如果在台北應該會被秒殺..台北是不是缺場地阿?  如果有缺跟我講一下....
幫您通知一下台北窗口
^^
感謝
專心投入研究才是王道!!
http://sakananote2.blogspot.com

thx

  • 鑽研的研究生
  • *****
  • 文章數: 510
    • 檢視個人資料
    • http://www.osslab.com.tw
台北窗口是那位now?

zzz0072

  • 懷疑的國中生
  • **
  • 文章數: 53
    • 檢視個人資料
請教一下NDK/SDK會不會用到?

sakana

  • 酷!學園 學長們
  • 俺是博士!
  • *****
  • 文章數: 2588
  • 性別: 男
    • 檢視個人資料
    • sakananote
台北窗口是那位now?
竹本 還有 威龍

^^
專心投入研究才是王道!!
http://sakananote2.blogspot.com

D-eye (大眼)

  • 可愛的小學生
  • *
  • 文章數: 4
  • 性別: 男
    • 檢視個人資料
    • My Plurk
台中很缺場地Orz

zzz0072

  • 懷疑的國中生
  • **
  • 文章數: 53
    • 檢視個人資料
再請教一下從台南火車站搭公車到校區大概幾分鐘?謝謝!

slime

  • 俺是博士!
  • *****
  • 文章數: 1692
    • 檢視個人資料
再請教一下從台南火車站搭公車到校區大概幾分鐘?謝謝!

搭公車可能 30 分鐘, 等公車可能再 30 分鐘 XD

可以的話建議找找
1. 國道客運, 有些從仁德交流道或永康交流道下, 再轉計程車.
2. 集合一些有同樣需求的網友, 在交流道附近共乘計程車或詢問其他網友是否順路可以搭車.
冷笑話: 我的 IP 是 127.0.0.1

wasami007

  • 可愛的小學生
  • *
  • 文章數: 7
    • 檢視個人資料
台中很缺場地Orz


在我能力範圍,台中要60人以上場地是有的,若需要請主動與我聯絡。

但請不要再需要時候才喊,請平常就來參與台中的小聚,培養社群默契並保持聯繫。



sakana

  • 酷!學園 學長們
  • 俺是博士!
  • *****
  • 文章數: 2588
  • 性別: 男
    • 檢視個人資料
    • sakananote
台中很缺場地Orz


在我能力範圍,台中要60人以上場地是有的,若需要請主動與我聯絡。

但請不要再需要時候才喊,請平常就來參與台中的小聚,培養社群默契並保持聯繫。
先謝謝支持
會請小飛機跟您連繫

^——^
專心投入研究才是王道!!
http://sakananote2.blogspot.com

jserv

  • 榮譽學長
  • 憂鬱的高中生
  • ***
  • 文章數: 161
  • 性別: 男
    • 檢視個人資料
    • jserv's homepage
議題簡介:
        自 2006 年起,講者分享了名為「深入淺出 Hello World」的系列演講後,獲得一些迴響與啟發,而隨著
        Android 裝置的普及與整體硬體的提昇後,實際在大量使用的裝置如智慧型手機上,做觀察、分析,進而研究系統程式的原理,已是相當便利。本議程可視為「深入淺出
        Hello World」的實務篇,企圖從觀察 ARM/Linux 的運作開始,延伸去年的演講主題「自己動手,豐衣足食 -- 淺談探索
        Linux 系統設計之道」,透過現有 Linux 核心與 Android 系統的若干機制,逐步揭開系統程式的面紗。   

感謝在寒冬前來捧場的朋友,當天議程的簡報檔案如下: (未整理)
    http://0xlab.org/~jserv/tmp/android-system-01.pdf

稍候會整理一份附有參考資訊與修正圖例的版本

Merry Xmas & Happy New Year!

星雨流痕

  • 可愛的小學生
  • *
  • 文章數: 4
    • 檢視個人資料
感謝昨天的分享   感覺收穫很多
謝謝

AirMan

  • SA 苦力組
  • 憂鬱的高中生
  • ***
  • 文章數: 94
    • 檢視個人資料
本次活動圓滿結束!!

謝謝大家的參與!

zzz0072

  • 懷疑的國中生
  • **
  • 文章數: 53
    • 檢視個人資料
感謝在寒冬前來捧場的朋友,當天議程的簡報檔案如下: (未整理)
    http://0xlab.org/~jserv/tmp/android-system-01.pdf

稍候會整理一份附有參考資訊與修正圖例的版本

Merry Xmas & Happy New Year!
感謝主講人的無私分享以及活動舉辦團隊的辛勞付出!

jserv

  • 榮譽學長
  • 憂鬱的高中生
  • ***
  • 文章數: 161
  • 性別: 男
    • 檢視個人資料
    • jserv's homepage
感謝演講結束後,仍有不少朋友指教與討論,小弟已經將更新的簡報放上來了,請參考:
    http://www.slideshare.net/jserv/discover-androidsystemfacilities/

補充說明:
    http://blog.linux.org.tw/~jserv/archives/2012/01/_android.html

謝謝!

zzz0072

  • 懷疑的國中生
  • **
  • 文章數: 53
    • 檢視個人資料
感謝各位大大的付出,整理一份當時抄的筆記,由於年代已久不可考,有些其實已經忘記當初要記的重點。
這份筆記主要是補充投影片中的東西和自己有興趣的內容,建議搭配投影片和紫皮書。另外我想應該很多錯
誤也請指正,謝謝!

[更正jserv大大的補充]

* Android IPC
   - Intent -> AIDL -> Binder
   - cat /sys/kernel/debug/binder 可以觀察相關資訊
   - Parcel打包概念
   - binder 是去shared memory 撈service
   - 所有service透過binder 相互聯繫

* Android debuggerd
   - Android 攔胡process segmentation fault signal,發生不正常錯誤時透過socket通知debuggerd
   - debuggerd在logcat中顯示的address是上次跑完的address
   - lr -> register for storing return address in ARM
   - 可以比照crash log和/proc/pid/maps
   -  參考:https://wiki.linaro.org/WorkingGroups/ToolChain/Outputs/LibunwindDebuggerd

* Dynamic linker/program interpreter
   - ls-linux.so.2 (Linux下)
   - 可執行
   - 同一個 root file system 底下可有兩個以上的 ELF interpreter
   - Android下面不同的版本/system/bin/linker的address可能不同
     + 安全性考量以及performance因素
   - X86
     + Entry: libc_start_main
     + library: libc
     + linker: ls-linux.so.2 (可以執行)
   - Android
     + Entry: __libc_init
     + library: bionic
     + linker: /system/bin/linker 
         - 沒有正確處理 stack & calling convention,會發生 SegFault

* bionic
   - __init_libc有static和dynamic 兩種方式
   - init process (pid 1 那個)用static,不可用malloc
   - 相關說明可以參考AOSP下面的文件(有點過期)
   - adbd 是static (?)
   - 看interpreter資訊
   - objdump -s -j .interp filename

* memory map of a process
   - cat /proc/pid/maps
     + 欄位說明:
         - address
         - perms
           + r = read
           + w = write
           + x = execute
           + s = shared
           + p = private (copy on write)
         - offset
         - dev
         - inode
         - pathname
   - 相同的path有兩個以上可能是text/data的差別
adb shell cat /proc/18696/maps (投影片剪貼)
00008000-00009000 r-xp 00000000 b3:02 8959       /data/local/hello
00009000-0000a000 rwxp 00001000 b3:02 8959       /data/local/hello
b0001000-b0009000 r-xp 00001000 b3:01 128        /system/bin/linker
b0009000-b000a000 rwxp 00009000 b3:01 128        /system/bin/linker
b000a000-b0015000 rwxp 00000000 00:00 0
beb07000-beb28000 rw-p 00000000 00:00 0          [stack]
ffff0000-ffff1000 r-xp 00000000 00:00 0          [vectors
   - heap是由address往後面增加
   - stack是由address往前面增加
   - 可以用來逆向以及trace程式

* ABI
   - readelf可以讀出來
$ readelf -h ../libs/armeabi/a
ELF Header:
  Magic:   7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00
  Class:                             ELF32
  Data:                              2's complement, little endian
  Version:                           1 (current)
  OS/ABI:                            UNIX - System V
  ABI Version:                       0
  Type:                              EXEC (Executable file)
  Machine:                           ARM
  Version:                           0x1
  Entry point address:               0x8540
  Start of program headers:          52 (bytes into file)
  Start of section headers:          7592 (bytes into file)
  Flags:                             0x5000002, has entry point, Version5 EABI
  Size of this header:               52 (bytes)
  Size of program headers:           32 (bytes)
  Number of program headers:         7
  Size of section headers:           40 (bytes)
  Number of section headers:         22
  Section header string table index: 21

   - eabi/oabi: e for embedded, o for old
   - 不同的ABI (包含ABI版本)對於data type的size定義有可能不同
     + sizeof (char)
         - EABI: 1
         - OABI: 4
     + sizeof (struct empty_struct{};)
        - EABI: 1
   - x86沒有ABI版本的問題
   - Embedded的ABI不同的原因可能是
     + 改板
     + 商業考量,故意讓其他產品不能相容
     + 效率
     + ref:   http://wiki.debian.org/ArmEabiPort
   - ARM EABI 基本上已大一統了

* Start a process
   - create a process
   - load executable file
   - setup runtime
   - page valid (?)

* Before Hello World..
   - UID/GID
   - Signal
   - load ld.so
   - mmap
   - random
   - load libstdc++.so
   - ...

* Android GDB
   - adb forward tcp:port tcp:port
   - symbol 可能在
   - ${PWD}/out/target/product/product_name/symbols/system/bin

* LD debug
   - export LD_DEBUG=files
   - LD_DEBUG=help /lib/ld-2.13.so

* Hear Say/忘記是記啥的
   - BUILD_ID
     + Issue tracking
         - 忘記講的是ELF還是AOSP/Cyanogenmod
   - NDK的進版本和Android SDK進板有關聯
   - mm -b => make clean; make
   - 有些elf執行檔沒有main的進入點
     + pypy
   - 2010年開始ELF加入build ID
   - abort()
   - ptrace
   - addr2line -e [file]
   - Android重寫了libc/linker,size減少,代價就是功能也減少
   - libunwind
   - ELF section的offset一般來說會和/proc/pid/maps會有點差別,主要是安全考量
   - ANR
     + Android Not Responding
     + 執行很久的程式碼,建議放在 Service 中
   - Android中把東西mix起來就叫flinger
     + Surface flinger
     + service flinger
     + ...

« 上次編輯: 2012-01-29 17:57 由 zzz0072 »

jserv

  • 榮譽學長
  • 憂鬱的高中生
  • ***
  • 文章數: 161
  • 性別: 男
    • 檢視個人資料
    • jserv's homepage
感謝各位大大的付出,整理一份當時抄的筆記,由於年代已久不可考,有些其實已經忘記當初要記的重點。
這份筆記主要是補充投影片中的東西和自己有興趣的內容,建議搭配投影片和紫皮書。另外我想應該很多錯
誤也請指正,謝謝!

感謝分享 :-)

考慮整理成 blog 或 wiki 嗎?今年我也會繼續探討 Android 其他部份的設計。

* Android IPC
   - Intent -> AIDL -> Binder
   - cat /sys/kernel/debug/binder 可以觀察相關資訊
   - Parcel打包概念
   - binder 是去shared memory 撈service
   - 所有service是由binder描述
把「描述」改為「相互聯繫」,會比較恰當。

* Android debuggerd
   - Android 攔胡process segmentation fault signal,發生不正常錯誤時透過socket通知debuggerd
   - debuggerd在logcat中顯示的address是上次跑完的address
   - lr -> register for storing return address in ARM
   - 可以比照crash log和/proc/pid/maps

參考:
https://wiki.linaro.org/WorkingGroups/ToolChain/Outputs/LibunwindDebuggerd

* Dynamic linker/program interpreter
   - ls-linux.so.2 (Linux下)
   - 可執行
   - 同一個OS下面可以放不同的interpreter

改為同一個 root file system 底下可有兩個以上的 ELF interpreter,會比較恰當。

   - Android
     + Entry: __libc_init
     + library: bionic
     + linker: /system/bin/linker (不可以執行)

/system/bin/linker 本身還是 ELF executable,當然可執行,但因為沒有正確處理 stack & calling convention,所以會發生 SegFault

* bionic
   - adbd 是static (?)

用 file 與 readelf 觀察看看 :-)

   - Embedded的ABI不同的原因可能是
     + 改板
     + 商業考量,故意讓其他產品不能相容
還有「效率」的考量,請進一步參考:
  http://wiki.debian.org/ArmEabiPort
現在 ARM EABI 基本上已大一統了。

* Start a process
   - create a process
   - load executable file
   - setup runtime
   - page valid (?)
下一階段的演講會針對這部份繼續探討 :-)

Thanks,
-jserv

zzz0072

  • 懷疑的國中生
  • **
  • 文章數: 53
    • 檢視個人資料

感謝分享 :-)

考慮整理成 blog 或 wiki 嗎?今年我也會繼續探討 Android 其他部份的設計。

如果有開放的Wiki的話我可以整理一份放上去。請問一下社群內常用(可以用的)Wiki是哪一個呢?

jserv

  • 榮譽學長
  • 憂鬱的高中生
  • ***
  • 文章數: 161
  • 性別: 男
    • 檢視個人資料
    • jserv's homepage

感謝分享 :-)

考慮整理成 blog 或 wiki 嗎?今年我也會繼續探討 Android 其他部份的設計。

如果有開放的Wiki的話我可以整理一份放上去。請問一下社群內常用(可以用的)Wiki是哪一個呢?

wikidot 不錯 -> http://www.wikidot.com/
不過先紀錄在 blog 再彙整到 wiki 也挺好的,總之,謝謝分享

thx

  • 鑽研的研究生
  • *****
  • 文章數: 510
    • 檢視個人資料
    • http://www.osslab.com.tw
不介意的話 二位大大可放這
http://www.osslab.com.tw/Hardware/Android

 ;D

另外Jserv 大..你的就等你的內容微修了..希望這幾天完成 麻煩你了  :)

zzz0072

  • 懷疑的國中生
  • **
  • 文章數: 53
    • 檢視個人資料
不介意的話 二位大大可放這
http://www.osslab.com.tw/Hardware/Android

 ;D

另外Jserv 大..你的就等你的內容微修了..希望這幾天完成 麻煩你了  :)

謝謝THX大大提供的資源,我放到您的URL了,之後有相關的Note會再更新
« 上次編輯: 2012-02-04 11:42 由 zzz0072 »