原创 內存屏障簡介

在閱讀很多底層的代碼時,經常會碰到一個所謂內存屏障的概念,經常搞得一頭霧水。本文將對這個概念進行一個系統的介紹。 一、爲什麼需要內存屏障 內存屏障的引入,本質上是由於CPU重排序指令引起的。重排序問題無時無刻不在發生,主要源自以下幾種場景

原创 Linux時間子系統之Tick廣播層(Tick Broadcast)

在分析Tick模擬層的時候曾經提到過,當系統中沒有別的進程需要處理的時候,會將當前CPU切換到NO_HZ狀態,不會每一個Tick都收到定時中斷,從而達到節電的目的。但此時,當前CPU上的定時事件設備還是打開的,處於工作狀態,只不過不產生T

原创 Linux時間子系統之Tick模擬層(Tick Sched)

在分析高分辨率定時器的時候曾經提到過,一旦切換到高精度模式後,原來的Tick層就失去作用了,高分辨率定時器層將“接管”對底層定時事件設備的控制。這時,也就意味着,系統中原有的Tick將不復存在了。但是,這個Tick其實是非常重要的,系統j

原创 MUTF-8編碼格式介紹

在Android應用程序的Dex文件中,所有的字符串都是使用一種叫做MUTF-8(Modified UTF-8)的編碼格式進行編碼的。 所謂的MUTF-8編碼,其實是對UTF-16字符編碼的再編碼。 具體的實現可以查看MUTF-8編碼的代

原创 Linux時間子系統之定時事件層(Clock Events)

  幾乎所有的計算機系統中都會存在一個所謂的定時設備,經過設置後,在某個固定的時間或某個相對的時間間隔後,達到觸發條件,發送中斷給處理器。 系統中的每一種實際的定時事件設備都由一個叫做clock_event_device的結構體變量表示(

原创 在Ubuntu18.04下編譯樹莓派4B的Arm64內核

默認的樹莓派鏡像Raspbian啓動的是Linux的32位4.19內核,但是筆者想將其替換成5.4.y版本的64位內核。當然也可以直接在樹莓派上編譯,不過這樣速度比較慢,所以還是選擇在Ubuntu18.04上交叉編譯。 1)首先,要安裝基

原创 Linux時間子系統之高分辨率定時器層(HR Timer)

在前面介紹定時器層的文章中我們已經知道了在Linux內核中已經存在了一個管理定時器的通用框架。不過它也有很多不足,最大的問題是其精度不是很高。哪怕底層的定時事件設備精度再高,定時器層的分辨率只能達到Tick級別,按照內核配置選項的不同,在

原创 Linux時間子系統之時間維護層(Time Keeper)

時間維護層會收到Tick層的週期調用,每次調用的週期是由內核參數決定的。在此期間,時間維護層可以讀取時鐘源設備的週期數,從而感知時間的流逝。 目前時間維護層主要負責維護以下幾種類型的時間: 實時時間(CLOCK_REALTIME):又稱作

原创 Linux時間子系統之時間的表示

在Linux內核中,爲了兼容原有的代碼,或者符合某種規範,並且還要滿足當前精度日益提高的要求,實現了多種與時間相關但用於不同目的的數據結構: 1)jiffies和jiffies_64 內核用jiffies_64全局變量記錄系統自啓動以來經

原创 Linux時間子系統之定時器層(Timer)

定時器層是基於Tick層之上的,是根據系統jiffies來觸發的,精度相對比較低。利用定時器,我們可以設定在未來的某一時刻,觸發一個特定的事件。經常,也會把這種低精度定時器稱作時間輪(Timer Wheel)。 在內核中,一個定時器是使用

原创 Linux時間子系統之時鐘源層(Clock Source)

所謂時鐘源設備,Linux將其抽象爲一個可以記錄時間流逝的設備,其值隨着時間的流逝遞增。將前一次讀取的值和當前的值做比較就知道過去了多長的時間。但是它不一定是記錄當前具體時間的設備,它只記錄過去了多少時間。 對於時間Linux還抽象了一個

原创 Linux時間子系統之Tick層

所謂Tick設備,也稱作滴答設備,就是系統中的一個週期中斷設備,其週期間隔由內核編譯選項定義。 Tick設備在Linux時間子系統中用tick_device結構體表示(代碼位於kernel/time/tick-sched.h中): st

原创 Linux時間子系統之定時事件設備(Clock Event Device)

  幾乎所有的計算機系統中都會存在一個所謂的定時設備,經過設置後,在某個固定的時間或某個相對的時間間隔後,達到觸發條件,發送中斷給處理器。 系統中的每一種實際的定時事件設備都由一個叫做clock_event_device的結構體變量表示(

原创 Arm通用計時器簡介

所有使用Arm處理器的系統中都會包含一個標準化的通用定時器(Generic Timer)框架。這個通用定時器系統提供了一個系統計數器(System Counter)和一組定時器(Timer)。其結構如下圖: 可以看到,系統計數器是全局唯

原创 Arm64下Linux內核Image頭的格式

Linux對於Arm64架構,其編譯出來的內核默認是不支持壓縮的;而對於Arm32版本來說,默認支持內核解壓的操作(代碼位於arch/arm/boot/compressed目錄下,可是arm64目錄下沒有對應的代碼)。如果實在想壓縮內核,