計(jì)算機(jī)運(yùn)行在物理世界中,物理世界中的一切活動都需要消耗能量。能量的形式有很多種,如熱能、核能、化學(xué)能等。計(jì)算機(jī)消耗的是電能,其來源是電池或者外電源。計(jì)算機(jī)內(nèi)部有一個(gè)部件叫做電源管理芯片(PMIC),它接收外部的電能,然后轉(zhuǎn)化為不同電壓的電流,向系統(tǒng)的各個(gè)硬件供電。什么硬件需要多少伏的電壓,都是由相應(yīng)的電氣標(biāo)準(zhǔn)規(guī)定好了的,各個(gè)硬件廠商按照標(biāo)準(zhǔn)生成硬件就可以了。上電的過程是由硬件自動完成的,不需要軟件的參與。因?yàn)橛布簧想姷脑?,軟件也沒法運(yùn)行啊。但是當(dāng)硬件運(yùn)行起來之后,軟件就可以對硬件的電源狀態(tài)進(jìn)行管理了。電源管理的內(nèi)容包括電源狀態(tài)管理和省電管理。電源狀態(tài)管理是對整個(gè)系統(tǒng)的供電狀態(tài)進(jìn)行管理,內(nèi)容包括睡眠、休眠、關(guān)機(jī)、重啟等操作。省電管理是因?yàn)殡娔懿皇敲赓M(fèi)的,我們應(yīng)該盡量地節(jié)省能源,尤其是對于一些手持設(shè)備來說,電能雖然并不昂貴但是卻非常珍貴,因?yàn)殡姵氐娜萘糠浅S邢?。不過省電管理也不能一味地省電,還要考慮性能問題,在性能與功耗之間達(dá)到平衡。
在我仔細(xì)研究Linux內(nèi)核中的ftrace之后,發(fā)現(xiàn)ftrace中的各個(gè)tracers的作用一直被人們嚴(yán)重低估了, 比如我們會花了大量的時(shí)間去理解Linux內(nèi)核中的一塊代碼,然后猜測可能的執(zhí)行流, 但是ftrace會首先直接告訴你整個(gè)執(zhí)行流,然后你再去查看代碼,這樣無論從效率和準(zhǔn)確度來講都是極大的提升。
雖然經(jīng)常更新內(nèi)核版本通常被認(rèn)為是一種安全最佳實(shí)踐,但由于各種原因,尤其是生產(chǎn)環(huán)境中的服務(wù)器無法這樣操作。這就意味著在機(jī)器運(yùn)行時(shí),會存在利用已知的漏洞(當(dāng)然,還會有一些未知的漏洞)來進(jìn)行攻擊的情況,所以需要某種方法來檢測和阻止對這些漏洞的利用,這正是Linux Kernel Runtime Guard(Linux內(nèi)核運(yùn)行時(shí)保護(hù)LKRG)誕生目的所在。
從文章Linux Kernel運(yùn)行時(shí)安全檢測之LKRG-原理篇可以看到,LKRG可以對正在運(yùn)行的Linux內(nèi)核進(jìn)行檢測,并希望能夠及時(shí)響應(yīng)對正在運(yùn)行的進(jìn)程用戶id等憑證未經(jīng)授權(quán)的修改(完整性檢查)。對于進(jìn)程憑據(jù),LKRG嘗試檢測漏洞,并在內(nèi)核根據(jù)未經(jīng)授權(quán)的憑據(jù)授予訪問權(quán)限(例如打開文件)之前采取行動。并且是以可加載的內(nèi)核模塊的形式,檢測正在運(yùn)行的內(nèi)核是否存在更改情況,以表明正在對其使用某種類型的漏洞利用。除此之外,它還可以檢查系統(tǒng)上運(yùn)行的進(jìn)程,以查找對各種憑證的未經(jīng)授權(quán)修改,以防止這些更改授予額外的訪問權(quán)限。
邢孟棒,曾供職于阿里、網(wǎng)易,目前在騰訊云專職做性能優(yōu)化方向。Linux 業(yè)余愛好者,偏好鉆研各類工具源碼與底層技術(shù)原理。在日常的性能工程實(shí)踐中,比較注重方法論的探索、優(yōu)化案例的沉淀。熱衷于 eBPF 技術(shù),擅長傳統(tǒng)工具與 BPF 工具的結(jié)合應(yīng)用。
大家都聽說過紅黑樹,也都知道紅黑樹很厲害,是計(jì)算機(jī)里面評價(jià)非常高的數(shù)據(jù)結(jié)構(gòu)。但是每當(dāng)想學(xué)習(xí)紅黑樹的時(shí)候,卻總是找不到通俗易懂很好理解的學(xué)習(xí)資料。很多書上上來就是紅黑樹的定義,然后就是紅黑樹的實(shí)現(xiàn),直接就把人給整暈了。光看紅黑樹的定義就有5條,為什么要有5條定義,為什么要這么定義,這么定義是什么意思,光定義都讓人懵了,更別說實(shí)現(xiàn)了。我看最近抖音上有很多人在講底層邏輯,只要你掌握了底層邏輯,其它的問題都不在話下,今天我們也來講一講紅黑樹的底層邏輯。在講之前我們先介紹一下紅黑樹的誕生,紅黑樹是Rudolf Bayer在1972年首先提出來的,不過當(dāng)時(shí)并不叫紅黑樹,而是叫對稱二叉 B 樹(symmetric binary B-trees)。后來在1978年Leo J. Guibas 和 Robert Sedgewick 對此數(shù)據(jù)結(jié)構(gòu)進(jìn)行了修改和完善,并重新命名為紅黑樹。為什么叫紅黑樹呢?有兩種說法,因?yàn)榧t黑樹中要對節(jié)點(diǎn)連接做兩種顏色的區(qū)分,一說是因?yàn)楫?dāng)時(shí)的書寫筆只有紅色和黑色兩種顏色,另一說是當(dāng)時(shí)的打印機(jī)只有紅和黑兩種顏色。
我們先來說一說什么是排序、為什么要排序。什么是排序,這個(gè)很簡單,就是把無序的東西按照一定的規(guī)則順序排列成升序或者降序。為什么要排序,有兩個(gè)原因,一是為了方便后面的查找,如果沒有排序的話只能進(jìn)行線性查找,時(shí)間復(fù)雜度是O(n),如果排序了就可以進(jìn)行二分查找,時(shí)間復(fù)雜度是O(logn),復(fù)雜度一下子就大大降低了。我們來說明一下這兩種復(fù)雜度的差別有多么懸殊(雖然用詞錯(cuò)誤,但是這么用確實(shí)很符合氣氛),假設(shè)n是10億的話,O(n)還是10億,而O(logn)是30多(以2為底,假設(shè)系數(shù)是1),30多和10億比都可以忽略不計(jì)了。二是為了顯示的時(shí)候按照順序顯示,人類的習(xí)慣就是喜歡看有序的東西。
在我仔細(xì)研究Linux內(nèi)核中的ftrace之后,發(fā)現(xiàn)ftrace中的各個(gè)tracers的作用一直被人們嚴(yán)重低估了, 比如我們會花了大量的時(shí)間去理解Linux內(nèi)核中的一塊代碼,然后猜測可能的執(zhí)行流, 但是ftrace會首先直接告訴你整個(gè)執(zhí)行流,然后你再去查看代碼,這樣無論從效率和準(zhǔn)確度來講都是極大的提升。
我們先拿人來做個(gè)類比,人與人之間為什么要通信,有兩個(gè)原因。首先是因?yàn)槟阌泻蛯Ψ綔贤ǖ男枨螅绻愣疾幌氪罾韺Ψ?,那就肯定不用通信了。其次是因?yàn)橛锌臻g隔離,如果你倆在一起,對方就站在你面前,你有話直說就行了,不需要通信。此時(shí)你非要給對方打個(gè)電話或者發(fā)個(gè)微信,是不是顯得非常奇怪、莫名其妙。如果你倆不在一塊,還有事需要溝通,此時(shí)就需要通信了。通信的方式有點(diǎn)烽火、送信鴿、寫信、發(fā)電報(bào)、打電話、發(fā)微信等。采取什么樣的通信方式跟你的需求、通信量的大小、以及客觀上能否實(shí)現(xiàn)有關(guān)。
正如Linus Torvalds曾經(jīng)說過的,大多數(shù)安全問題都是bug造成的,而bug又是軟件開發(fā)過程的一部分,是軟件就有bug。至于是安全還是非安全漏洞BUG,內(nèi)核社區(qū)的做法就是盡可能多的測試,找出更多潛在漏洞這樣近似于黑名單的做法。Greg Kroah-Hartman說:“一旦我們修復(fù)了它,我們就將它放到我們的棧分析規(guī)則中,以便于以后不再重新出現(xiàn)這個(gè)bug?!比绻麤]有2015年11月5號華盛頓郵報(bào)的一篇關(guān)于內(nèi)核安全性的爆炸性專題報(bào)道《Net of insecurity the kernel of the argument》,內(nèi)核社區(qū)應(yīng)該仍會固守“A bug is bug”的理念(雖然如今也沒有改變太多)。這篇文章狠狠的批評了內(nèi)核社區(qū)對內(nèi)核安全的態(tài)度,批評Linux “沒有一個(gè)系統(tǒng)性的機(jī)制能在黑客之前發(fā)現(xiàn)和解決安全問題,或引入更新的防御技術(shù)”,“甚至Linux內(nèi)核開發(fā)社區(qū)都沒有一個(gè)首席安全官”等等。
我是從ARM7TDMI開始接觸ARM架構(gòu)的,當(dāng)時(shí)很幸運(yùn)有DSP的學(xué)習(xí)基礎(chǔ),同時(shí)遇到了把ARM架構(gòu)和操作系統(tǒng)結(jié)合講解的書籍。這樣,結(jié)合自己不斷的實(shí)踐,一直可以跟上ARM架構(gòu)的演進(jìn)。長期的跟蹤也讓我容易能看到ARM的趨勢,我從Linaro在做ARM NEON指令集優(yōu)化關(guān)注到Linaro,后面持續(xù)的關(guān)注以Linaro為首ARM生態(tài)組織的發(fā)展,幾年后的2017年,我作為演講人分享了ARM架構(gòu)下的一個(gè)TLB性能優(yōu)化方案,實(shí)現(xiàn)了從關(guān)注到深度參與到過程。
我們生活中幾乎到處都能接觸到計(jì)算機(jī),從我們?nèi)粘J褂玫氖謾C(jī)、平板,到辦公使用的筆記本、臺式機(jī),到銀行的ATM機(jī),到各處可見的監(jiān)控設(shè)備,還有我們平時(shí)看不見但是我們?yōu)g覽的網(wǎng)頁其所在的服務(wù)器,還有微信、抖音等我們?nèi)粘K玫腁PP它們所在的服務(wù)器,等等,這些都是計(jì)算機(jī)。如果沒有了計(jì)算機(jī),我們的生活將難以想象。那么究竟什么是計(jì)算機(jī)呢,這個(gè)還真不好下定義的,那我們就來看一下百度百科對計(jì)算機(jī)的定義:計(jì)算機(jī)俗稱電腦,是現(xiàn)代一種用于高速計(jì)算的電子計(jì)算機(jī)器,可以進(jìn)行數(shù)值計(jì)算,又可以進(jìn)行邏輯計(jì)算,還具有存儲記憶功能。是能夠按照程序運(yùn)行,自動、高速處理海量數(shù)據(jù)的現(xiàn)代化智能電子設(shè)備。計(jì)算機(jī)的應(yīng)用非常廣泛,從我們?nèi)粘W畛R姷呐_式機(jī)、筆記本到手機(jī)平板都是計(jì)算機(jī),而且大到服務(wù)器、超級計(jì)算機(jī),小到各種嵌入式設(shè)備也都是計(jì)算機(jī)?,F(xiàn)在我們對計(jì)算機(jī)既有了感性的認(rèn)識,又知道了的它的權(quán)威定義,那么計(jì)算機(jī)是怎么產(chǎn)生的呢,下面我們來看一看計(jì)算機(jī)的發(fā)展史。
在我仔細(xì)研究Linux內(nèi)核中的ftrace之后,發(fā)現(xiàn)ftrace中的各個(gè)tracers的作用一直被人們嚴(yán)重低估了, 比如我們會花了大量的時(shí)間去理解Linux內(nèi)核中的一塊代碼,然后猜測可能的執(zhí)行流, 但是ftrace會首先直接告訴你整個(gè)執(zhí)行流,然后你再去查看代碼,這樣無論從效率和準(zhǔn)確度來講都是極大的提升。
隨著2003年10月安迪魯賓聯(lián)合幾位朋友創(chuàng)建了Android公司,后來影響眾人的智能設(shè)備操作系統(tǒng)公司由此而生(2005年被Google收購)?,F(xiàn)如今,世界上越來越多的智能終端包括手機(jī)、TV、SmartBox和IoT、汽車、多媒體設(shè)備等等,均深度使用Android系統(tǒng),而Android的底層正是Linux內(nèi)核,這也讓Linux內(nèi)核的安全性對Android產(chǎn)生重大影響。但由于Android由于想繞過商業(yè)授權(quán)的問題,又研究出來了以bionic取代Glibc、以Skia取代Cairo等類似的方案,使用的不是標(biāo)準(zhǔn)內(nèi)核和GNU/Linux。由于這些原因,Google在Android內(nèi)核開源的問題上,理念和Linux內(nèi)核社區(qū)不是十分的匹配,這也導(dǎo)致了Android對內(nèi)核做了大量的針對性修改,但是無法合入到Upstream上。這也導(dǎo)致了Android內(nèi)核在安全側(cè)有部分不同于Linux內(nèi)核,側(cè)重點(diǎn)也存在不同。
在我仔細(xì)研究Linux內(nèi)核中的ftrace之后,發(fā)現(xiàn)ftrace中的各個(gè)tracers的作用一直被人們嚴(yán)重低估了, 比如我們會花了大量的時(shí)間去理解Linux內(nèi)核中的一塊代碼,然后猜測可能的執(zhí)行流, 但是ftrace會首先直接告訴你整個(gè)執(zhí)行流,然后你再去查看代碼,這樣無論從效率和準(zhǔn)確度來講都是極大的提升。