主頁 >  其他 > Device Tree(一):背景介紹

Device Tree(一):背景介紹

2020-10-18 02:36:04 其他

轉載自 http://www.wowotech.net/device_model/why-dt.html

一、前言

作為一個多年耕耘在linux 2.6.23內核的開發者,各個不同專案中各種不同周邊外設驅動的開發以及各種瑣碎的、扯皮的俗務占據了大部分的時間。當有機會下載3.14的內核并準備學習的時候,突然發現linux kernel對于我似乎變得非常的陌生了,各種新的機制,各種framework、各種新的概念讓我感到閱讀內核代碼變得舉步維艱。 還好,剖析內核的熱情還在,剩下的就交給時間的。首先進入視線的是Device Tree機制,這是和porting內核非常相關的機制,如果想讓將我們的硬體平臺遷移到高版本的內核上,Device Tree是一個必須要掃清的障礙。

我想從下面三個方面來了解Device Tree:

1、為何要引入Device Tree,這個機制是用來解決什么問題的?(這是本文的主題)

2、Device Tree的基礎概念(請參考DT基礎概念)

3、ARM linux中和Device Tree相關的代碼分析(請參考DT代碼分析)

閱讀linux內核代碼就像欣賞冰山,有看得到的美景(各種內核機制及其代碼),也有埋在水面之下看不到的基礎(機制背后的源由和目的)。沉醉于各種內核機制的代碼固然有無限樂趣,但更重要的是注入更多的思考,思考其背后的機理,真正理解軟體抽象。這樣才能舉一反三,并應用在具體的作業和生活中。

本文主要從下面幾個方面闡述為何ARM linux會引入Device Tree:

1、沒有Device Tree的ARM linux是如何運轉的?

2、混亂的ARM architecture代碼和存在的問題

3、新內核的解決之道

 

二、沒有Device Tree的ARM linux是如何運轉的?

我曾經porting內核到兩個ARM-based的平臺上。一個是小的芯片公司的應用處理器,公司自己購買了CPU core,該CPU core使用ARM兼容的指令集(但不是ARM)加上各種公司自行設計的多媒體外設整合成公司的產品進行銷售。而我的任務就是porting 2.4.18內核到該平臺上。在黑白螢屏的手機時代,那顆AP(application process)支持了彩屏、camera、JPEG硬體加速、2D/3D加速、MMC/SD卡、各種音頻加速(內置DSP)等等特性,功能強大到無法直視。另外一次移植經歷是讓2.6.23內核跑在一個大公司的冷門BP(baseband processor)上。具體porting的方法是很簡單的:

1、自己撰寫一個bootloader并傳遞適當的引數給kernel。除了傳統的command line以及tag list之類的,最重要的是申請一個machine type,當拿到屬于自己專案的machine type ID的時候,當時心情雀躍,似乎自己已經是開源社區的一份子了(其實當時是有意愿,或者說有目標是想將大家的代碼并入到linux kernel main line的)。

2、在內核的arch/arm目錄下建立mach-xxx目錄,這個目錄下,放入該SOC的相關代碼,例如中斷controller的代碼,時間相關的代碼,記憶體映射,睡眠相關的代碼等等。此外,最重要的是建立一個board specific檔案,定義一個machine的宏:

MACHINE_START(project name, "xxx公司的xxx硬體平臺")
    .phys_io    = 0x40000000,
    .boot_params    = 0xa0000100,  
    .io_pg_offst    = (io_p2v(0x40000000) >> 18) & 0xfffc,
    .map_io        = xxx_map_io,
    .init_irq    = xxx_init_irq,
    .timer        = &xxx_timer,
    .init_machine    = xxx_init,
MACHINE_END


在xxx_init函式中,一般會加入很多的platform device。因此,伴隨這個board specific檔案中是大量的靜態table,描述了各種硬體設備資訊。

3、調通了system level的driver(timer,中斷處理,clock等)以及串口terminal之后,linux kernel基本是可以起來了,后續各種driver不斷的添加,直到系統軟體支持所有的硬體。

綜上所述,在linux kernel中支持一個SOC平臺其實是非常簡單的,讓linux kernel在一個特定的平臺上“跑”起來也是非常簡單的,問題的重點是如何優雅的”跑”。

 

三、混亂的ARM architecture代碼和存在的問題

每次正式的linux kernel release之后都會有兩周的merge window,在這個視窗期間,kernel各個部分的維護者都會提交各自的patch,將自己測驗穩定的代碼請求并入kernel main line。每到這個時候,Linus就會比較繁忙,他需要從各個內核維護者的分支上取得最新代碼并merge到自己的kernel source tree中。Tony Lindgren,內核OMAP development tree的維護者,發送了一個郵件給Linus,請求提交OMAP平臺代碼修改,并給出了一些細節描述:

1、簡單介紹本次改動

2、關于如何解決merge conficts。有些git mergetool就可以處理,不能處理的,給出了詳細介紹和解決方案

一切都很平常,也給出了足夠的資訊,然而,正是這個pull request引發了一場針對ARM linux的內核代碼的爭論。我相信Linus一定是對ARM相關的代碼早就不爽了,ARM的merge作業量較大倒在其次,主要是他認為ARM很多的代碼都是垃圾,代碼里面有若干愚蠢的table,而多個人在維護這個table,從而導致了沖突。因此,在處理完OMAP的pull request之后(Linus并非針對OMAP平臺,只是Tony Lindgren撞在槍口上了),他發出了怒吼:
Gaah. Guys, this whole ARM thing is a f*cking pain in the ass.


負責ARM linux開發的Russell King臉上掛不住,進行了反駁:事情沒有那么嚴重,這次的merge conficts就是OMAP和IMX/MXC之間一點協調的問題,不能抹殺整個ARM linux團隊的努力。其他的各個ARM平臺維護者也加入討論:ARM平臺如何復雜,如何龐大,對于arm linux code我們已經有一些思考,正在進行中……一時間,討論的氣氛有些尖銳,但總體是坦誠和友好的。

對于一件事情,不同層次的人有不同層次的思考。這次爭論涉及的人包括:

1、內核維護者(CPU體系結構無關的代碼)

2、維護ARM系統結構代碼的人

3、維護ARM sub architecture的人(來自各個ARM SOC vendor)

維護ARM sub architecture的人并沒有強烈的使命感,作為公司的一員,他們最大的目標是以最快的速度支持自己公司的SOC,盡快的占領市場。這些人的軟體功力未必強,對linux kernel的理解未必深入(有些人可能很強,但是人在江湖身不由己)。在這樣的情況下,很多SOC specific的代碼都是通過copy and paste,然后稍加修改代碼就提交了。此外,各個ARM vendor的SOC family是一長串的CPU list,每個CPU多多少少有些不同,這時候#ifdef就充斥了各個源代碼中,讓ARM mach-和plat-目錄下的代碼有些不忍直視。

作為維護ARM體系結構的人,其能力不容置疑。以Russell King為首的team很好的維護了ARM體系結構的代碼。基本上,除了mach-和plat-目錄,其他的目錄中的代碼和目錄組織是很好的。作為ARM linux的維護者,維護一個不斷有新的SOC加入的CPU architecture code的確是一個挑戰。在Intel X86的架構一統天下的時候,任何想正面攻擊Intel的對手都敗下陣來。想要擊倒巨人(或者說想要和巨人并存)必須另辟蹊徑。ARM的策略有兩個,一個是focus在嵌入式應用上,也就意味著要求低功耗,同時也避免了和Intel的正面對抗。另外一個就是博采眾家之長,采用license IP的方式,讓更多的廠商加入ARM建立的生態系統。毫無疑問,ARM公司是成功的,但是這種模式也給ARM linux的維護者帶來了噩夢。越來越多的芯片廠商加入ARM陣營,越來越多的ARM platform相關的代碼被加入到內核,不同廠商的周邊HW block設計又各不相同……

內核維護者是真正對作業系統內核軟體有深入理解的人,他們往往能站在更高的層次上去觀察問題,發現問題。Linus注意到每次merge window中,ARM的代碼變化大約占整個ARCH目錄的60%,他認為這是一個很明顯的符號,意味著ARM linux的代碼可能存在問題。其實,60%這個比率的確很夸張,因為unicore32是在2.6.39 merge window中第一次全新提交,它的代碼是全新的,但是其代碼變化大約占整個ARCH目錄的9.6%(需要提及的是unicore32是一個中國芯)。有些維護ARM linux的人認為這是CPU市場占用率的體現,不是問題,直到內核維護者貼出實際的代碼并指出問題所在。內核維護者當然想linux kernel支持更多的硬體平臺,但是他們更愿意為linux kernel制定更長遠的規劃。例如:對于各種繁雜的ARM平臺,用一個kernel image來支持。

經過爭論,確定的問題如下:

1、ARM linux缺少platform(各個ARM sub architecture,或者說各個SOC)之間的協調,導致arm linux的代碼有重復。值得一提的是在本次爭論之前,ARM維護者已經進行了不少相關的作業(例如PM和clock tree)來抽象相同的功能模塊。

2、ARM linux中大量的board specific的源代碼應該踢出kernel,否則這些垃圾代碼和table會影響linux kernel的長期目標。

3、各個sub architecture的維護者直接提交給Linux并入主線的機制缺乏層次。

 

四、新內核的解決之道

針對ARM linux的現狀,最需要解決的是人員問題,也就是如何整合ARM sub architecture(各個ARM Vendor)的資源。因此,內核社區成立了一個ARM sub architecture的team,該team主要負責協調各個ARM廠商的代碼(not ARM core part),Russell King繼續負責ARM core part的代碼。此外,建立一個ARM platform consolidation tree。ARM sub architecture team負責review各個sub architecture維護者提交的代碼,并在ARM platform consolidation tree上維護。在下一個merge window到來的時候,將patch發送給Linus。

針對重復的代碼問題,如果不同的SOC使用了相同的IP block(例如I2C controller),那么這個driver的code要從各個arch/arm/mach-xxx中獨立出來,變成一個通用的模塊供各個SOC specific的模塊使用。移動到哪個目錄呢?對于I2C或者USB OTG而言,這些HW block的驅動當然應該移動到kernel/drivers目錄。因為,對于這些外設,可能是in-chip,也可能是off-chip的,但是對于軟體而言,它們是沒有差別的(或者說好的軟體抽象應該掩蓋底層硬體的不同)。對于那些system level的code呢?例如clock control、interrupt control。其實這些也不是ARM-specific,應該屬于linux kernel的核心代碼,應該放到linux/kernel目錄下,屬于core-Linux-kernel frameworks。當然對于ARM平臺,也需要保存一些和framework互動的code,這些code叫做ARM SoC core architecture code。OK,總結一下:

1、ARM的核心代碼仍然保存在arch/arm目錄下

2、ARM SoC core architecture code保存在arch/arm目錄下

3、ARM SOC的周邊外設模塊的驅動保存在drivers目錄下

4、ARM SOC的特定代碼在arch/arm/mach-xxx目錄下

5、ARM SOC board specific的代碼被移除,由Device Tree機制來負責傳遞硬體拓撲和硬體資源資訊。

OK,終于來到了Device Tree了。本質上,Device Tree改變了原來用hardcode方式將HW 配置資訊嵌入到內核代碼的方法,改用bootloader傳遞一個DB的形式。對于基于ARM CPU的嵌入式系統,我們習慣于針對每一個platform進行內核的編譯。但是隨著ARM在消費類電子上的廣泛應用(甚至桌面系統、服務器系統),我們期望ARM能夠象X86那樣用一個kernel image來支持多個platform。在這種情況下,如果我們認為kernel是一個black box,那么其輸入引數應該包括:

1、識別platform的資訊

2、runtime的配置引數

3、設備的拓撲結構以及特性

對于嵌入式系統,在系統啟動階段,bootloader會加載內核并將控制權轉交給內核,此外,還需要把上述的三個引數資訊傳遞給kernel,以便kernel可以有較大的靈活性。在linux kernel中,Device Tree的設計目標就是如此。

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/177225.html

標籤:驅動開發/核心開發

上一篇:面試了北京20多家大廠總結的2020最新Java面試題:資料庫+快取+并發編程+Spring+JVM+Netty等

下一篇:Alibaba限發“Java從入門到架構成長筆記庫”,人與人之間的差距就是這樣來的!

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more