日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux内核设计与实现看不懂,Linux内核设计与实现读书笔记

發(fā)布時間:2024/9/3 linux 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux内核设计与实现看不懂,Linux内核设计与实现读书笔记 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Unix強(qiáng)大的根本原因: Unix簡潔, 提供幾百個系統(tǒng)調(diào)用, 設(shè)計目的明確 Unix中 所有東西都被當(dāng)做文件對待 Unix內(nèi)核和相關(guān)系統(tǒng)工具是用C語言開發(fā)的, 移植能力強(qiáng)大 Unix進(jìn)程創(chuàng)建迅速, 有獨(dú)特的fork機(jī)制 Unix提供簡單穩(wěn)定的進(jìn)程間通信元語

Linux是類Unix系統(tǒng), 借鑒了Unix設(shè)計并實(shí)現(xiàn)了Unix的API.

應(yīng)用程序通常調(diào)用庫函數(shù)(如C庫函數(shù))再由庫函數(shù)通過系統(tǒng)調(diào)用界面, 讓內(nèi)核代其完成各種任務(wù). Linux支持動態(tài)加載內(nèi)核模塊 Linux支持對稱多處理(SMP)機(jī)制 Linux為 搶占式內(nèi)核 Linux并不區(qū)分線程和其他的一般進(jìn)程 Linux提供具有設(shè)備類的面向?qū)ο蟮脑O(shè)備模型, 熱插拔事件, 以及用戶控件的設(shè)備文件系統(tǒng)

中斷和中斷處理

中斷是一種解決處理器和速度差異的方案, 只有在硬件需要的時候再向內(nèi)核發(fā)出信號. 中斷本質(zhì)上是一種特殊的電信號. 內(nèi)核響應(yīng)特定中斷, 然后 內(nèi)核 調(diào)用特定的 中斷處理程序 , 終端處理程序是設(shè)備驅(qū)動程序的一部分 Linux中的終端處理程序是不可重入的, 同一個中斷處理程序不會被同時調(diào)用 中斷上下文不可以睡眠(我理解當(dāng)前被中斷的程序再中斷處理結(jié)束后需要繼續(xù)執(zhí)行) 中斷處理程序不在進(jìn)程上下文中進(jìn)行, 他們不能阻塞 中斷處理分為兩部分, 上半部為中斷處理程序, 要求盡可能快的執(zhí)行, 下半部( 用于減少中斷處理程序的工作量 )執(zhí)行與中斷處理密切相關(guān)但中斷處理程序本身不執(zhí)行的工作 下半部的實(shí)現(xiàn)方法 軟中斷、tasklet、工作隊(duì)列 ,

中斷機(jī)制的實(shí)現(xiàn):設(shè)置產(chǎn)生中斷, 通過電信號給處理器的特定管腳發(fā)送一個信號, 處理器聽著當(dāng)前處理工作, 關(guān)閉中斷系統(tǒng) , 然后調(diào)到內(nèi)存中預(yù)定義的位置(中斷處理程序的入口點(diǎn))開始執(zhí)行.計算終端號, do_IRQ() 對接收的中斷進(jìn)行應(yīng)答, 禁止這條線上的中斷傳遞.

內(nèi)核同步

對于共享資源, 如果同時被多個線程訪問和操作, 就可能發(fā)生各線程之間相互覆蓋共享數(shù)據(jù), 造成訪問數(shù)據(jù)不一致.

同步實(shí)現(xiàn)通過主要 鎖機(jī)制 對共享資源進(jìn)行加鎖, 只有持有鎖的線程才能操作共享資源, 其他線程睡眠(或者輪詢). 資源操作完成后, 持有鎖的線程釋放鎖, 由等待線程搶鎖.

內(nèi)核同步方法: 原子操作 自旋鎖 , 特性是當(dāng)線程無法獲取鎖, 會一直忙循環(huán)( 忙等 )等待鎖重新可以, 適用于短期輕量級加鎖 讀/寫自旋鎖 (共享/排它鎖), 一個或多個任務(wù)可以并發(fā)的持有讀者鎖, 寫者鎖只能被一個寫任務(wù)持有. 信號量 (睡眠鎖), 如果一個任務(wù)試圖獲得一個被占用的信用量時, 信號量會將其推進(jìn)一個等待隊(duì)列, 然后讓其睡眠. 當(dāng)信號量可用后, 等待隊(duì)列中的任務(wù)會被喚醒. 適用于鎖被長期占用的時候. mutex(計數(shù)為1的信號量), 這個是編程中最常見的. 順序鎖 屏障 (barriers), 用于確保指令序列和讀寫的執(zhí)行順序

內(nèi)核中造成并發(fā)的原因: 中斷, 幾乎可以再任何時刻異步發(fā)生, 可能隨時打斷當(dāng)前正在執(zhí)行的代碼 軟中斷和tasklet, 內(nèi)核能在任何時刻喚醒或調(diào)度軟中斷或tasklet, 打斷當(dāng)前正在執(zhí)行的代碼 內(nèi)核搶占 睡眠及與用戶空間的同步 對稱多處理, 多個處理器同時執(zhí)行代碼

內(nèi)存管理

內(nèi)核把物理頁作為內(nèi)存管理的基本單位, 內(nèi)存管理單元(MMU, 管理內(nèi)存并將虛擬地址轉(zhuǎn)換為物理地址) 通常以頁為單位來管理系統(tǒng)中的頁表.

內(nèi)核把也劃分為不同的區(qū)( zone ), 使用區(qū)對具有相似特性的頁進(jìn)行分組 //??該函數(shù)分配2的order次方個連續(xù)`物理頁`,?返回指針指向第一個頁的page結(jié)構(gòu)體??staticinlinestructpage?*??alloc_pages(gfp_tgfp_mask,unsignedintorder)??//?釋放物理頁??externvoidfree_pages(unsignedlongaddr,unsignedintorder);??//以字節(jié)為單位分配一塊內(nèi)核內(nèi)存(物理上連續(xù))??static__always_inlinevoid*kmalloc(size_tsize,gfp_tflags)??//釋放kmalloc分配的內(nèi)存塊??voidkfree(constvoid*);

虛擬文件系統(tǒng)

虛擬文件系統(tǒng)為用戶控件程序提供了文件和文件系統(tǒng)相關(guān)接口.

文件的元數(shù)據(jù), 被存儲在一個單獨(dú)的數(shù)據(jù)結(jié)構(gòu)中, 被稱為 inode (索引節(jié)點(diǎn))

虛擬文件系統(tǒng)(VFS)有四個主要的對象模型: 超級塊對象, 代表一個具體的已安裝文件系統(tǒng), 存儲特定文件系統(tǒng)的信息 索引節(jié)點(diǎn)對象, 代表一個具體文件, 包含內(nèi)核在操作文件或目錄時需要的全部信息, 一個索引節(jié)點(diǎn)代表文件系統(tǒng)中的一個文件, 目錄項(xiàng)對象, 代表一個目錄項(xiàng), 是路徑的一個組成部分, VFS把目錄當(dāng)做文件處理 , 目錄項(xiàng)對象沒有對應(yīng)的磁盤數(shù)據(jù)結(jié)構(gòu) 文件對象, 代表進(jìn)程打開的文件, 進(jìn)程直接處理的是文件 //??文件對象的數(shù)據(jù)結(jié)構(gòu)?structfile?{?union{?structllist_node?fu_llist;?structrcu_head?fu_rcuhead;??}?f_u;?structpath?f_path;?structinode?*f_inode;/*?cached?value?*/?conststructfile_operations?*f_op;??/*??*?Protects?f_ep_links,?f_flags.??*?Must?not?be?taken?from?IRQ?context.??*/?spinlock_tf_lock;?atomic_long_tf_count;?unsignedintf_flags;?fmode_tf_mode;?structmutex?f_pos_lock;?loff_tf_pos;?structfown_struct?f_owner;?conststructcred?*f_cred;?structfile_ra_state?f_ra;???u64?f_version;?#ifdefCONFIG_SECURITY?void*f_security;?#endif?/*?needed?for?tty?driver,?and?maybe?others?*/?void*private_data;??#ifdefCONFIG_EPOLL?/*?Used?by?fs/eventpoll.c?to?link?all?the?hooks?to?this?file?*/?structlist_head?f_ep_links;?structlist_head?f_tfile_llink;?#endif/*?#ifdef?CONFIG_EPOLL?*/?structaddress_space?*f_mapping;?}?__attribute__((aligned(4)));/*?lest?something?weird?decides?that?2?is?OK?*/

塊I/O層

系統(tǒng)中能夠 隨機(jī)訪問 固定大小數(shù)據(jù)片(chunks)的硬件設(shè)備稱作塊設(shè)備, 如硬盤. 按照字符流的方式被 有序訪問 的硬件設(shè)備稱為字符設(shè)備, 如鍵盤 #?I/O設(shè)備基本容器由bio結(jié)構(gòu)體表示? I/O調(diào)度程序 用于管理塊設(shè)備的請求隊(duì)列, 決定隊(duì)列中的請求排列順序以及什么時刻派發(fā)請求到掛設(shè)備. 這樣有利于減少磁盤的尋址時間, 從而提高全局的吞吐量 linux實(shí)際使用的I/O調(diào)度程序有 linux電梯, 最終期限I/O調(diào)度, 預(yù)測I/O調(diào)度程序, 空操作的I/O調(diào)度程序

進(jìn)程地址空間

內(nèi)核需要管理用戶空間中進(jìn)程的內(nèi)存, 這個內(nèi)存稱為 進(jìn)程地址空間 , 系統(tǒng)中所有進(jìn)程之間以虛擬方式共享內(nèi)存.

進(jìn)程地址空間由進(jìn)程可尋址的虛擬內(nèi)存組成, 每個進(jìn)程有32位或64位地址空間.

虛擬地址空間, 可被訪問的合法地址空間稱為 內(nèi)存區(qū)域 : 可執(zhí)行文件代碼的內(nèi)存映射, 稱為代碼段 可執(zhí)行文件的已初始化全局變量的內(nèi)存映射, 稱為數(shù)據(jù)段 包含未初始化全局變量,bss(block started by symbol)段的零頁的內(nèi)存映射 用于進(jìn)程用戶空間棧的零頁內(nèi)存映射 每一個如C庫或動態(tài)鏈接程序等共享庫的代碼段、數(shù)據(jù)段和bss會被載入進(jìn)程的地址空間 任何內(nèi)存映射文件 任何共享內(nèi)存段 任何匿名的內(nèi)存映射, 如malloc分配的內(nèi)存

內(nèi)核使用內(nèi)存描述符結(jié)構(gòu)體表示進(jìn)程的地址空間, 內(nèi)存描述符由mm_struct( )結(jié)構(gòu)體表示. 內(nèi)核線程沒有進(jìn)程地址空間, 也沒有相關(guān)的內(nèi)存描述符, 所有內(nèi)核線程沒有用戶上下文

應(yīng)用程序操作的對象是 映射到物理內(nèi)存上的虛擬內(nèi)存 , 而處理器操作的是物理內(nèi)存, Linux使用三級頁表完成地址轉(zhuǎn)換, 每個虛擬地址作為索引指向頁表, 頁表項(xiàng)則指向下一級的頁表. 在多級頁表中通過TLB(translate lookaside buffer)作為一個虛擬地址映射到物理地址的緩存

點(diǎn)贊 0

總結(jié)

以上是生活随笔為你收集整理的linux内核设计与实现看不懂,Linux内核设计与实现读书笔记的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。