SlideShare una empresa de Scribd logo
1 de 14
嵌入式平台移植技巧概說
盧釔辰
Joseph Lu
Outline
• Freescale iMX6 porting流程
• 基本硬體知識
• 如何從上百隻程式中,找出系統執行的第一支主程式
• 尋找uboot 主程式
• 尋找編譯器載入檔 .lds
• 由makefile搜尋
• 追蹤系統程式碼常用指令與技巧
• U-Boot 流程概述
• 其餘工具介紹
2016/3/9 joseph78715@gmail.com 2
Freescale iMX6 porting 流程
• 我有整理資料如下,請自行參閱
https://hackpad.com/Freescale-iMX6-porting-EKoWlOejTiw
2016/3/9 joseph78715@gmail.com 3
基本硬體知識
• L1 Cache : 因為讀寫頻率極高,所以通常會採用速度較快的 SRAM
• L2 Cache , RAM : 因為成本考量,通常會使用讀寫速度較次一級的 DRAM
• Flash : 通常採用NAND Flash or NOR Flash
• NAND Flash 需要初始化 ( 不可放uboot 程式
,除非支援Stepping–stone ) ,且速度較慢但便宜
• NOR Flash 不須初始化 ( 可放uboot 程式 ),速度較快
P.S. 我們常聽到的記憶體(memory ) ,
其實是 Cache , RAM 的統稱
2016/3/9 4
速度比較 : SRAM > DRAM > > NOR Flash > NAND Flash
價格比較 : SRAM > DRAM > > NOR Flash > NAND Flash
基本硬體知識
• 1st stage boot loader 只能放在不須初始化即可使用的儲存空間。E.g.
1. 有支援 Stepping–stone 的 NAND Flash
• Stepping–stone :
• 三星專利。上電時硬體電路會抓取 NAND Flash 的前 128k ( 每顆 NAND 支援大小不一定 ),
放進 SRAM 中執行。
• 只要你的 uboot 程式有辦法在 128k 內完成 CPU , Memory 以及 NAND Flash 初始化 ,就可
以利用NAND Flash 開機 。
• 也因為 Stepping–stone 技術的出現,讓開發商不用特地買一塊貴貴小小的 NOR Flash 放
Bootloader 程式,而可以全部改用便宜的 NAND Flash 取代。
2. NOR Flash :
• NOR Flash 可以和 CPU pin-to-pin ,支援 XIP ( Execute in place )。不須初始化即可使用
2016/3/9 joseph78715@gmail.com 5
悲劇的嵌入式工程師
• 如果你覺得Uboot & kernel 的source code 動不動上千萬行,可能一輩子都看
不完
• 從 Linux kernel 4.1 以後,原始程式碼已衝到 2000 萬行的規模
• 而在u-boot & kernel 程式碼都沒 trace 完一遍的情形下,上司又要你在有限時
間內把OS porting 上去,根本超級悲慘兼毫無人性
時間就是金錢! 這是一個什麼都趕的時代
老闆趕出貨 , PM趕結案 , 於是
工程師趕羚羊
2016/3/9 joseph78715@gmail.com 6
千萬別這麼悲觀 , 因為 …
還有更可怕
更可怕
更可怕 的挑戰在等你
2016/3/9 joseph78715@gmail.com 7
更可怕的是…
在 OS sorce code 裡,不是每一行程式都會被編譯,而編譯了也不一定被連結,
連結了不一定被執行。
若沒搞清楚狀況,可能 trace 了好幾天的程式碼後,才發現該段程式碼根本
不會被執行,所以看了等於白看、改了等於白改 , …
2016/3/9 joseph78715@gmail.com 8
所以,如何從上千個檔案中,找出系統所
執行的第一個函式所在位置呢?
• 以尋找uboot 執行的第一支函式為例
 Sol 1 : 尋找編譯器載入檔 .lds
/board/$5/$4/u-boot.lds
cpu/$3/start.S
 Sol 2 : 由晶片商所提供的編譯 Uboot 的 makefile 中尋找
• 當我們找出第一個被執行的函式所在檔案,就可以順藤摸瓜找出系統會執行的第2
支、第3支被執行的函式,依序追蹤下去
2016/3/9 joseph78715@gmail.com 9
追蹤系統程式碼常用指令與技巧 (1/2)
• 欲搜尋Uboot執行第一支程式,可由找到編譯器載入程式 . lds 檔下手
• 做嵌入式要習慣隨便一找就找出幾百個同名檔案,此時就要依系統架構去判
斷,到底哪個才是你要用的
2016/3/9 joseph78715@gmail.com 10
追蹤系統程式碼常用指令與技巧 (2/2)
• Q : 想找某個變數在source code的哪些檔案的哪裡有出現?
• Ans : 請用正規表達式(Global Regular Expression) grep 搜尋。
2016/3/9 joseph78715@gmail.com 11
U-Boot 流程概述
• 切入 SVC 模式
• 只有svc mode可以修改硬體參數。進user mode ( kernel跑起來後 ) 就無法對硬體設定做修改
• 清除 I-Cache / D-Cache
• 為 MMU 相關暫存器設定初值
• 設定 peripheral bus 起點
• 初始化 CPU ( 設定 PLL ) 與記憶體 ( 設定 Tacc , Tacp ,... )
• 偵測 U-Boot 是放在NAND or NOR Flash
• 若放在NAND 則須將剩下的uboot程式copy到DRAM執行
• 若放在NOR 則不須複製到RAM,可直接執行。但一般為了效能考量仍會複製到RAM中
執行
• 初始化 MMU
• 初始化堆疊區
• 初始化 BSS 區
• 跳入第二階段的 start_armboot() 函數 :
• 跳離此處便不再回來,至此由ARM組語變為 C語言執行
2016/3/9 joseph78715@gmail.com 12
其餘工具介紹
• 程式除錯工具GDB & CGDB
• 我有整理資料如下,請自行參閱
https://hackpad.com/GDB-CGDB-7dUwpX8os7U
• 版本控制 Git
• 我有整理資料如下,請自行參閱
https://hackpad.com/Git-SVKqwqVxUNQ
2016/3/9 joseph78715@gmail.com 13
參考資料
• U-Boot 簡明概要
• http://teacherchi.tumblr.com/post/20112222844/u-boot-
%E7%B0%A1%E6%98%8E%E6%A6%82%E8%A6%81
2016/3/9 joseph78715@gmail.com 14

Más contenido relacionado

La actualidad más candente

tcpdumpとtcpreplayとtcprewriteと他。
tcpdumpとtcpreplayとtcprewriteと他。tcpdumpとtcpreplayとtcprewriteと他。
tcpdumpとtcpreplayとtcprewriteと他。(^-^) togakushi
 
Kubernetes雑にまとめてみた 2020年8月版
Kubernetes雑にまとめてみた 2020年8月版Kubernetes雑にまとめてみた 2020年8月版
Kubernetes雑にまとめてみた 2020年8月版VirtualTech Japan Inc.
 
RDB開発者のためのApache Cassandra データモデリング入門
RDB開発者のためのApache Cassandra データモデリング入門RDB開発者のためのApache Cassandra データモデリング入門
RDB開発者のためのApache Cassandra データモデリング入門Yuki Morishita
 
DockerとPodmanの比較
DockerとPodmanの比較DockerとPodmanの比較
DockerとPodmanの比較Akihiro Suda
 
エンジニアのためのOSSライセンス管理~OSS管理ツールの池の水全部抜く~
エンジニアのためのOSSライセンス管理~OSS管理ツールの池の水全部抜く~エンジニアのためのOSSライセンス管理~OSS管理ツールの池の水全部抜く~
エンジニアのためのOSSライセンス管理~OSS管理ツールの池の水全部抜く~Daisuke Morishita
 
20130203 OSS-DB Exam Silver 技術解説無料セミナー
20130203 OSS-DB Exam Silver 技術解説無料セミナー20130203 OSS-DB Exam Silver 技術解説無料セミナー
20130203 OSS-DB Exam Silver 技術解説無料セミナーKazuko Itoda
 
10分で分かるLinuxブロックレイヤ
10分で分かるLinuxブロックレイヤ10分で分かるLinuxブロックレイヤ
10分で分かるLinuxブロックレイヤTakashi Hoshino
 
Cgroupあれこれ-第4回コンテナ型仮想化の情報交換会資料
Cgroupあれこれ-第4回コンテナ型仮想化の情報交換会資料Cgroupあれこれ-第4回コンテナ型仮想化の情報交換会資料
Cgroupあれこれ-第4回コンテナ型仮想化の情報交換会資料KamezawaHiroyuki
 
0から始めるコンテナの学び方(Kubernetes Novice Tokyo #14 発表資料)
0から始めるコンテナの学び方(Kubernetes Novice Tokyo #14 発表資料)0から始めるコンテナの学び方(Kubernetes Novice Tokyo #14 発表資料)
0から始めるコンテナの学び方(Kubernetes Novice Tokyo #14 発表資料)NTT DATA Technology & Innovation
 
PFNのML/DL基盤を支えるKubernetesにおける自動化 / DevOpsDays Tokyo 2021
PFNのML/DL基盤を支えるKubernetesにおける自動化 / DevOpsDays Tokyo 2021PFNのML/DL基盤を支えるKubernetesにおける自動化 / DevOpsDays Tokyo 2021
PFNのML/DL基盤を支えるKubernetesにおける自動化 / DevOpsDays Tokyo 2021Preferred Networks
 
DNSキャッシュサーバ チューニングの勘所
DNSキャッシュサーバ チューニングの勘所DNSキャッシュサーバ チューニングの勘所
DNSキャッシュサーバ チューニングの勘所hdais
 
Google borg と コンテナベース分散システムデザインパターン
Google borg と コンテナベース分散システムデザインパターンGoogle borg と コンテナベース分散システムデザインパターン
Google borg と コンテナベース分散システムデザインパターンktateish
 
Kibanaでsysstatを可視化する
Kibanaでsysstatを可視化するKibanaでsysstatを可視化する
Kibanaでsysstatを可視化するKensuke Maeda
 
不揮発メモリ(NVDIMM)とLinuxの対応動向について(for comsys 2019 ver.)
不揮発メモリ(NVDIMM)とLinuxの対応動向について(for comsys 2019 ver.)不揮発メモリ(NVDIMM)とLinuxの対応動向について(for comsys 2019 ver.)
不揮発メモリ(NVDIMM)とLinuxの対応動向について(for comsys 2019 ver.)Yasunori Goto
 
最近のたまおきの取り組み 〜OpenStack+αの実現に向けて〜 - OpenStack最新情報セミナー(2017年3月)
最近のたまおきの取り組み 〜OpenStack+αの実現に向けて〜  - OpenStack最新情報セミナー(2017年3月)最近のたまおきの取り組み 〜OpenStack+αの実現に向けて〜  - OpenStack最新情報セミナー(2017年3月)
最近のたまおきの取り組み 〜OpenStack+αの実現に向けて〜 - OpenStack最新情報セミナー(2017年3月)VirtualTech Japan Inc.
 
TeXの後継として、HTML5&CSS組版〜Vivliostyleプロジェクト
TeXの後継として、HTML5&CSS組版〜VivliostyleプロジェクトTeXの後継として、HTML5&CSS組版〜Vivliostyleプロジェクト
TeXの後継として、HTML5&CSS組版〜VivliostyleプロジェクトShinyu Murakami
 
Hadoopのシステム設計・運用のポイント
Hadoopのシステム設計・運用のポイントHadoopのシステム設計・運用のポイント
Hadoopのシステム設計・運用のポイントCloudera Japan
 
[C16] インメモリ分散KVSの弱点。一貫性が崩れる原因と、それを克服する技術とは? by Taichi Umeda
[C16] インメモリ分散KVSの弱点。一貫性が崩れる原因と、それを克服する技術とは? by Taichi Umeda[C16] インメモリ分散KVSの弱点。一貫性が崩れる原因と、それを克服する技術とは? by Taichi Umeda
[C16] インメモリ分散KVSの弱点。一貫性が崩れる原因と、それを克服する技術とは? by Taichi UmedaInsight Technology, Inc.
 
ARM Trusted FirmwareのBL31を単体で使う!
ARM Trusted FirmwareのBL31を単体で使う!ARM Trusted FirmwareのBL31を単体で使う!
ARM Trusted FirmwareのBL31を単体で使う!Mr. Vengineer
 
本当は恐ろしい分散システムの話
本当は恐ろしい分散システムの話本当は恐ろしい分散システムの話
本当は恐ろしい分散システムの話Kumazaki Hiroki
 

La actualidad más candente (20)

tcpdumpとtcpreplayとtcprewriteと他。
tcpdumpとtcpreplayとtcprewriteと他。tcpdumpとtcpreplayとtcprewriteと他。
tcpdumpとtcpreplayとtcprewriteと他。
 
Kubernetes雑にまとめてみた 2020年8月版
Kubernetes雑にまとめてみた 2020年8月版Kubernetes雑にまとめてみた 2020年8月版
Kubernetes雑にまとめてみた 2020年8月版
 
RDB開発者のためのApache Cassandra データモデリング入門
RDB開発者のためのApache Cassandra データモデリング入門RDB開発者のためのApache Cassandra データモデリング入門
RDB開発者のためのApache Cassandra データモデリング入門
 
DockerとPodmanの比較
DockerとPodmanの比較DockerとPodmanの比較
DockerとPodmanの比較
 
エンジニアのためのOSSライセンス管理~OSS管理ツールの池の水全部抜く~
エンジニアのためのOSSライセンス管理~OSS管理ツールの池の水全部抜く~エンジニアのためのOSSライセンス管理~OSS管理ツールの池の水全部抜く~
エンジニアのためのOSSライセンス管理~OSS管理ツールの池の水全部抜く~
 
20130203 OSS-DB Exam Silver 技術解説無料セミナー
20130203 OSS-DB Exam Silver 技術解説無料セミナー20130203 OSS-DB Exam Silver 技術解説無料セミナー
20130203 OSS-DB Exam Silver 技術解説無料セミナー
 
10分で分かるLinuxブロックレイヤ
10分で分かるLinuxブロックレイヤ10分で分かるLinuxブロックレイヤ
10分で分かるLinuxブロックレイヤ
 
Cgroupあれこれ-第4回コンテナ型仮想化の情報交換会資料
Cgroupあれこれ-第4回コンテナ型仮想化の情報交換会資料Cgroupあれこれ-第4回コンテナ型仮想化の情報交換会資料
Cgroupあれこれ-第4回コンテナ型仮想化の情報交換会資料
 
0から始めるコンテナの学び方(Kubernetes Novice Tokyo #14 発表資料)
0から始めるコンテナの学び方(Kubernetes Novice Tokyo #14 発表資料)0から始めるコンテナの学び方(Kubernetes Novice Tokyo #14 発表資料)
0から始めるコンテナの学び方(Kubernetes Novice Tokyo #14 発表資料)
 
PFNのML/DL基盤を支えるKubernetesにおける自動化 / DevOpsDays Tokyo 2021
PFNのML/DL基盤を支えるKubernetesにおける自動化 / DevOpsDays Tokyo 2021PFNのML/DL基盤を支えるKubernetesにおける自動化 / DevOpsDays Tokyo 2021
PFNのML/DL基盤を支えるKubernetesにおける自動化 / DevOpsDays Tokyo 2021
 
DNSキャッシュサーバ チューニングの勘所
DNSキャッシュサーバ チューニングの勘所DNSキャッシュサーバ チューニングの勘所
DNSキャッシュサーバ チューニングの勘所
 
Google borg と コンテナベース分散システムデザインパターン
Google borg と コンテナベース分散システムデザインパターンGoogle borg と コンテナベース分散システムデザインパターン
Google borg と コンテナベース分散システムデザインパターン
 
Kibanaでsysstatを可視化する
Kibanaでsysstatを可視化するKibanaでsysstatを可視化する
Kibanaでsysstatを可視化する
 
不揮発メモリ(NVDIMM)とLinuxの対応動向について(for comsys 2019 ver.)
不揮発メモリ(NVDIMM)とLinuxの対応動向について(for comsys 2019 ver.)不揮発メモリ(NVDIMM)とLinuxの対応動向について(for comsys 2019 ver.)
不揮発メモリ(NVDIMM)とLinuxの対応動向について(for comsys 2019 ver.)
 
最近のたまおきの取り組み 〜OpenStack+αの実現に向けて〜 - OpenStack最新情報セミナー(2017年3月)
最近のたまおきの取り組み 〜OpenStack+αの実現に向けて〜  - OpenStack最新情報セミナー(2017年3月)最近のたまおきの取り組み 〜OpenStack+αの実現に向けて〜  - OpenStack最新情報セミナー(2017年3月)
最近のたまおきの取り組み 〜OpenStack+αの実現に向けて〜 - OpenStack最新情報セミナー(2017年3月)
 
TeXの後継として、HTML5&CSS組版〜Vivliostyleプロジェクト
TeXの後継として、HTML5&CSS組版〜VivliostyleプロジェクトTeXの後継として、HTML5&CSS組版〜Vivliostyleプロジェクト
TeXの後継として、HTML5&CSS組版〜Vivliostyleプロジェクト
 
Hadoopのシステム設計・運用のポイント
Hadoopのシステム設計・運用のポイントHadoopのシステム設計・運用のポイント
Hadoopのシステム設計・運用のポイント
 
[C16] インメモリ分散KVSの弱点。一貫性が崩れる原因と、それを克服する技術とは? by Taichi Umeda
[C16] インメモリ分散KVSの弱点。一貫性が崩れる原因と、それを克服する技術とは? by Taichi Umeda[C16] インメモリ分散KVSの弱点。一貫性が崩れる原因と、それを克服する技術とは? by Taichi Umeda
[C16] インメモリ分散KVSの弱点。一貫性が崩れる原因と、それを克服する技術とは? by Taichi Umeda
 
ARM Trusted FirmwareのBL31を単体で使う!
ARM Trusted FirmwareのBL31を単体で使う!ARM Trusted FirmwareのBL31を単体で使う!
ARM Trusted FirmwareのBL31を単体で使う!
 
本当は恐ろしい分散システムの話
本当は恐ろしい分散システムの話本当は恐ろしい分散システムの話
本当は恐ろしい分散システムの話
 

Similar a 嵌入式平台移植技巧概說

Docker 基礎介紹與實戰
Docker 基礎介紹與實戰Docker 基礎介紹與實戰
Docker 基礎介紹與實戰Bo-Yi Wu
 
在Linux上實現Rstudio Server 與Spark的溝通
在Linux上實現Rstudio Server 與Spark的溝通在Linux上實現Rstudio Server 與Spark的溝通
在Linux上實現Rstudio Server 與Spark的溝通電腦科學 實驗室
 
利用Cent Os快速构建自己的发行版
利用Cent Os快速构建自己的发行版利用Cent Os快速构建自己的发行版
利用Cent Os快速构建自己的发行版xingsu1021
 
快速入坑 Node.js - 0613 SITCON 雲林定期聚
快速入坑 Node.js - 0613 SITCON 雲林定期聚快速入坑 Node.js - 0613 SITCON 雲林定期聚
快速入坑 Node.js - 0613 SITCON 雲林定期聚Lorex L. Yang
 
20121111 linux intro
20121111 linux intro20121111 linux intro
20121111 linux introChang Mt
 
Bypat博客出品-利用cent os快速构建自己的发行版
Bypat博客出品-利用cent os快速构建自己的发行版Bypat博客出品-利用cent os快速构建自己的发行版
Bypat博客出品-利用cent os快速构建自己的发行版redhat9
 
Build desktop app_by_xulrunner
Build desktop app_by_xulrunnerBuild desktop app_by_xulrunner
Build desktop app_by_xulrunnerRack Lin
 
[1]投影片 futurewad樹莓派研習會 141120
[1]投影片 futurewad樹莓派研習會 141120[1]投影片 futurewad樹莓派研習會 141120
[1]投影片 futurewad樹莓派研習會 141120CAVEDU Education
 
Linux必备知识与Unix基础文化
Linux必备知识与Unix基础文化Linux必备知识与Unix基础文化
Linux必备知识与Unix基础文化Dahui Feng
 
20030623 linuxbasic and-security
20030623 linuxbasic and-security20030623 linuxbasic and-security
20030623 linuxbasic and-security建融 黃
 
寫出高性能的服務與應用 那些你沒想過的事
寫出高性能的服務與應用 那些你沒想過的事寫出高性能的服務與應用 那些你沒想過的事
寫出高性能的服務與應用 那些你沒想過的事Chieh (Jack) Yu
 
移植Os and 相關io介紹
移植Os and  相關io介紹移植Os and  相關io介紹
移植Os and 相關io介紹Hong Da Lin
 
Docker tutorial
Docker tutorialDocker tutorial
Docker tutorialazole Lai
 
用 Docker 改善團隊合作模式
用 Docker 改善團隊合作模式用 Docker 改善團隊合作模式
用 Docker 改善團隊合作模式Bo-Yi Wu
 
軟體組裝心得分享
軟體組裝心得分享軟體組裝心得分享
軟體組裝心得分享Wen Liao
 
为啥别读HotSpot VM的源码(2012-03-03)
为啥别读HotSpot VM的源码(2012-03-03)为啥别读HotSpot VM的源码(2012-03-03)
为啥别读HotSpot VM的源码(2012-03-03)Kris Mok
 

Similar a 嵌入式平台移植技巧概說 (20)

Docker 基礎介紹與實戰
Docker 基礎介紹與實戰Docker 基礎介紹與實戰
Docker 基礎介紹與實戰
 
在Linux上實現Rstudio Server 與Spark的溝通
在Linux上實現Rstudio Server 與Spark的溝通在Linux上實現Rstudio Server 與Spark的溝通
在Linux上實現Rstudio Server 與Spark的溝通
 
利用Cent Os快速构建自己的发行版
利用Cent Os快速构建自己的发行版利用Cent Os快速构建自己的发行版
利用Cent Os快速构建自己的发行版
 
Rootkit 101
Rootkit 101Rootkit 101
Rootkit 101
 
快速入坑 Node.js - 0613 SITCON 雲林定期聚
快速入坑 Node.js - 0613 SITCON 雲林定期聚快速入坑 Node.js - 0613 SITCON 雲林定期聚
快速入坑 Node.js - 0613 SITCON 雲林定期聚
 
20121111 linux intro
20121111 linux intro20121111 linux intro
20121111 linux intro
 
Bypat博客出品-利用cent os快速构建自己的发行版
Bypat博客出品-利用cent os快速构建自己的发行版Bypat博客出品-利用cent os快速构建自己的发行版
Bypat博客出品-利用cent os快速构建自己的发行版
 
Build desktop app_by_xulrunner
Build desktop app_by_xulrunnerBuild desktop app_by_xulrunner
Build desktop app_by_xulrunner
 
[1]投影片 futurewad樹莓派研習會 141120
[1]投影片 futurewad樹莓派研習會 141120[1]投影片 futurewad樹莓派研習會 141120
[1]投影片 futurewad樹莓派研習會 141120
 
Linux必备知识与Unix基础文化
Linux必备知识与Unix基础文化Linux必备知识与Unix基础文化
Linux必备知识与Unix基础文化
 
Ox office現在。即未來(201509)
Ox office現在。即未來(201509)Ox office現在。即未來(201509)
Ox office現在。即未來(201509)
 
Some tips
Some tipsSome tips
Some tips
 
20030623 linuxbasic and-security
20030623 linuxbasic and-security20030623 linuxbasic and-security
20030623 linuxbasic and-security
 
寫出高性能的服務與應用 那些你沒想過的事
寫出高性能的服務與應用 那些你沒想過的事寫出高性能的服務與應用 那些你沒想過的事
寫出高性能的服務與應用 那些你沒想過的事
 
移植Os and 相關io介紹
移植Os and  相關io介紹移植Os and  相關io介紹
移植Os and 相關io介紹
 
Docker tutorial
Docker tutorialDocker tutorial
Docker tutorial
 
用 Docker 改善團隊合作模式
用 Docker 改善團隊合作模式用 Docker 改善團隊合作模式
用 Docker 改善團隊合作模式
 
Develop Your Own Operating System
Develop Your Own Operating SystemDevelop Your Own Operating System
Develop Your Own Operating System
 
軟體組裝心得分享
軟體組裝心得分享軟體組裝心得分享
軟體組裝心得分享
 
为啥别读HotSpot VM的源码(2012-03-03)
为啥别读HotSpot VM的源码(2012-03-03)为啥别读HotSpot VM的源码(2012-03-03)
为啥别读HotSpot VM的源码(2012-03-03)
 

嵌入式平台移植技巧概說

  • 2. Outline • Freescale iMX6 porting流程 • 基本硬體知識 • 如何從上百隻程式中,找出系統執行的第一支主程式 • 尋找uboot 主程式 • 尋找編譯器載入檔 .lds • 由makefile搜尋 • 追蹤系統程式碼常用指令與技巧 • U-Boot 流程概述 • 其餘工具介紹 2016/3/9 joseph78715@gmail.com 2
  • 3. Freescale iMX6 porting 流程 • 我有整理資料如下,請自行參閱 https://hackpad.com/Freescale-iMX6-porting-EKoWlOejTiw 2016/3/9 joseph78715@gmail.com 3
  • 4. 基本硬體知識 • L1 Cache : 因為讀寫頻率極高,所以通常會採用速度較快的 SRAM • L2 Cache , RAM : 因為成本考量,通常會使用讀寫速度較次一級的 DRAM • Flash : 通常採用NAND Flash or NOR Flash • NAND Flash 需要初始化 ( 不可放uboot 程式 ,除非支援Stepping–stone ) ,且速度較慢但便宜 • NOR Flash 不須初始化 ( 可放uboot 程式 ),速度較快 P.S. 我們常聽到的記憶體(memory ) , 其實是 Cache , RAM 的統稱 2016/3/9 4 速度比較 : SRAM > DRAM > > NOR Flash > NAND Flash 價格比較 : SRAM > DRAM > > NOR Flash > NAND Flash
  • 5. 基本硬體知識 • 1st stage boot loader 只能放在不須初始化即可使用的儲存空間。E.g. 1. 有支援 Stepping–stone 的 NAND Flash • Stepping–stone : • 三星專利。上電時硬體電路會抓取 NAND Flash 的前 128k ( 每顆 NAND 支援大小不一定 ), 放進 SRAM 中執行。 • 只要你的 uboot 程式有辦法在 128k 內完成 CPU , Memory 以及 NAND Flash 初始化 ,就可 以利用NAND Flash 開機 。 • 也因為 Stepping–stone 技術的出現,讓開發商不用特地買一塊貴貴小小的 NOR Flash 放 Bootloader 程式,而可以全部改用便宜的 NAND Flash 取代。 2. NOR Flash : • NOR Flash 可以和 CPU pin-to-pin ,支援 XIP ( Execute in place )。不須初始化即可使用 2016/3/9 joseph78715@gmail.com 5
  • 6. 悲劇的嵌入式工程師 • 如果你覺得Uboot & kernel 的source code 動不動上千萬行,可能一輩子都看 不完 • 從 Linux kernel 4.1 以後,原始程式碼已衝到 2000 萬行的規模 • 而在u-boot & kernel 程式碼都沒 trace 完一遍的情形下,上司又要你在有限時 間內把OS porting 上去,根本超級悲慘兼毫無人性 時間就是金錢! 這是一個什麼都趕的時代 老闆趕出貨 , PM趕結案 , 於是 工程師趕羚羊 2016/3/9 joseph78715@gmail.com 6
  • 7. 千萬別這麼悲觀 , 因為 … 還有更可怕 更可怕 更可怕 的挑戰在等你 2016/3/9 joseph78715@gmail.com 7
  • 8. 更可怕的是… 在 OS sorce code 裡,不是每一行程式都會被編譯,而編譯了也不一定被連結, 連結了不一定被執行。 若沒搞清楚狀況,可能 trace 了好幾天的程式碼後,才發現該段程式碼根本 不會被執行,所以看了等於白看、改了等於白改 , … 2016/3/9 joseph78715@gmail.com 8
  • 9. 所以,如何從上千個檔案中,找出系統所 執行的第一個函式所在位置呢? • 以尋找uboot 執行的第一支函式為例  Sol 1 : 尋找編譯器載入檔 .lds /board/$5/$4/u-boot.lds cpu/$3/start.S  Sol 2 : 由晶片商所提供的編譯 Uboot 的 makefile 中尋找 • 當我們找出第一個被執行的函式所在檔案,就可以順藤摸瓜找出系統會執行的第2 支、第3支被執行的函式,依序追蹤下去 2016/3/9 joseph78715@gmail.com 9
  • 10. 追蹤系統程式碼常用指令與技巧 (1/2) • 欲搜尋Uboot執行第一支程式,可由找到編譯器載入程式 . lds 檔下手 • 做嵌入式要習慣隨便一找就找出幾百個同名檔案,此時就要依系統架構去判 斷,到底哪個才是你要用的 2016/3/9 joseph78715@gmail.com 10
  • 11. 追蹤系統程式碼常用指令與技巧 (2/2) • Q : 想找某個變數在source code的哪些檔案的哪裡有出現? • Ans : 請用正規表達式(Global Regular Expression) grep 搜尋。 2016/3/9 joseph78715@gmail.com 11
  • 12. U-Boot 流程概述 • 切入 SVC 模式 • 只有svc mode可以修改硬體參數。進user mode ( kernel跑起來後 ) 就無法對硬體設定做修改 • 清除 I-Cache / D-Cache • 為 MMU 相關暫存器設定初值 • 設定 peripheral bus 起點 • 初始化 CPU ( 設定 PLL ) 與記憶體 ( 設定 Tacc , Tacp ,... ) • 偵測 U-Boot 是放在NAND or NOR Flash • 若放在NAND 則須將剩下的uboot程式copy到DRAM執行 • 若放在NOR 則不須複製到RAM,可直接執行。但一般為了效能考量仍會複製到RAM中 執行 • 初始化 MMU • 初始化堆疊區 • 初始化 BSS 區 • 跳入第二階段的 start_armboot() 函數 : • 跳離此處便不再回來,至此由ARM組語變為 C語言執行 2016/3/9 joseph78715@gmail.com 12
  • 13. 其餘工具介紹 • 程式除錯工具GDB & CGDB • 我有整理資料如下,請自行參閱 https://hackpad.com/GDB-CGDB-7dUwpX8os7U • 版本控制 Git • 我有整理資料如下,請自行參閱 https://hackpad.com/Git-SVKqwqVxUNQ 2016/3/9 joseph78715@gmail.com 13
  • 14. 參考資料 • U-Boot 簡明概要 • http://teacherchi.tumblr.com/post/20112222844/u-boot- %E7%B0%A1%E6%98%8E%E6%A6%82%E8%A6%81 2016/3/9 joseph78715@gmail.com 14