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