July 20, 2009

「探索嵌入式 ARM 平台與 SoC 」Part I 簡報上線

上週六應 Study-Area 台北的邀請,進行主題為 [探索嵌入式 ARM 平台與 SoC ] 的演講/教育訓練,雖然主題較為冷僻,但前來指教的朋友們,還是將訓練教室塞滿,在此,相當感謝捧場與指導。目前簡報已上線,請參考以下連結: 仿造過去 [深入淺出 Hello World] 系列演講的模式,只要行有餘力,小弟將循序探討 ARM 架構與 SoC 的概念和實務,當然,這一切的演講/教育訓練,都維持免費且開放,只要您願意提出意見,我們可隨時調整方向與探討的細節。誠如前文提到的訓練宗旨:
    「探討如何從零到有設計完整的作業系統、如何進行必要的系統初始化、如何動手理解 ARM 的種種關鍵設計,且從軟體設計師的角度去切入」
在這個 "Everything goes mobile" 的時代,我們更在意知識的累積與多元轉換,可惜台灣人的工作環境,不免會基於某些考量,發生專業技能的「藏私」狀況,或多或少限制了視野的廣度與專業的深度。希望就能如去年在 [自由軟體教育訓練與演講規劃] 一文提到的項目,循序漸進分享與接受各方的指教,從而累積資訊技術知識。

此次 Part I 課程回顧:
  • ARM 架構
    • Architecture version vs. Implementation
    • ISA feature
  • ARM SoC 平台
    • 整合多種不同功能的複雜IC 組合,針對特定的市場或應用需求
    • 典型組成
  • 關鍵概念
    • 工作模式、暫存器組、系統狀態
    • 指令集、例外處理
而關於系列演講的 Part II,預定提綱針對系統控制,涵蓋以下:
  • ARM 定址與組合語言
  • PXA255 SoC 與 CuRT 的硬體啟動程序
  • ARM Interrupt, ISR, Exception的處理,解析 PSR
期待您的指教與討論,您的付出與關注,將使這一切變得更好,謝謝!
由 jserv 發表於 04:02 PM | 迴響 (8)

July 06, 2009

隱藏式取得動態函式庫的 C 函式實做

前文 [dlopen 的 _init 與 _fini] 與 [LD_PRELOAD 的應用] 提過 GNU/Linux 下,動態函式庫操作的技巧,可看到 dlopen(3), dlsym 搭配 _init/_fini 或自訂函式,達到攔截函式進入點的功能。那麼,是否能提供「隱藏式」的機制,讓原始程式碼不甚明顯,但執行時期也有同等功效呢?本文就要探討這樣的技巧。

實驗的目標是動態載入 libm.so 裡頭的 exp() 函式,並計算 e 的值,也就是呼叫 exp(1.0),這部份實做於 lookup(),有趣的是以下程式碼列表的 do_magic() 函式: (findsym.c)
#include <stdio.h>
#include <dlfcn.h>

extern void payload();
typedef double (*proto)(double);
proto _exp = (proto) (void *) &payload;

/* once no exp found, use this */
static double failback(double x) { return 0.0; }

static void lookup()
{
	void *handle = dlopen("libm.so", RTLD_LAZY);
	if (!handle) {
		fprintf(stderr, "E: unable to load libm\n" );
		_exp = (proto) (void *) &failback;
		return;
	}
	_exp = (proto) dlsym(handle, "exp");
	if (!_exp) {
		dlclose(handle);
		_exp = (proto) (void *) &failback;
		fprintf(stderr, "E: unable to find exp\n");
	}
}

static void do_magic() {
	__asm__ __volatile__ (
		"	.section .bss\n"
		"	.align  4\n"
	"external_ebp:	.type   external_ebp, @object\n"
		"	.size   external_ebp, 4\n"
		"	.text\n"
	"payload:\n"
		"	mov     %ebp, external_ebp\n"
		"	mov     %esp, %ebp\n"
		"	call    lookup\n"
		"	mov     external_ebp, %ebp\n"
		"	jmp     *_exp\n"
); }

int main()
{
	printf("e = %f\n", _exp(1.0));
	return 0;
}
透過調整 IA32 stack 的 %ebp,將變數 _exp 指向由 dlopen + dlsym 找出的 libm::exp() 位址,進一步跳躍到函式進入點,達到所設立的目標。參考的編譯與執行輸出:
$ gcc -o findsym{,.c} -O0 -ldl && ./findsym
e = 2.718282
由 jserv 發表於 05:43 PM | 迴響 (2)

July 03, 2009

演講:探索嵌入式 ARM 平台與 SoC

七月份,小弟將應 [Study-Area] 之邀,給予一場新的教育訓練,主題為「探索嵌入式 ARM 平台與 SoC 」,嘗試實現過去的一個小心願:以淺顯又直觀的方式,去探討 ARM architecture,以下是該議程相關資訊:
  • 議程簡介:雖然 ARM 嵌入式平台早已充斥於我們的日常生活,舉凡手機、導航系統等電子產品,但探討其原理架構的課程,往往有如英文諺語 "an arm and a leg" 背後的意思一般,所費不貲。講者嘗試整理過去幾年開發的心得,以心得分享的方式,免費介紹 ARM 硬體特性與原理,並以一個具體而微的 RTOS 開發,作為探索架構與軟體驗證的對象。
  • 建議聽者背景: (任一)
    • 已熟悉 C 語言程式設計,並參與過 ARM 平台軟體移植者
    • 對 ARM/RISC 架構開發有興趣者
    • 覺得只要有心,什麼都不是問題的熱血人士
  • 預定提綱:
    • ARM7/ARM9/ARM11 硬體架構快速瀏覽
    • ARM SoC 平台
    • 關鍵概念: 工作模式、暫存器組、系統狀態、指令集、例外處理、啟動程序
    • 作中學:從軟體工程師的角度去思考硬體行為
  • 時間:2009 年 07 月 18 日 (星期六)
    • 上午 09:00~12:00
    • 下午 13:30~17:00
    • 時間規劃: 6.5 hr
  • 地點:國立臺灣大學進修推廣部 - 304教室 (台北市羅斯福路四段107號,此地點位於羅斯福路上靠近基隆路口)
前文 [解析 CuRT 與嵌入式系統設計] 與 [CuRT - 精簡易懂的 RTOS] 曾提及舉辦免費 ARM 系統設計的想法,探討如何從零到有設計完整的作業系統、如何進行必要的系統初始化、如何動手理解 ARM 的種種關鍵設計。而從軟體設計師的角度,若能適時點出架構的特性,相信是個不錯的切入點,系統程式設計該是多麼有意思呢?關於本議程的討論與意見提交,請多利用 Study-Area 的論壇 [2009 七月份的 SA@Taipei - 探索嵌入式 ARM 平台與 SoC (07/18) ],期待您的指教,謝謝!
由 jserv 發表於 12:34 AM | 迴響 (2)

July 02, 2009

COSCUP 2009 即將到來

開源人年會2009

一年一度的 [COSCUP / 開源人年會] 即將於八月 15 與 16 兩日舉辦,在台灣各地社群共同舉辦之下,逐漸成長茁壯。今年大會有四個主題:
  • Android 和嵌入式系統
  • 雲端運算和 Web 技術
  • 開發者工具
  • 使用者桌面
據聞,因為講題投稿相當踴躍,主辦單位仍在思量,想必也如過往一般精彩可期。本次 [0xlab] 很榮幸能成為 COSCUP 贊助單位,並分享若干議程,涵蓋 Android 3D、Embedded 開發,與 Linux virtualization 等等。期待您的蒞臨指教,謝謝!

由 jserv 發表於 10:44 AM | 迴響 (0)