大家好,我是這次eBPF入門直播的講解人,在陳老師的提議下,在這裡和大家分享一下準備直播內容背後的故事。所以今天的這篇文字不講解技術,是記錄和分享。
老師中午說完直播的事情後,當天下午的時間我還沒有正式開始準備。我去了解了一下高效率學習的一些方法,還有一些關於結構化思考的文章,這些對理解eBPF當然是沒什麼幫助的,但是我覺得高效率的學習工作應該是有一套方法論的,我也想借鑑其中的方法論來提高效率。事實上也證明,確實是有用的。
晚上時候我了解到一個日程管理軟體Notion,所以我下載了它並學習如何使用它,接下來我就準備用它來規劃學習。所以在晚上,我在上面寫了第一個計劃:了解Notion。了解也是為了後面高效的利用它。
對Notion使用熟悉了以後,後面準備的這幾天裡我都用Notion來做日程規劃,這是到今天(2.8)已經做過的規劃記錄。
從第二天(2.4號)開始,我開始使用Notion來規劃日程。今天做的事情不是很多,主要是自己的eBPF入門哈哈。
家裡有一本《BPF之巔》,正好是放假回來買的。如果不是這次直播要學習eBPF,我也不知道我何時會翻開它哈哈。這本書巨厚,厚度和Linux經典巨著《深入Linux內核架構》相差無幾。我想在這本書中找到入門eBPF的思路。這本書我是挑著看的,有時需要從前幾頁直接跳到最後的附錄看。第一遍讀後知道了一些BPF裡面的術語概念,比如BPF程序、BPF指令集、BPF指令格式、BPF字節碼、虛擬指令集規範、BPF虛擬機、BPF解釋器、BPF加載器、BPF驗證器等。理解了這些點,下一步就是要如何把這些點串起來,形成對BPF框架的理解。構建起框架後,再選擇框架中的某個點深入。下午沒有再看書,社區的公眾號要推送直播消息,所以撰寫了下文案,構思了下直播內容的大綱。
從三天(2.5號)開始差不多正式投入到學習eBPF。有了前面的一些eBPF技術術語後,我開始提出一些思考,我想從我最好奇的地方去理解eBPF的內部原理,比如eBPF這個詞究竟代表的含義是什麼,它在內核中怎麼存在的,又是如何在內核中工作的?所以當天的日程規劃也比較明確,就是把這3個問題搞清楚。
接著在搞清楚那兩個問題的過程中,我也嘗試把理解eBPF技術過程中的各個點梳理出來,穿成一條線,幫助新學習eBPF技術的同學可以清晰的了解學習路線。所以在隨著不斷查資料深入的過程中,eBPF技術原理路線也在不停的改,下面是中間不停變動的草稿。
第一版就是圍繞最初的那幾個問題,後面學到新的東西後不斷擴充進來。
因為覺得第一版的草稿內容比較簡單,所以第2版草稿中我去搜集了關於eBPF的面試題,想看看面試中有哪些問的深入的問題,跟著問題深入。但是關於eBPF的面試題很少,只找到了一個:BPF 和 eBPF 是什麼原理?有什麼好處?第一問正好已經包含了。然後我又把自己設想成面試官的身份,對自己提一些思考問題。
隨著繼續學習,我發現對於eBPF技術,有些是屬於技術本身的核心原理,另外一些其實不能算是核心原理,比如eBPF的優勢和局限性,起源和發展等等,如果揉在一起講很難區分出重點。所以我想到利用二維坐標系來把它們區分開。縱軸代表深度,就是對eBPF技術原理理解越深越好;橫軸代表廣度,就是對eBPF技術知道越多越好,根據這樣的思路,又重新製作了第3版草稿。
但是第3版在縱向排列上,只是把關於涉及eBPF技術的原理點羅列,更科學的邏輯應該是先有一個總體鋪墊的過程,然後再逐個點深入,就像前面先了解eBPF技術的一些術語,然後搭建eBPF框架,再深入某個點一樣。所以按照這個思路,重新設計了各個原理點的先後順序,最終在第4版確定了下來。
第4版,最終版。
確定好了基本的eBPF講解路線後,後面製作PPT就可以按照這個大綱來準備。
在第4天(2.6號),差不多算全力投入。在早上規劃了當天的日程。
今天進行了大量思考,所以也把思考的其中一個過程記錄下來。
學習eBPF的過程中,也在不斷的思考和梳理,不好理解的邏輯就觸類旁通,暫時模糊的地帶就靠合理的分析推理,後面時間再去求證。eBPF有些術語聽著很抽象,比如BPF字節碼,我去查資料字節碼是什麼,然後了解到java字節碼,java字節碼被java虛擬機執行,我又去了解java虛擬機,最後梳理了java源程序經過編譯器生成字節碼,然後被java虛擬機解釋執行的過程,我把BPF字節碼、BPF虛擬機和java字節碼、java虛擬機觸類旁通,我覺的它們的實現思想是一致的。通過理解java編譯到解釋執行的工作原理,我終於有一種恍然大悟的感覺,第一次理解了為什麼BPF指令要編譯成BPF字節碼,也清楚了BPF虛擬機存在的意義,不再僅僅是停留在知道有BPF字節碼和BPF虛擬機這兩個東西,而不清楚它倆的關係紐帶。從外部看,BPF程序要被編譯成字節碼,BPF字節碼是需要被BPF虛擬機解釋執行。因為BPF虛擬機做的就是解釋執行的工作,所以有些BPF文檔裡把虛擬機稱為解釋器也就可以理解了,比如不開啟JIT就使用內核解釋器來解釋執行BPF字節碼,這些內容可以串起來了。
這是站在虛擬機的角度來理解,如果進一步思考,我把它與處理器和機器碼來對比理解。為了與虛擬機概念符合,就把真實的處理器叫做物理機吧。物理機執行機器碼,那虛擬機也要執行自己的機器碼,這個「機器碼」就叫做字節碼,可能也是為了區別於機器碼的叫法,當然字節碼也有自己的特點。機器碼符合一定的CPU體系結構的指令集規範的,比如x86指令集和ARM指令集,那虛擬機順理成章也應該有指令集規範,這就是指令格式,現在理解了為什麼要定義那個bpf_insn結構體了,要用它來定義BPF指令格式。但是又會有新的思考,定義好這個有什麼用呢,何時會用到呢?查資料了解到java的編譯器可能就是按照java字節碼格式來編譯生成字節碼的,所以BPF指令格式是為了告訴編譯器按照什麼規則來編譯BPF指令以生成BPF字節碼?然後內核解釋器也按照這個格式規範來對BPF字節碼解碼執行?這些都是我不太肯定的點,但是如果從邏輯上分析一下,感覺也比較合理。然後因為時間比較緊,而且這些問題都是屬於BPF內部原理之外的一些東西,BPF內部原理比如BPF程序如何被加載進內核,怎麼被虛擬機執行的還沒有搞清楚,所以沒有花時間去求證。後面的學習就是深入eBPF的內部原理,閱讀了幾篇篇高質量的博客,其中一篇沒有全部讀完,只看了對於理解有幫助的部分,這裡面包括一些對BPF源碼分析的博客,加深了對eBPF內部實現的理解。也是在這些大牛的技術博客的幫助下,一點一點結合之前所有零碎的點進行整合理解,最後終於對整個eBPF的運作機制有了初步的全景圖式理解。學習eBPF期間也在穿插的準備直播PPT的草稿版。
最後一天(2.7號)。今天要把PPT做完
計劃預計上午做完,下午修改格式。本來想著修改好PPT的格式後自己預演一下,因為第一次直播還是有點緊張,所以想排練一下。結果直到下午七點半左右才把PPT做好,距離正式開講只剩半個小時了,所以時間依然是很緊的。
晚上直播完以後,我又回看了錄屏,思考裡面有問題的地方和可以改進的點。以上就是直播準備的過程,記錄在這裡和大家分享。
非常感謝老師提供的機會,非常感謝為這次直播做了大量準備工作的社區工作人員,同時非常感謝觀看這次直播的小夥伴們,謝謝大家!