久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

Linux內(nèi)核設(shè)計(jì)與實(shí)現(xiàn)的方法是什么

共計(jì) 3784 個(gè)字符,預(yù)計(jì)需要花費(fèi) 10 分鐘才能閱讀完成。

今天丸趣 TV 小編給大家分享一下 Linux 內(nèi)核設(shè)計(jì)與實(shí)現(xiàn)的方法是什么的相關(guān)知識(shí)點(diǎn),內(nèi)容詳細(xì),邏輯清晰,相信大部分人都還太了解這方面的知識(shí),所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來(lái)了解一下吧。

 

Unix 強(qiáng)大的根本原因:

Unix 簡(jiǎn)潔, 提供幾百個(gè)系統(tǒng)調(diào)用, 設(shè)計(jì)目的明確

Unix 中 所有東西都被當(dāng)做文件對(duì)待

Unix 內(nèi)核和相關(guān)系統(tǒng)工具是用 C 語(yǔ)言開(kāi)發(fā)的, 移植能力強(qiáng)大

Unix 進(jìn)程創(chuàng)建迅速, 有獨(dú)特的 fork 機(jī)制

Unix 提供簡(jiǎn)單穩(wěn)定的進(jìn)程間通信元語(yǔ)

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

應(yīng)用程序通常調(diào)用庫(kù)函數(shù) (如 C 庫(kù)函數(shù)) 再由庫(kù)函數(shù)通過(guò)系統(tǒng)調(diào)用界面, 讓內(nèi)核代其完成各種任務(wù).

Linux 支持動(dòng)態(tài)加載內(nèi)核模塊

Linux 支持對(duì)稱(chēng)多處理 (SMP) 機(jī)制

Linux 為 搶占式內(nèi)核

Linux 并不區(qū)分線程和其他的一般進(jìn)程

Linux 提供具有設(shè)備類(lèi)的面向?qū)ο蟮脑O(shè)備模型, 熱插拔事件, 以及用戶控件的設(shè)備文件系統(tǒng)

中斷和中斷處理

中斷是一種解決處理器和速度差異的方案, 只有在硬件需要的時(shí)候再向內(nèi)核發(fā)出信號(hào). 中斷本質(zhì)上是一種特殊的電信號(hào).

內(nèi)核響應(yīng)特定中斷, 然后 內(nèi)核 調(diào)用特定的 中斷處理程序 , 終端處理程序是設(shè)備驅(qū)動(dòng)程序的一部分

Linux 中的終端處理程序是不可重入的, 同一個(gè)中斷處理程序不會(huì)被同時(shí)調(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)生中斷, 通過(guò)電信號(hào)給處理器的特定管腳發(fā)送一個(gè)信號(hào), 處理器聽(tīng)著當(dāng)前處理工作, 關(guān)閉中斷系統(tǒng) ,   然后調(diào)到內(nèi)存中預(yù)定義的位置 (中斷處理程序的入口點(diǎn)) 開(kāi)始執(zhí)行. 計(jì)算終端號(hào), do_IRQ() 對(duì)接收的中斷進(jìn)行應(yīng)答, 禁止這條線上的中斷傳遞.

內(nèi)核同步

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

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

內(nèi)核同步方法:

原子操作

自旋鎖 , 特性是當(dāng)線程無(wú)法獲取鎖, 會(huì)一直忙循環(huán) (忙等) 等待鎖重新可以, 適用于短期輕量級(jí)加鎖

讀 / 寫(xiě)自旋鎖 (共享 / 排它鎖), 一個(gè)或多個(gè)任務(wù)可以并發(fā)的持有讀者鎖, 寫(xiě)者鎖只能被一個(gè)寫(xiě)任務(wù)持有.

信號(hào)量 (睡眠鎖), 如果一個(gè)任務(wù)試圖獲得一個(gè)被占用的信用量時(shí), 信號(hào)量會(huì)將其推進(jìn)一個(gè)等待隊(duì)列, 然后讓其睡眠. 當(dāng)信號(hào)量可用后,   等待隊(duì)列中的任務(wù)會(huì)被喚醒. 適用于鎖被長(zhǎng)期占用的時(shí)候.

mutex(計(jì)數(shù)為 1 的信號(hào)量), 這個(gè)是編程中最常見(jiàn)的.

順序鎖

屏障 (barriers), 用于確保指令序列和讀寫(xiě)的執(zhí)行順序

內(nèi)核中造成并發(fā)的原因:

中斷, 幾乎可以再任何時(shí)刻異步發(fā)生, 可能隨時(shí)打斷當(dāng)前正在執(zhí)行的代碼

軟中斷和 tasklet, 內(nèi)核能在任何時(shí)刻喚醒或調(diào)度軟中斷或 tasklet, 打斷當(dāng)前正在執(zhí)行的代碼

內(nèi)核搶占

睡眠及與用戶空間的同步

對(duì)稱(chēng)多處理, 多個(gè)處理器同時(shí)執(zhí)行代碼

內(nèi)存管理

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

內(nèi)核把也劃分為不同的區(qū)(zone), 使用區(qū)對(duì)具有相似特性的頁(yè)進(jìn)行分組

//  linux/gfp.h   該函數(shù)分配 2 的 order 次方個(gè)連續(xù) ` 物理頁(yè) `,  返回指針指向 *** 個(gè)頁(yè)的 page 結(jié)構(gòu)體  staticinlinestructpage * alloc_pages(gfp_tgfp_mask,unsignedintorder) //  釋放物理頁(yè)  externvoidfree_pages(unsignedlongaddr,unsignedintorder); // linux/slab.h 以字節(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ù), 被存儲(chǔ)在一個(gè)單獨(dú)的數(shù)據(jù)結(jié)構(gòu)中, 被稱(chēng)為 inode (索引節(jié)點(diǎn))

虛擬文件系統(tǒng) (VFS) 有四個(gè)主要的對(duì)象模型:

超級(jí)塊對(duì)象, 代表一個(gè)具體的已安裝文件系統(tǒng), 存儲(chǔ)特定文件系統(tǒng)的信息

索引節(jié)點(diǎn)對(duì)象, 代表一個(gè)具體文件, 包含內(nèi)核在操作文件或目錄時(shí)需要的全部信息, 一個(gè)索引節(jié)點(diǎn)代表文件系統(tǒng)中的一個(gè)文件,

目錄項(xiàng)對(duì)象, 代表一個(gè)目錄項(xiàng), 是路徑的一個(gè)組成部分, VFS 把目錄當(dāng)做文件處理 , 目錄項(xiàng)對(duì)象沒(méi)有對(duì)應(yīng)的磁盤(pán)數(shù)據(jù)結(jié)構(gòu)

文件對(duì)象, 代表進(jìn)程打開(kāi)的文件, 進(jìn)程直接處理的是文件

//  linux/fs.h   文件對(duì)象的數(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ī)訪問(wèn) 固定大小數(shù)據(jù)片 (chunks) 的硬件設(shè)備稱(chēng)作塊設(shè)備, 如硬盤(pán). 按照字符流的方式被 有序訪問(wèn) 的硬件設(shè)備稱(chēng)為字符設(shè)備,   如鍵盤(pán)

#  linux/bio.h I/ O 設(shè)備基本容器由 bio 結(jié)構(gòu)體表示

I/ O 調(diào)度程序 用于管理塊設(shè)備的請(qǐng)求隊(duì)列, 決定隊(duì)列中的請(qǐng)求排列順序以及什么時(shí)刻派發(fā)請(qǐng)求到掛設(shè)備. 這樣有利于減少磁盤(pán)的尋址時(shí)間,   從而提高全局的吞吐量

linux 實(shí)際使用的 I / O 調(diào)度程序有 linux 電梯, 最終期限 I / O 調(diào)度, 預(yù)測(cè) I / O 調(diào)度程序, 空操作的 I / O 調(diào)度程序

進(jìn)程地址空間

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

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

虛擬地址空間, 可被訪問(wèn)的合法地址空間稱(chēng)為 內(nèi)存區(qū)域 :

可執(zhí)行文件代碼的內(nèi)存映射, 稱(chēng)為代碼段

可執(zhí)行文件的已初始化全局變量的內(nèi)存映射, 稱(chēng)為數(shù)據(jù)段

包含未初始化全局變量,bss(block started by symbol)段的零頁(yè)的內(nèi)存映射

用于進(jìn)程用戶空間棧的零頁(yè)內(nèi)存映射

每一個(gè)如 C 庫(kù)或動(dòng)態(tài)鏈接程序等共享庫(kù)的代碼段、數(shù)據(jù)段和 bss 會(huì)被載入進(jìn)程的地址空間

任何內(nèi)存映射文件

任何共享內(nèi)存段

任何匿名的內(nèi)存映射, 如 malloc 分配的內(nèi)存

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

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

以上就是“Linux 內(nèi)核設(shè)計(jì)與實(shí)現(xiàn)的方法是什么”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,丸趣 TV 小編每天都會(huì)為大家更新不同的知識(shí),如果還想學(xué)習(xí)更多的知識(shí),請(qǐng)關(guān)注丸趣 TV 行業(yè)資訊頻道。

正文完
 
丸趣
版權(quán)聲明:本站原創(chuàng)文章,由 丸趣 2023-08-04發(fā)表,共計(jì)3784字。
轉(zhuǎn)載說(shuō)明:除特殊說(shuō)明外本站除技術(shù)相關(guān)以外文章皆由網(wǎng)絡(luò)搜集發(fā)布,轉(zhuǎn)載請(qǐng)注明出處。
評(píng)論(沒(méi)有評(píng)論)
主站蜘蛛池模板: 桑日县| 屏东县| 丰台区| 鸡西市| 且末县| 周宁县| 汉中市| 新巴尔虎左旗| 临朐县| 南城县| 涡阳县| 金山区| 张北县| 鄯善县| 三穗县| 谷城县| 邳州市| 元谋县| 郯城县| 博野县| 屏山县| 九江市| 高陵县| 利津县| 宜良县| 海门市| 内黄县| 舟曲县| 牡丹江市| 宝兴县| 宽城| 额尔古纳市| 尼勒克县| 杭州市| 会昌县| 萍乡市| 苏尼特左旗| 通化县| 虹口区| 屯门区| 玛纳斯县|