原创 linux虛擬文件系統綜述

Linux延續了Unix的一個哲學觀點:一切皆文件,應用看到的所有對象都是文件,裏面除了socket不那麼典型之外所有都是文件。而實際情況非常複雜,內核管理着非常多的設備:字符設備、塊設備、網絡設備,還支持許多類型的文件系統:ex

原创 linux module簽名問題

前言 內核對於可信計算支持的越來越完善,linux發行版在這個基礎上也逐漸默認使能一些它的安全功能,其中一項就是內核module簽名。 原來是隻要有root權限就可以隨意insmod,後來DAC這套權限機制太過於寬鬆,出現了MAC

原创 linux虛擬文件系統-文件的打開

本質上,一個文件打開的過程就是建立fd,file,dentry,inode,address_space的關聯過程。關聯過程中關鍵的一個過程是如何根據路徑名尋找到對應的dentry,對於用戶程序來說路徑只是一個特殊的字符串來表示全路

原创 linux內存管理-反向映射

反向映射的需求 正向映射是通過虛擬地址根據頁表找到物理內存,反向映射就是通過物理地址找到哪些虛擬地址使用它。 什麼時候需要進行反向映射呢?在頁面回收的時候,在還沒有修改完所有引用該頁幀的頁表項之前是不可以將頁幀swap到硬盤上。沒

原创 ELF中模塊間數據引用的重定位

在模塊中進行各類數據引用的方式總共分有:模塊內數據、函數訪問,模塊間數據、函數訪問,其中模塊內的訪問在鏈接時就已經決定了他們的相對偏移,在運行時不再關心這部分的內容,而模塊間訪問相對就比較複雜了。 爲了複用物理內存,發明了PIC/

原创 linux內存管理-頁面規整

頁面規整 背景 linux長時間運行後,可能會發生頁面申請失敗,原因有兩種情況: 空閒頁不夠,觸及到回收的閾值 申請order > 0的連續頁時找不到連續的物理內存 對於第一種情況主要通過頁面回收的方式來回收到足夠的內存頁,包

原创 linux內存管理-頁面回收

頁面回收 背景 linux操作系統設計的時候提供了cache的功能,如果有空閒內存就可以用來作爲cache提升性能,例如page cache緩衝硬盤中的內容,dcache,icache緩存文件系統的metadata數據,這些內容是

原创 linux bootmem memblock的演進

有人可能認爲在系統啓動的時候內存的分配應該非常容易:基本上所有的內存都是可用的,不需要考慮併發性。儘管如此,boot階段的內存管理仍然不是一個簡單的任務。物理內存不一定是連續的,系統之間他們的分佈更是有很大的不同,如何檢測內存的佈

原创 反彙編二進制代碼

最近又做了一些內核hook的工作,繁瑣的地方在於二進制指令的可讀性上,下面簡要記錄dump出指令二進制,之後利用binutils來轉成可讀的彙編代碼. hook的主要流程參考之前的linux內核態hook模塊-splice,主要就

原创 linux爲什麼限制用戶棧空間的大小

在開始編寫代碼的時候總是被告訴不要使用下面這種形式的寫法,爲什麼呢?後來知道這是局部變量,運行時在棧上動態分配的,棧的size是有限制的,一般是8M,當函數嵌套多次的時候很可能就發生棧溢出。 int fun() { char b

原创 linux內存-x86-64頁表初始化

頁表存儲着虛擬地址到物理地址的映射關係,同時爲了減少頁表的內存消耗發明了多級頁表,更多基礎內容可以看淺析linux內存管理. 一個虛擬地址到物理地址通過頁表的轉換過程如下,<深入理解LINUX內核>的經典圖: 32bit系統上一

原创 淺析linux內存管理

物理內存和虛擬內存 現代的操作系統中進程訪問的都是虛擬內存,而虛擬內存到物理內存的轉換是由系統默默完成的。首先來扒一扒它的歷史,直接使用物理內存效率豈不是更高,何必加一箇中間層? 在計算機早期,物理內存的容量是K級別的,計算機中只

原创 linux內存中的page,pte,alloc_page的flag

內核中關於內存的這幾個flag容易混淆:pte,page,alloc_page,他們的功能相互關聯,下面簡要分析一下他們的區別和其中的重要flag的場景 頁表項的flag 使用頁表項的有兩個對象:CPU和MMU,其中主要是CPU

原创 linux fork COW機制分析

在linux系統中通過系統調用fork/clone來創建一個新的進程,創建進程的過程中根據clone flags會選擇複製資源還是公用一份資源,通常資源包括:打開的文件files_struct,文件系統fs_struct,信號處理

原创 linux內存管理-per cpu實現

per-CPU是2.6內核中引入的,它是一種典型的空間換時間的方案,通過爲每個處理器都分配自己的內存區間來避免併發問題, 訪問per-CPU變量幾乎不需要鎖,只需要微不足道的原子操作. 每個處理器都在其自己的副本上工作,這些副本