視訊更新:程式碼分析8之單步除錯ARM64啟動彙編與重定位
今天更新的視訊節目,講另外一個有趣的話題,如何用gdb來除錯ARM64的啟動彙編程式碼,可能大家都想嘗試去單步除錯啟動彙編程式碼,但是又苦苦不知道怎麼搞。在上一期節目中,我們和大家詳細分析了ARM64啟動彙編程式碼,還有在啟動彙編程式碼裡面做了哪些記憶體對映。有不少小夥伴看了那一期視訊,都覺得不錯,有不少小夥伴給笨叔提出了批評,覺得笨叔講的太囉嗦,程式碼講的過細,聽的有點暈暈的。沒有辦法,眾口難調。世間上難得有一個fae可以苦口婆心地和你講Linux 5.0和ARM64,對吧。這樣的fae去哪裡找呢?
錄製視訊是一種興趣愛好
笨叔錄製視訊是一種興趣愛好。我們的奔跑吧的視訊,和別家視訊不一樣,我們只收了很少的錢,但是呢,我們錄製了很多視訊,我們現在第一季已經錄製好的視訊就超過40小時。後面還會免費給大家來錄製基於Linux 5.0核心的記憶體管理程式碼分析視訊。 對的,您沒有聽錯,後面錄的Linux 5.0原始碼分析視訊是不再收費的。這是全球第一家也是唯一一家Linux 5.0原始碼手把手分析的視訊。可能有的讀者會問了,笨叔,你們錄這麼多視訊,收費這麼低,這是為啥。其實很簡單,我們不靠賣視訊生活,我們都有正當的工作,可能很多小夥伴都知道了,笨叔在上海一家小公司當小fae,另外笨叔業餘時間也在研究股票,研究巴菲特,所以,我們不靠賣視訊賺錢。我們錄視訊純粹是為了興趣愛好。有的小夥伴說了,竟然錄視訊不是為了賺錢,那為什麼不免費?我們知道,一旦免費,就很少有朋友真的認真去看視訊了,而且不但很少人看,還有一些噴子來噴,所以,有噴子來噴的話,我們也要設定門檻,歡迎來噴,但是你先付999。所以,我們設定一定門檻,給真正有需要的朋友來觀看。如果你覺得笨叔錄的視訊對你工作有幫助,你也不在乎那點小錢,對吧。我們也真誠呼籲一下,正在看這個視訊的小夥伴,可以幫忙推薦一下。
程式碼分析8 - 單步除錯ARM64啟動彙編和重定位
按照慣例,我們先上這一期節目中面試常見的必考題。
1. 什麼是載入地址?什麼是執行地址?什麼是連結地址?
2. 什麼是位置無關的彙編指令,什麼是位置有關的彙編指令?
3. 什麼是重定位?
4. 在實際專案開發中,為什麼要刻意設定載入地址,執行地址以及連結地址不一樣呢?
5. 在U-boot啟動時重定位是如何實現的?
6. 在核心啟動時核心映像重定位是如何實現的?
在這期視訊節目之前,我們先做一小實驗,我們在上一期節目中講過的幾個彙編函式裡設定斷點,看看gdb會停留在哪個斷點裡。
啟動GDB來除錯之後,我們發現斷點只停留在斷點8上,即__primary_switched函式,該函式是在__enable_mmu函式之後,也就是說GDB只能除錯啟動MMU之後的程式碼,這是為什麼呢?
另外,從System.map檔案中可以查詢到stext和__primary_switched函式的地址都是在核心態的虛擬地址空間裡。
好了,我們這一期節目,就和大家來好好聊聊這個話題。
要弄明白上面的疑問,我們首先要知道下面幾個重要概念。
- 載入地址:指程式碼儲存的實體地址。比如ARM64處理器上電覆位啟動是從0x0地址開始取第一條指令的(假設異常向量表存放在0x0地址處),所以通常這個地方存放異常向量表的處理函式。
- 執行地址:是指程式執行時的地址。
- 連結地址:指在編譯連結時指定的地址,程式設計人員設想將來程式要執行的地址。程式中所有標號的地址在連結後便確定了,不管程式在哪執行都不會改變。使用aarch64-linux-gnu-objdump工具進行反彙編檢視的就是連結地址。
上面三個地址,什麼時候會一樣,什麼時候又會不一樣呢?
笨叔在這一期視訊中,會告訴你重定位的祕密,還有教你怎麼單步除錯Linux 5.0核心的ARM64的啟動彙編程式碼。
有興趣的小夥伴可以訂閱奔跑吧旗艦篇視訊節目,點選“閱讀原文”訂閱喲!
藍色奔跑吧第二版已經交稿
笨叔歷時1年新修訂的藍色奔跑吧已經交稿,第二版會新增很多新內容,而且大部分內容是重新重構的,第二版完全基於Linux5.0 + ARM64/x86_64來編寫的。書稿在3月初已經交稿,請大家耐心等待。想看Linux 5.0的程式碼講解,可以訂閱旗艦篇視訊課程,笨叔會在視訊裡詳細和大家分析5.0程式碼的實現。
- 第二版詳細目錄請登入“奔跑吧linux社群”微信公眾號,輸入“奔跑吧第二版”索取。
- 全新的一套奔跑卷題目,有興趣同學可以登入“奔跑吧linux社群”微信公眾號,輸入“奔跑卷”索取。
本書預計2020年盛夏出版,到時候笨叔約大家吃西瓜,看奔跑吧!
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70005277/viewspace-2885063/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 第一季視訊更新:程式碼分析7之ARM64啟動彙編和記憶體初始化記憶體
- 如何分析 SAP Spartacus 路由問題之 CheckoutAuthGuard 單步除錯路由除錯
- 除錯篇——斷點與單步除錯斷點
- NgRx Store createSelector 的單步除錯和原始碼分析除錯原始碼
- 彙編環境下的原始碼除錯原始碼除錯
- iOS彙編入門教程(一)ARM64彙編基礎iOS
- 如何在Visual Studio中執行和除錯彙編程式碼?除錯
- iOS 逆向 - 重籤應用除錯與程式碼修改 (Hook)iOS除錯Hook
- MacOs 下除錯 8086 彙編Mac除錯
- nasm彙編以及bochs除錯ASM除錯
- 除錯時檢視彙編和暫存器資料等除錯
- rxjs Observable of 操作符的單步除錯分析JS除錯
- 除錯JS獲得動態視訊地址除錯JS
- SAP錯誤訊息除錯之七種武器:讓所有的錯誤訊息都能被定位除錯
- Spark原始碼分析之Worker啟動通訊機制Spark原始碼
- GDB程式碼除錯與使用除錯
- python如何單步除錯Python除錯
- php程式碼審計之——phpstorm動態除錯PHPORM除錯
- GCC內聯彙編(2)GCC生成彙編程式碼簡單例項GC單例
- Java程式碼如何檢視位元組碼及彙編碼Java
- 音視訊開發-全網最全常用音視訊編碼和格式彙總
- Python之PySnooper程式碼除錯PythonOOP除錯
- [原始碼分析] 訊息佇列 Kombu 之 啟動過程原始碼佇列
- 彙編程式碼Helloworld
- Tesla T4視訊編碼效能分析
- 移動端除錯方法彙總除錯
- codeblocks單步除錯詳解BloC除錯
- linux下gdb單步除錯Linux除錯
- codeblocks中,啟動、編譯、除錯ROS節點BloC編譯除錯ROS
- Windows 8啟用錯誤程式碼解析Windows
- 自己動手實現java斷點/單步除錯(一)Java斷點除錯
- 自己動手實現java斷點/單步除錯(二)Java斷點除錯
- Mac之QuickTimePlayer簡單編輯視訊MacUI
- x86彙編之棧與子程式呼叫
- Android 音視訊開發 視訊編碼,音訊編碼格式Android音訊
- 一個用delphi寫的整合彙編與api的簡單的視窗程式API
- 讀書筆記之《格蠹彙編-軟體除錯案例集錦》筆記除錯
- vscode 啟動與除錯 flutter 專案VSCode除錯Flutter