国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

linux內(nèi)核中percpu變量的實(shí)現(xiàn)

Linux閱碼場 ? 來源:Linuxer ? 作者:Linuxer ? 2021-01-04 13:39 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

我們在使用各種編程語言進(jìn)行多線程編程時(shí),經(jīng)常會用到thread local變量。

所謂thread local變量,就是對于同一個(gè)變量,每個(gè)線程都有自己的一份,對該變量的訪問是線程隔離的,它們之間不會相互影響,所以也就不會有各種多線程問題。

正確的使用thread local變量,能極大的簡化多線程開發(fā)。所以不管是c/c++/rust,還是java/c#等,都內(nèi)置了對thread local變量的支持。

但你知道嗎,不僅是在編程語言中,在linux內(nèi)核中,也有一個(gè)類似的機(jī)制,用來實(shí)現(xiàn)類似的目的,它叫做percpu變量。

percpu變量,顧名思義,就是對于同一個(gè)變量,每個(gè)cpu都有自己的一份,它可以被用來存放一些cpu獨(dú)有的數(shù)據(jù),比如cpu的id,cpu上正在運(yùn)行的線程等等,因該機(jī)制可以非常方便的解決一些特定問題,所以在內(nèi)核編程中被廣泛使用。

好奇的你們肯定都在問,它是怎么實(shí)現(xiàn)的呢?

我們先不管細(xì)節(jié),先來看一張圖,這樣從全局的角度來了解下它的實(shí)現(xiàn)。

095e34cc-4e4d-11eb-8b86-12bb97331649.png

從上圖中我們可以看到,各種源文件中通過DEFINE_PER_CPU的方式,定義了很多percpu變量,這些變量根據(jù)vmlinux.lds.S中的相關(guān)定義,會被linker聚合在一起,然后放到最終vmlinux文件的,一個(gè)名叫.data..percpu的section里。

這些變量的地址也是被特殊處理過的,它們從零開始依次遞增,這樣一個(gè)變量的地址,就是該變量在整個(gè)vmlinux的.data..percpu區(qū)里的位置,有了這個(gè)位置,然后再知道某個(gè)cpu的percpu內(nèi)存塊的起始地址,就可以很方便的計(jì)算出該cpu對應(yīng)的該變量的運(yùn)行時(shí)內(nèi)存地址。

linux內(nèi)核在啟動(dòng)時(shí),會先把vmlinux文件加載到內(nèi)存中,然后根據(jù)cpu的個(gè)數(shù),為每個(gè)cpu都分配一塊用于存放percpu變量的內(nèi)存區(qū)域,之后把vmlinux中的.data..percpu section里的內(nèi)容,拷貝到各個(gè)cpu的percpu內(nèi)存塊的static區(qū)域里,最后將各percpu內(nèi)存塊的起始地址放到對應(yīng)cpu的gs寄存器里。

到這里有關(guān)percpu變量的初始化工作就已經(jīng)結(jié)束了。

當(dāng)我們在訪問percpu變量時(shí),只需要將gs寄存器里的地址,加上我們想要訪問的percpu變量的地址,就能得到在該cpu上,該percpu變量真實(shí)的內(nèi)存地址。

有了這個(gè)地址,我們就可以方便的操作這個(gè)percpu變量了。

上圖中重點(diǎn)描述的是那些,在內(nèi)核編譯期就已經(jīng)確定的percpu變量,這些變量是靜態(tài)的,是不會隨著時(shí)間的推移而動(dòng)態(tài)的增加或減少的,所以它們在內(nèi)核初始化時(shí),就直接被拷貝到了各個(gè)percpu內(nèi)存塊的static區(qū)。

除了這種靜態(tài)percpu變量,還有另外兩種percpu變量。

其中一種是內(nèi)核模塊中的靜態(tài)percpu變量,它雖然也是在編譯期就能確定的,但由于內(nèi)核模塊動(dòng)態(tài)加載的特性,它不是完全靜態(tài)的,內(nèi)核為這種percpu變量在percpu內(nèi)存塊中單獨(dú)開辟了一個(gè)區(qū)域,叫reserved區(qū),當(dāng)內(nèi)核模塊被加載到內(nèi)存時(shí),其靜態(tài)percpu變量就會在這個(gè)區(qū)域分配內(nèi)存。

另外一種percpu變量就是純動(dòng)態(tài)的percpu變量,它是在運(yùn)行時(shí)動(dòng)態(tài)分配的,它使用的內(nèi)存是上圖中的dynamic區(qū)。

static區(qū)的大小是在編譯期就算好的,是固定不變的,reserved區(qū)也是固定不變的,但其大小是預(yù)估的,dynamic區(qū)是可以動(dòng)態(tài)增加的。

雖然這三種percpu變量的分配方式不同,但它們的內(nèi)在機(jī)制本質(zhì)上都是一樣的,所以這里我們只講內(nèi)核里的靜態(tài)percpu變量,對其他兩種方式感興趣的同學(xué),可以參考內(nèi)核源碼自己研究下。

下面我們就用一個(gè)具體的例子,來看下percpu變量到底是怎么實(shí)現(xiàn)的。

098e7696-4e4d-11eb-8b86-12bb97331649.png

上圖中的current表示要獲取當(dāng)前線程對象,它其實(shí)是一個(gè)宏,具體定義如下:

09d1f36c-4e4d-11eb-8b86-12bb97331649.png

由上可見,current獲取的當(dāng)前線程對象其實(shí)是一個(gè)名為current_task的percpu變量。

在get_current方法中,通過this_cpu_read_stable方法,獲取屬于當(dāng)前cpu的current_task。

this_cpu_read_stable方法其實(shí)也是一個(gè)宏,它全部展開后是下面這個(gè)樣子:

0a0caba6-4e4d-11eb-8b86-12bb97331649.png

在這里,我們先不講宏展開后各語句到底是什么意思,我們先跑個(gè)題。 讀過linux內(nèi)核源碼的同學(xué)都知道,在linux內(nèi)核中,宏使用的非常多,且比較復(fù)雜,如果我們對自己進(jìn)行宏展開的正確性沒有信心的話,可以使用下面我介紹的這個(gè)方式,使用它,你可以非常容易的得到任意文件宏展開后的結(jié)果。

我們知道,一個(gè)程序的構(gòu)建分為預(yù)處理、編譯、匯編、鏈接這些階段,而宏展開就發(fā)生在預(yù)處理階段。 各個(gè)階段在完成后,一般都會生成一個(gè)臨時(shí)文件給下一階段使用,這些臨時(shí)文件默認(rèn)是不會保存到磁盤上的,但我們可以通過指定一些參數(shù),告知gcc幫我們保留下來這些臨時(shí)文件,這樣我們就可以查看各個(gè)階段的生成內(nèi)容了。

依據(jù)該思路,我們只要在編譯比如上面的net/socket.c文件時(shí),加上這些參數(shù),我們就能得到這些臨時(shí)文件,也就可以查看其預(yù)處理之后的宏展開是什么樣子的了。 但是,如果只是為了查看單個(gè)文件的宏展開后結(jié)果,就保存下整個(gè)內(nèi)核中,所有源文件編譯時(shí)的臨時(shí)文件,這是非常耗時(shí)且不劃算的,那有沒有辦法可以想查看哪個(gè)文件的宏展開,就單獨(dú)編譯一次那個(gè)文件呢? 還真有。

其實(shí)說起來該方法也很簡單,我們只需要知道編譯某個(gè)文件時(shí)使用的編譯命令是什么,這樣當(dāng)我們需要查看這個(gè)文件的宏展開時(shí),再使用這個(gè)編譯命令,且加上一些特定的參數(shù),再編譯一遍,這樣就能得到該文件編譯過程中,各階段的臨時(shí)文件了。 那如何找到編譯各個(gè)源文件時(shí)使用的命令呢?

這個(gè)內(nèi)核其實(shí)已經(jīng)幫我們做好了。 當(dāng)我們在編譯內(nèi)核時(shí),內(nèi)核中每個(gè)文件被編譯時(shí)使用的命令,都會保存到一個(gè)對應(yīng)的臨時(shí)文件里,比如上面net/socket.c文件的編譯命令就保存在下面的文件里:

0a40bcc0-4e4d-11eb-8b86-12bb97331649.png

net/socket.c的編譯命令就是上圖中的第一行,從gcc開始到該行結(jié)束的部分。 這個(gè)編譯命令夠復(fù)雜吧,但我們不用管,我們只用知道,使用該命令,就可以將net/socket.c編譯成net/socket.o。 現(xiàn)在我們在該命令的基礎(chǔ)上,加上-save-temps=obj參數(shù),告知gcc在編譯時(shí)保留下各階段的臨時(shí)文件,具體操作流程如下:

0a7fdec8-4e4d-11eb-8b86-12bb97331649.png

由上可見,加上-save-temps=obj參數(shù)后,該編譯過程多生成兩個(gè)文件,而net/socket.i就是gcc預(yù)處理之后的文件。 打開net/socket.i,并找到我們需要的get_current方法:

0ac1897c-4e4d-11eb-8b86-12bb97331649.png

看上圖中的選中部分,其內(nèi)容和我們自己宏展開后的結(jié)果,是完全一樣的。 這個(gè)方法還不錯(cuò)吧。 當(dāng)然,我們還可以通過反編譯的方式,進(jìn)一步確認(rèn)下宏展開后確實(shí)是這樣:

0aecae04-4e4d-11eb-8b86-12bb97331649.png

由上可見,宏展開后其實(shí)主要就是一條mov指令,其中current_task變量地址的值為0x16d00。 該指令的意思是,將gs寄存器里的地址,和current_task的地址相加,然后將相加后地址指向的內(nèi)存空間里的值,移動(dòng)到rax里。 這個(gè)和我們上面提到的,percpu的實(shí)現(xiàn)機(jī)制是一致的。 好,我們回到上文中斷的部分,來繼續(xù)看下get_current方法里宏展開后各語句的意思。

上文講到,get_current方法里的this_cpu_read_stable方法宏展開后主要是一條asm語句,可能有些同學(xué)對該語句不太熟悉,它其實(shí)并不是c語言標(biāo)準(zhǔn)規(guī)范里的語法,而是gcc對c標(biāo)準(zhǔn)的擴(kuò)展,通過asm語句,我們可以在c中直接執(zhí)行匯編指令。 有關(guān)其詳細(xì)的語法規(guī)則,可以參考以下鏈接: https://gcc.gnu.org/onlinedocs/gcc/Using-Assembly-Language-with-C.html#Using-Assembly-Language-with-C

不關(guān)心細(xì)節(jié)的同學(xué)可以不用去看具體語法,我們只要知道該asm語句的意思是,獲取current_task的地址,將該地址與gs段寄存器里的基礎(chǔ)地址值相加,得到一個(gè)最終的地址,然后通過mov指令,將該最終地址指向的內(nèi)存的值,放到pfo_val__變量里。 該指令執(zhí)行完畢后,pfo_val__變量里存放的值,就是當(dāng)前cpu執(zhí)行的當(dāng)前線程對象struct task_struct的地址,也就是說,pfo_val__變量為當(dāng)前正在執(zhí)行的線程對象的指針。

那為什么通過這種方式,得到的就是當(dāng)前cpu正在執(zhí)行的當(dāng)前線程對象的指針呢? 這個(gè)其實(shí)上文我們已經(jīng)講過了,關(guān)鍵點(diǎn)在于gs寄存器中存放的是當(dāng)前cpu的percpu內(nèi)存塊的起始地址,而current_task的地址表示的又是,current_task變量在任意percpu內(nèi)存塊的位置,所以這兩個(gè)地址一相加,得到的自然就是當(dāng)前cpu的current_task變量的當(dāng)前值了。 理論上是如此,不過我們還是通過源碼角度再看下。 首先我們來看下current_task變量的定義:

0b59deb6-4e4d-11eb-8b86-12bb97331649.png

DEFINE_PER_CPU還是一個(gè)宏,其展開后如下:

0b89d1de-4e4d-11eb-8b86-12bb97331649.png

在宏展開后的變量定義中,最重要的是指定該變量的section為.data..percpu。 我們再看什么地方使用了這個(gè)section:

0bb45e36-4e4d-11eb-8b86-12bb97331649.png

由上圖可見,PERCPU_INPUT宏里使用了該section,而PERCPU_INPUT宏又被下面的PERCPU_VADDR宏使用。 我們再來看下PERCPU_VADDR宏在哪里使用:

0c2ee5fc-4e4d-11eb-8b86-12bb97331649.png

由上可見PERCPU_VADDR宏又在vmlinux.lds.S文件中使用。 vmlinux.lds.S是一個(gè)鏈接腳本,在鏈接階段,linker會根據(jù)vmlinux.lds.S里的定義,把相同section的內(nèi)核變量或方法,聚合起來,放到最終輸出文件vmlinux的對應(yīng)section里。 比如上面的PERCPU_VADDR宏就是說,把所有源文件中的屬于各種.data..percpu section的變量提取出來,然后依次放入到輸出文件vmlinux的.data..percpu的section中。

上圖中需要注意的是,在調(diào)用PERCPU_VADDR時(shí),傳入的vaddr參數(shù)是0,它表示vmlinux中.data..percpu section里存放的變量地址是從0開始,依次遞增的。 這個(gè)我們之前也說過,該地址是用來表示該變量在.data..percpu section里的位置,也就是說,該地址表示的是該變量在運(yùn)行時(shí)的,各cpu的percpu內(nèi)存塊里的位置。 vmlinux里.data..percpu section存放的變量地址是從0開始的,這個(gè)我們可以通過__per_cpu_start的值得到確認(rèn):

0c512b58-4e4d-11eb-8b86-12bb97331649.png

另一個(gè)需要注意的是,__per_cpu_load的地址值是正常的內(nèi)核編譯地址,它用來指定,當(dāng)vmlinux被加載到內(nèi)存后,vmlinux里的.data..percpu section所處內(nèi)存的位置:

0c75ebdc-4e4d-11eb-8b86-12bb97331649.png

綜上可知,PERCPU_VADDR宏的作用是,將所有源文件中屬于各個(gè).data..percpu section的變量聚合起來,然后依次放到輸出文件vmlinux的.data..percpu section中,且section中的變量地址是從0開始的,這樣這些變量的地址就表示其所處的該section的位置。

另外,PERCPU_VADDR宏里還定義了三個(gè)地址值: __per_cpu_load表示當(dāng)vmlinux被加載到內(nèi)存時(shí),vmlinux中的.data..percpu section所處內(nèi)存位置。 __per_cpu_start的值是0。 __per_cpu_end的值是vmlinux中的.data..percpu section的結(jié)束地址。 這樣通過__per_cpu_load就可以知道當(dāng)vmlinux被加載到內(nèi)存時(shí),.data..percpu section所處位置,通過__per_cpu_end -__per_cpu_start,就可以知道.data..percpu section的大小。

0c958636-4e4d-11eb-8b86-12bb97331649.png

由上可見,內(nèi)核中的percpu變量占用內(nèi)存大小差不多是170KiB。 到這里,有關(guān)percpu變量的所有準(zhǔn)備工作都已做好,下面我們來看下,在內(nèi)核vmlinux文件啟動(dòng)過程中,它是怎么利用這些信息,為各個(gè)cpu分配percpu內(nèi)存塊,初始化內(nèi)存塊數(shù)據(jù),及設(shè)置內(nèi)存塊地址到gs寄存器的。 通過搜索__per_cpu_load,__per_cpu_start,__per_cpu_end我們可以知道,這些內(nèi)存分配工作是在setup_per_cpu_areas方法里完成的:

0cc992aa-4e4d-11eb-8b86-12bb97331649.png

該方法的文件路徑和大致樣子就如上圖所示,為了方便查看,我刪除了很多不必要的代碼。 由于該方法的邏輯非常復(fù)雜,這里我們就不詳細(xì)講解每行代碼了,只看些關(guān)鍵部分。 該方法及相關(guān)方法的主要作用是為每個(gè)cpu分配自己的percpu內(nèi)存塊:

0d00dcc4-4e4d-11eb-8b86-12bb97331649.png

然后將vmlinux的.data..percpu section拷貝到各個(gè)cpu的percpu內(nèi)存塊里:

0d2962ca-4e4d-11eb-8b86-12bb97331649.png

這里的ai->static_size就是__per_cpu_end減去__per_cpu_start的值。 最后設(shè)置各cpu的percpu內(nèi)存塊的起始地址值到各自cpu的gs寄存器里:

0d5d891a-4e4d-11eb-8b86-12bb97331649.png

上圖中需要注意的是gs寄存器的設(shè)置方式,我們知道,在x86_64模式下,段寄存器CS, DS, ES, SS基本上是不用了,F(xiàn)S和GS雖然還在用,但使用傳統(tǒng)的mov指令等方式設(shè)置FS和GS值,支持的地址空間只能到32位,如果想要支持到64位,必須通過寫MSR的形式來完成。 這個(gè)在AMD官方文檔里有詳細(xì)說明:

0d7ce4a4-4e4d-11eb-8b86-12bb97331649.png

在設(shè)置完gs寄存器的值后,我們再回頭來想想,內(nèi)核是如何獲取當(dāng)前cpu的current_task變量的地址值的呢: mov %gs:0x16d00, %rax 現(xiàn)在這行代碼的意思你就完全明白了吧。 到這里,percpu部分的內(nèi)容就已經(jīng)完全講完了,但有關(guān)如何獲取當(dāng)前cpu正在運(yùn)行的當(dāng)前線程的current_task值,還有一點(diǎn)沒講到。 我們知道,一個(gè)cpu是可以運(yùn)行多個(gè)線程的,如果想要讓current_task這個(gè)percpu變量,指向當(dāng)前cpu的當(dāng)前線程,那在線程切換的時(shí)候必須要更新一下current_task:

0da628fa-4e4d-11eb-8b86-12bb97331649.png

如上。 現(xiàn)在,有關(guān)percpu變量的知識,你是否已經(jīng)完全了解了呢,如果還有疑問,可以再去看看文章開始我畫的那張圖,或者給我留言,我們可以一起討論。

責(zé)任編輯:xj

原文標(biāo)題:一張圖看懂linux內(nèi)核中percpu變量的實(shí)現(xiàn)

文章出處:【微信公眾號:Linuxer】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 內(nèi)核
    +關(guān)注

    關(guān)注

    4

    文章

    1467

    瀏覽量

    42873
  • Linux
    +關(guān)注

    關(guān)注

    88

    文章

    11758

    瀏覽量

    219009
  • 變量
    +關(guān)注

    關(guān)注

    0

    文章

    616

    瀏覽量

    29505

原文標(biāo)題:一張圖看懂linux內(nèi)核中percpu變量的實(shí)現(xiàn)

文章出處:【微信號:LinuxDev,微信公眾號:Linux閱碼場】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點(diǎn)推薦

    Linux內(nèi)核bug狩獵指南:從棧跟蹤到修復(fù),官方文檔教你搞定系統(tǒng)核心故障

    內(nèi)核Linux 系統(tǒng)的 “心臟”—— 一旦它出 bug,小則功能異常,大則系統(tǒng)崩潰、死機(jī)。但內(nèi)核 bug 往往藏在百萬行代碼,想快速定位、修復(fù)絕非易事。
    的頭像 發(fā)表于 02-06 16:59 ?3119次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>內(nèi)核</b>bug狩獵指南:從棧跟蹤到修復(fù),官方文檔教你搞定系統(tǒng)核心故障

    Linux內(nèi)核的“心跳”:jiffies如何為系統(tǒng)計(jì)時(shí)?

    Linux 內(nèi)核的世界里,有一個(gè)默默工作的 "計(jì)時(shí)器"——jiffies。它不像我們手機(jī)上的時(shí)鐘那樣顯示年月日,卻掌控著內(nèi)核絕大多數(shù)時(shí)間相關(guān)的操作:從進(jìn)程調(diào)度到設(shè)備驅(qū)動(dòng)的定時(shí)檢查
    的頭像 發(fā)表于 02-04 16:27 ?817次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>內(nèi)核</b>的“心跳”:jiffies如何為系統(tǒng)計(jì)時(shí)?

    深入RK3588內(nèi)核:rockchip_linux_defconfig的作用與調(diào)試價(jià)值

    在 RK3588 芯片的 Linux 開發(fā),有一個(gè)文件始終是開發(fā)者繞不開的核心 ——kernel/arch/arm64/configs/rockchip_linux_defconfig。無論是首次
    的頭像 發(fā)表于 02-03 15:56 ?1156次閱讀
    深入RK3588<b class='flag-5'>內(nèi)核</b>:rockchip_<b class='flag-5'>linux</b>_defconfig的作用與調(diào)試價(jià)值

    Linux系統(tǒng)內(nèi)核參數(shù)調(diào)優(yōu)實(shí)戰(zhàn)指南

    Linux 內(nèi)核參數(shù)調(diào)優(yōu)是系統(tǒng)性能優(yōu)化的核心環(huán)節(jié)。隨著云原生架構(gòu)的普及和硬件性能的飛速提升,默認(rèn)的內(nèi)核參數(shù)配置往往無法充分發(fā)揮系統(tǒng)潛力。在高并發(fā) Web 服務(wù)、大數(shù)據(jù)處理、容器化部署等場景下,合理的
    的頭像 發(fā)表于 01-28 14:27 ?426次閱讀

    【「Linux 設(shè)備驅(qū)動(dòng)開發(fā)(第 2 版)」閱讀體驗(yàn)】Linux內(nèi)核開發(fā)基礎(chǔ)

    ()、msleep_interruptible()這些API用于簡單睡眠 內(nèi)核延遲或忙等待 可以調(diào)用ndelay()、udelay()、mdelay()這些API實(shí)現(xiàn) Linux內(nèi)核時(shí)
    發(fā)表于 01-12 22:45

    【「Linux 設(shè)備驅(qū)動(dòng)開發(fā)(第 2 版)」閱讀體驗(yàn)】+讀內(nèi)核處理的核心輔助函數(shù)

    一個(gè)是“鎖”;另一個(gè)是“條件變量”。內(nèi)核中最常見的鎖是自旋鎖和互斥鎖,操作系統(tǒng)內(nèi)核通常使用硬件提供的原子操作來實(shí)現(xiàn)鎖的機(jī)制。而條件變量并不是
    發(fā)表于 01-10 22:08

    深入Linux內(nèi)核:進(jìn)程調(diào)度的核心邏輯與實(shí)現(xiàn)細(xì)節(jié)

    ,背后都離不開內(nèi)核調(diào)度算法的精準(zhǔn)操控。今天,我們就從優(yōu)先級、調(diào)度算法、時(shí)間片分配到底層實(shí)現(xiàn),全方位拆解Linux內(nèi)核進(jìn)程調(diào)度的核心邏輯。 一、進(jìn)程調(diào)度的“身份標(biāo)識”:優(yōu)先級與分類 要理
    的頭像 發(fā)表于 12-24 07:05 ?4302次閱讀
    深入<b class='flag-5'>Linux</b><b class='flag-5'>內(nèi)核</b>:進(jìn)程調(diào)度的核心邏輯與<b class='flag-5'>實(shí)現(xiàn)</b>細(xì)節(jié)

    基于 DR1M90 的 Linux-RT 內(nèi)核開發(fā):從編譯配置到 GPIO / 按鍵應(yīng)用實(shí)現(xiàn)(1)

    本手冊由創(chuàng)龍科技研發(fā),針對 DR1M90,詳述 Linux-RT 實(shí)時(shí)內(nèi)核開發(fā):含實(shí)時(shí)性測試(LinuxLinux-RT 對比、CPU 空載 / 滿負(fù)荷 / 隔離狀態(tài)測試)、
    的頭像 發(fā)表于 12-02 10:38 ?1176次閱讀
    基于 DR1M90 的 <b class='flag-5'>Linux</b>-RT <b class='flag-5'>內(nèi)核</b>開發(fā):從編譯配置到 GPIO / 按鍵應(yīng)用<b class='flag-5'>實(shí)現(xiàn)</b>(1)

    Linux內(nèi)核模塊的加載機(jī)制

    符號表(/proc/kallsyms)或已加載模塊查找匹配。2、重定位修正:修改代碼的地址引用(如函數(shù)調(diào)用、全局變量訪問)為實(shí)際加載地址。處理版本校驗(yàn)(__versions段),確保符號CRC與
    發(fā)表于 11-25 06:59

    deepin亮相2025Linux內(nèi)核開發(fā)者大會

    11 月 1 日,第二十屆中國 Linux 內(nèi)核開發(fā)者大會(CLK)在深圳舉辦。CLK 作為國內(nèi) Linux 內(nèi)核領(lǐng)域極具影響力的峰會,由清華大學(xué)、Intel、華為、阿里云、富士通南大
    的頭像 發(fā)表于 11-05 17:59 ?818次閱讀

    Linux內(nèi)核參數(shù)調(diào)優(yōu)方案

    在高并發(fā)微服務(wù)環(huán)境,網(wǎng)絡(luò)性能往往成為K8s集群的瓶頸。本文將深入探討如何通過精細(xì)化的Linux內(nèi)核參數(shù)調(diào)優(yōu),讓你的K8s節(jié)點(diǎn)網(wǎng)絡(luò)性能提升30%以上。
    的頭像 發(fā)表于 08-06 17:50 ?947次閱讀

    如何配置和驗(yàn)證Linux內(nèi)核參數(shù)

    Linux系統(tǒng)運(yùn)維和性能優(yōu)化,內(nèi)核參數(shù)(sysctl)的配置至關(guān)重要。合理的參數(shù)調(diào)整可以顯著提升網(wǎng)絡(luò)性能、系統(tǒng)穩(wěn)定性及資源利用率。然而,僅僅修改參數(shù)是不夠的,如何驗(yàn)證這些參數(shù)是否生效同樣關(guān)鍵。
    的頭像 發(fā)表于 05-29 17:40 ?1150次閱讀

    Ansible Playbook變量使用技巧

    在inventory定義的連接變量(比如ansible_ssh_user);優(yōu)先級第二。
    的頭像 發(fā)表于 04-15 10:26 ?982次閱讀

    Linux內(nèi)核編譯失???移動(dòng)硬盤和虛擬機(jī)的那些事兒

    Linux開發(fā),編譯內(nèi)核是一項(xiàng)常見任務(wù),但不少開發(fā)者在移動(dòng)硬盤或虛擬機(jī)環(huán)境下嘗試時(shí)會遭遇失敗。本文將簡要探討這些問題的成因,并介紹一些虛擬機(jī)使用技巧,幫助大家更好地應(yīng)對相關(guān)問題。在移動(dòng)硬盤里編譯
    的頭像 發(fā)表于 04-11 11:36 ?992次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>內(nèi)核</b>編譯失???移動(dòng)硬盤和虛擬機(jī)的那些事兒

    樹莓派4 性能大比拼:標(biāo)準(zhǔn)Linux與實(shí)時(shí)Linux 4.19內(nèi)核的延遲測試

    使用的是raspberrypi/linux倉庫的rpi-4.19.y-rt分支。同樣,在測試,我使用了實(shí)時(shí)Linux項(xiàng)目中的cyclictest程序。Cyclictest程序
    的頭像 發(fā)表于 03-25 09:39 ?809次閱讀
    樹莓派4 性能大比拼:標(biāo)準(zhǔn)<b class='flag-5'>Linux</b>與實(shí)時(shí)<b class='flag-5'>Linux</b> 4.19<b class='flag-5'>內(nèi)核</b>的延遲測試