導航:首頁 > 編程系統 > linux模塊機制

linux模塊機制

發布時間:2021-12-05 06:25:44

A. linux的內核模塊都在哪裡放著啊

一個完整的Linux內核一般由5部分組成,它們分別是內存管理、進程管理、進程間通信、虛擬文件系統網路介面。1、內存管理內存管理主要完成的是如何合理有效地管理整個系統的物理內存,同時快速響應內核各個子系統對內存分配的請求。Linux內存管理支持虛擬內存,而多餘出的這部分內存就是通過磁碟申請得到的,平時系統只把當前運行的程序塊保留在內存中,其他程序塊則保留在磁碟中。在內存緊缺時,內存管理負責在磁碟和內存間交換程序塊。2、進程管理進程管理主要控制系統進程對CPU的訪問。當需要某個進程運行時,由進程調度器根據基於優先順序的調度演算法啟動新的進程。:Linux支持多任務運行,那麼如何在一個單CPU上支持多任務呢?這個工作就是由進程調度管理來實現的。在系統運行時,每個進程都會分得一定的時間片,然後進程調度器根據時間片的不同,選擇每個進程依次運行,例如當某個進程的時間片用完後,調度器會選擇一個新的進程繼續運行。由於切換的時間和頻率都非常的快,由此用戶感覺是多個程序在同時運行,而實際上,CPU在同一時間內只有一個進程在運行,這一切都是進程調度管理的結果。3、進程間通信進程間通信主要用於控制不同進程之間在用戶空間的同步、數據共享和交換。由於不用的用戶進程擁有不同的進程空間,因此進程間的通信要藉助於內核的中轉來實現。一般情況下,當一個進程等待硬體操作完成時,會被掛起。當硬體操作完成,進程被恢復執行,而協調這個過程的就是進程間的通信機制。4、虛擬文件系統Linux內核中的虛擬文件系統用一個通用的文件模型表示了各種不同的文件系統,這個文件模型屏蔽了很多具體文件系統的差異,使Linux內核支持很多不同的文件系統,這個文件系統可以分為邏輯文件系統和設備驅動程序:邏輯文件系統指Linux所支持的文件系統,例如ext2、ext3和fat等;設備驅動程序指為每一種硬體控制器所編寫的設備驅動程序模塊。5、網路介面網路介面提供了對各種網路標準的實現和各種網路硬體的支持。網路介面一般分為網路協議和網路驅動程序。網路協議部分負責實現每一種可能的網路傳輸協議。網路設備驅動程序則主要負責與硬體設備進行通信,每一種可能的網路硬體設備都有相應的設備驅動程序。

B. linux內核採用的可載入模塊機制有什麼特點

為保持 Linux 內核的穩定與可持續發展,內核在發展過程中引進了可裝載模內塊這一特性容。內核可裝載模塊就是可在內核運行時載入到內核的一組代碼。通常 , 我們會在兩個版本不同的內核上裝載同一模塊失敗,即使是在兩個相鄰的補丁級(Patch Level)版本上。這是因為內核在引入可裝載模塊的同時,對模塊採取了版本信息校驗。這是一個與模塊代碼無關,卻與內核相連的機制。該校驗機制保證了內核裝載的模塊是用戶認可的,且安全的。

C. linux驅動模塊中添加非同步通知機制需要完成哪些工作

一 驅動方面:
1. 在設備抽象的數據結構中增加一個struct fasync_struct的指針
2. 實現設備操作中的fasync函數,這個函數很簡單,其主體就是調用內核的fasync_helper函數。
3. 在需要向用戶空間通知的地方(例如中斷中)調用內核的kill_fasync函數。
4. 在驅動的release方法中調用前面定義的fasync函數
呵呵,簡單吧,就三點。其中fasync_helper和kill_fasync都是內核函數,我們只需要調用就可以了。在1中定義的指針是一個重要參數,fasync_helper和kill_fasync會使用這個參數。

二 應用層方面
1. 利用signal或者sigaction設置SIGIO信號的處理函數
2. fcntl的F_SETOWN指令設置當前進程為設備文件owner
3. fcntl的F_SETFL指令設置FASYNC標志
完成了以上的工作的話,當內核執行到kill_fasync函數,用戶空間SIGIO函數的處理函數就會被調用了。
呵呵,看起來不是很復雜把,讓我們結合具體代碼看看就更明白了。
先從應用層代碼開始吧:

#include <sys/types.h>

#include <sys/stat.h>

#include <stdio.h>

#include <fcntl.h>

#include <signal.h>

#include <unistd.h>

#define MAX_LEN 100

//處理函數,沒什麼好講的,用戶自己定義

void input_handler(int num)
{

char data[MAX_LEN];

int len;
//讀取並輸出STDIN_FILENO上的輸入

len = read(STDIN_FILENO, &data, MAX_LEN);
data[len] = 0;
printf("input available:%s\n", data);
}

void main()

{

int oflags;

//啟動信號驅動機制,將SIGIO信號同input_handler函數關聯起來,一旦產生SIGIO信號,就會執行input_handler

signal(SIGIO, input_handler);

//STDIN_FILENO是打開的設備文件描述符,F_SETOWN用來決定操作是干什麼的,getpid()是個系統調用,

//功能是返回當前進程的進程號,整個函數的功能是STDIN_FILENO設置這個設備文件的擁有者為當前進程。
fcntl(STDIN_FILENO, F_SETOWN, getpid());

//得到打開文件描述符的狀態

oflags = fcntl(STDIN_FILENO, F_GETFL);

//設置文件描述符的狀態為oflags | FASYNC屬性,一旦文件描述符被設置成具有FASYNC屬性的狀態,
//也就是將設備文件切換到非同步操作模式。這時系統就會自動調用驅動程序的fasync方法。
fcntl(STDIN_FILENO, F_SETFL, oflags | FASYNC);

//最後進入一個死循環,程序什麼都不幹了,只有信號能激發input_handler的運行

//如果程序中沒有這個死循環,會立即執行完畢
while (1);
}
再看驅動層代碼,驅動層其他部分代碼不變,就是增加了一個fasync方法的實現以及一些改動

//首先是定義一個結構體,其實這個結構體存放的是一個列表,這個

//列表保存的是一系列設備文件,SIGIO信號就發送到這些設備上
static struct fasync_struct *fasync_queue;

//fasync方法的實現
static int my_fasync(int fd, struct file * filp, int on)

{

int retval;
//將該設備登記到fasync_queue隊列中去

retval=fasync_helper(fd,filp,on,&fasync_queue);
if(retval<0)

{
return retval;

}
return 0;

}
在驅動的release方法中我們再調用my_fasync方法

int my_release(struct inode *inode, struct file *filp)

{

//..processing..

drm_fasync(-1, filp, 0);

//..processing..
}這樣後我們在需要的地方(比如中斷)調用下面的代碼,就會向fasync_queue隊列里的設備發送SIGIO信號
,應用程序收到信號,執行處理程序
if (fasync_queue)
kill_fasync(&fasync_queue, SIGIO, POLL_IN);

D. Linux 里的 modprobe 到底是幹嘛的說載入模塊,不懂這模塊指的都是什麼

為保持
linux
內核的穩定與可持續發展,內核在發展過程中引進了可裝載模塊這一特性。內核可裝載模塊就是可在內核運行時載入到內核的一組代碼。通常
,
我們會在兩個版本不同的內核上裝載同一模塊失敗,即使是在兩個相鄰的補丁級(patch
level)版本上。這是因為內核在引入可裝載模塊的同時,對模塊採取了版本信息校驗。這是一個與模塊代碼無關,卻與內核相連的機制。該校驗機制保證了內核裝載的模塊是用戶認可的,且安全的。

E. 如何讓linux驅動模塊隨機器啟動

LINUX中的驅動設計是嵌入式LINUX開發中十分重要的部分,它要求開發者不僅要熟悉LINUX的內核機制、驅動程序與用戶級應用程序的介面關系、考慮系統中對設備的並發操作等等,而且還要非常熟悉所開發硬體的工作原理。這對驅動開發者提出了比較高的要求,本章是給大家了解驅動設計提供一個簡單入門的一個實例,並不需要提供太多與硬體相關的內容,這部分應該是通過仔細閱讀晶元廠家提供的資料來解決。

驅動程序的作用是應用程序與硬體之間的一個中間軟體層,驅動程序應該為應用程序展現硬體的所有功能,不應該強加其他的約束,對於硬體使用的許可權和限制應該由應用程序層控制。但是有時驅動程序的設計是跟所開發的項目相關的,這時就可能在驅動層加入一些與應用相關的設計考慮,主要是因為在驅動層的效率比應用層高,同時為了項目的需要可能只強化或優化硬體的某個功能,而弱化或關閉其他一些功能;到底需要展現硬體的哪些功能全都由開發者根據需要而定。驅動程序有時會被多個進程同時使用,這時我們要考慮如何處理並發的問題,就需要調用一些內核的函數使用互斥量和鎖等機制。

驅動程序主要需要考慮下面三個方面:提供盡量多的選項給用戶,提高驅動程序的速度和效率,盡量使驅動程序簡單,使之易於維護。

LINUX的驅動開發調試有兩種方法,一種是直接編譯到內核,再運行新的內核來測試;二是編譯為模塊的形式,單獨載入運行調試。第一種方法效率較低,但在某些場合是唯一的方法。模塊方式調試效率很高,它使用insmod工具將編譯的模塊直接插入內核,如果出現故障,可以使用rmmod從內核中卸載模塊。不需要重新啟動內核,這使驅動調試效率大大提高。

模塊中必須的兩個基本函數:在Linux 2.4 內核中是函數init_mole和cleanup_mole;在Linux 2.6 的內核中是宏mole_init(your_init_func) 和mole_exit(your_exit_func)。初始化函數的作用一般是分配資源、注冊設備方法等,退出函數的作用一般是釋放所申請的資源等。

F. 想實現一個linux內核安全功能模塊的技術思路是怎樣的

作者:橘子-實現網
鏈接:https://www.hu.com/question/21637060/answer/58362892
來源:知乎
著作權歸作者所有,轉載請聯系作者獲得授權。

用戶在執行系統調用時,先通過原有的內核介面依次執行功能性的錯誤檢查,接著進行傳統的DAC檢查,並在即將訪問內核的內部對象之前,通過LSM鉤子函數調用LSM。LSM再調用具體的訪問控制策略來決定訪問的合法性。訪問控制整體構架:<img src="https://pic2.mg.com/_b.jpg" data-rawwidth="804" data-rawheight="604" class="origin_image zh-lightbox-thumb" width="804" data-original="https://pic2.mg.com/_r.jpg">
LSM框架下訪問決策模塊包括selinux,smack,tomoyo,yama,apparmor.
每個決策模塊都是通過各自的XXX_init函數調用register_security()函數,注冊到LSM框架的模塊被載入成功後,就可以進行訪問控制操作。如果此時還有一個安全模塊要使用register_security()函數進行載入,則會出現錯誤,直到使用框架注銷後,下一個模塊才可以載入。<img src="https://pic2.mg.com/_b.jpg" data-rawwidth="420" data-rawheight="285" class="content_image" width="420">

Linux安全模塊(LSM)提供了兩類對安全鉤子函數的調用:一類管理內核對象的安全域,另一類仲裁對這些內核對象的訪問。對安全鉤子函數的調用通過鉤子來實現,鉤子是全局表security_ops中的函數指針,這個全局表的類型是security_operations結構,這個結構定義在include/linux/security.h這個頭文件中。
通過對security代碼進行一番簡單的分析,LSM啟動過程流圖:

<img src="https://pic2.mg.com/_b.jpg" data-rawwidth="1011" data-rawheight="213" class="origin_image zh-lightbox-thumb" width="1011" data-original="https://pic2.mg.com/_r.jpg">security_initcall只能調用selinux_init,smack_init ,tomoyo_init , yama_init 和apparmor_init中的一個,因為內核不允許多種安全機制同時一起工作。一旦一個安全模塊被載入,就成為系統的安全策略決策中心,而不會被後面的register_security()函數覆蓋,直到這個安全模塊被使用unregister_security()函數向框架注銷。security_initcall只能調用selinux_init,smack_init ,tomoyo_init , yama_init 和apparmor_init中的一個,因為內核不允許多種安全機制同時一起工作。一旦一個安全模塊被載入,就成為系統的安全策略決策中心,而不會被後面的register_security()函數覆蓋,直到這個安全模塊被使用unregister_security()函數向框架注銷。

因此LSM框架下只能開啟一種安全機制,smack編譯進Linux內核的配置和要求:

(1)要求smack和selinux不能夠同時運行,不能同時存在於同一個運行中的內核;
查看內核是否開啟以下的功能(如果沒有則需要開啟):

CONFIG_NETLABEL=y
CONFIG_SECURITY=y
CONFIG_SECURITY_NETWORK=y
CONFIG_SECURITY_SMACK=y
CONFIG_SECURITY_SELINUX should not be
set

步驟:

make menuconfig
<img src="https://pic1.mg.com/_b.jpg" data-rawwidth="658" data-rawheight="461" class="origin_image zh-lightbox-thumb" width="658" data-original="https://pic1.mg.com/_r.jpg"><img src="https://pic3.mg.com/_b.jpg" data-rawwidth="658" data-rawheight="464" class="origin_image zh-lightbox-thumb" width="658" data-original="https://pic3.mg.com/_r.jpg"><img src="https://pic3.mg.com/_b.jpg" data-rawwidth="658" data-rawheight="468" class="origin_image zh-lightbox-thumb" width="658" data-original="https://pic3.mg.com/_r.jpg"><img src="https://pic4.mg.com/_b.jpg" data-rawwidth="662" data-rawheight="468" class="origin_image zh-lightbox-thumb" width="662" data-original="https://pic4.mg.com/_r.jpg">
make moles_install
make install
查看/proc/filesystems
可以看到smackfs,說明smack已經編進內核
<img src="https://pic2.mg.com/_b.jpg" data-rawwidth="146" data-rawheight="187" class="content_image" width="146">

執行如下的命令:
mkdir -p /smack
在文件/etc/fstab添加下面的一行
smackfs /smack smackfs defaults 0 0
然後執行下面的命令:
mount –a

然後就體驗一下它的功能了:
1. 比如在用戶test的home目錄下(/home/test),新建文件夾 mkdir testdir
cd testdir/
touch testfile
2. 給新建的testfile 打上TheOther標簽
setfattr
--name=security.SMACK64 --value=TheOther testfile
查看其標簽
getfattr
--only-values -n security.SMACK64 -e text testfile
可以看到標簽TheOther
<img src="https://pic3.mg.com/_b.jpg" data-rawwidth="698" data-rawheight="60" class="origin_image zh-lightbox-thumb" width="698" data-original="https://pic3.mg.com/_r.jpg">

3. echo TheOne
2>/dev/null > /proc/self/attr/current,當前執行的進程默認都會被打為/proc/self/attr/current下的標簽
4.配置策略echo -n "TheOne TheOther r---"> /sma ck/load
因為當前進程只要是沒有特殊配置過的都被打為TheOne,所以當轉換到普通用戶test下,cat testfile是可讀的
5.現在我將當前進程打為NotTheOne ,echo NotTheOne 2>/dev/null >
/proc/self/attr/current
當轉換到普通用戶test下,cat testfile則變成不可讀的了
6.如果你想單獨對某個進程打標簽,而不是對當前進程打,就
attr -s security.SMACK64 -V TheOne /bin/cat
此時cat被標為TheOne,根據策略可以看出,當轉換到普通用戶test下,cat testfile是可讀的
若attr -s
security.SMACK64 –V Not TheOne /bin/cat
根據策略可以看出,當轉換到普通用戶test下,cat testfile是不可讀的
(需要說明的一點是,當cat本身被標上標簽和/proc/self/attr/current打入標簽共存時,cat本身的標簽生效,而/proc/self/attr/current打入標簽沒有生效)

G. Linux內核模塊的優缺點

利用內核模塊的抄動態裝載性具有襲如下優點:
·將內核映象的尺寸保持在最小,並具有最大的靈活性;
·便於檢驗新的內核代碼,而不需重新編譯內核並重新引導。
但是,內核模塊的引入也帶來了如下問題:
·對系統性能和內存利用有負面影響;
·裝入的內核模塊和其他內核部分一樣,具有相同的訪問許可權,因此,差的內核模塊會導致系統崩潰;
·為了使內核模塊訪問所有內核資源,內核必須維護符號表,並在裝入和卸載模塊時修改這些符號表;
·有些模塊要求利用其他模塊的功能,因此,內核要維護模塊之間的依賴性。
·內核必須能夠在卸載模塊時通知模塊,並且要釋放分配給模塊的內存和中斷等資源;
·內核版本和模塊版本的不兼容,也可能導致系統崩潰,因此,嚴格的版本檢查是必需的。
盡管內核模塊的引入同時也帶來不少問題,但是模塊機制確實是擴充內核功能一種行之有效的方法,也是在內核級進行編程的有效途徑。

H. 典型嵌入式linux軟體部分由哪些模塊組成他們的功能及相互聯系 Bootloader分為哪兩階段分

從軟體硬體設計特點簡單描述嵌入式產品開發設計流程。
項目論證階段:項目的可行性分析並形成可行性研究報告。
系統方案階段:對產品需求加以分析、細化,並抽象出需要完成的功能列表,明確定義所要完成的任務。
系統設計階段:軟體開發部分完成軟體需求分析,形成軟體總體設計方案,軟體開發介面規范等;硬體部分完成硬體總體設計方案,介面定義及說明等。
產品詳細設計階段:完成軟/硬體的詳細設計,編制代碼,形成軟體各模塊的設計說明;硬體部分各單板的原理圖,PCB和料單,同時完成產品的結構設計。
製造聯試階段:完成產品的系統調試和可靠性測試,並形成相應的系統調試報告和可靠性測試報告。
典型嵌入式Linux軟體部分由哪些模塊組成?它的功能和相互關系是什麼?
Bootloader、嵌入式Linux內核、嵌入式文件系統組成。Bootloader完成硬體設備的初始化以及引導內核載入,內核通過文件系統來管理對整個系統中的所有的數據和文件。
BootLoader分為哪兩個階段?分別實現了哪些功能?
stage1和stage2兩個階段。
完成的工作:
硬體設備初始化。
為載入Bootloader的stage2准備RAM空間。
拷貝Bootloader的stage2到RAM空間中。
設置堆棧。
跳轉到stage2的C入口點。
stage2完成的工作:
初始化本階段要使用到的硬體設備。
監測系統內存映射。
將內核映像和根文件系統映像從Flash設備上復制到RAM空間中。
設置內核啟動參數。
調用啟動內核。
簡述嵌入式文件系統的種類和管理機制。
Ext2fs文件系統 2.基於Flash的文件系統 3.基於RAM的文件系統 4.網路文件系統。
Linux引入了虛擬文件系統vfs(virtual file system),為各類文件系統提供一個統一的應用編程介面。
如何理解消費類電子產品開發的可裁剪性和可移植性,並以Linux系統為例進行說明。
Linux來說,假如我們用不到乙太網設備,我們可以將該設備的驅動程序以及相關庫文件等都去掉以縮小體積。
Linux可以在不同架構的CPU平台上運行。
詳細描述嵌入式Linux軟體開發的編譯開發環境和編譯開發工具。
開發環境:首先宿主機上需要安裝Linux操作系統。需要為這個Linux系統安裝以下三個部分:
函數庫(glibc):是Linux下C語言的主要函數庫。
編譯器(gcc):可以將C,C++,匯編源程序和目標程序編譯、鏈接成可執行文件。
系統頭文件(glibc_header):系統相關功能的頭文件集合。
編譯開發工具:編輯器有Vi和Emacs;編譯器為GCC,是GUN推出的功能強大、性能優越的多平台編譯器;調試器為GDB,可以方便的設置斷點、單步跟蹤等調試功能;項目管理器「make」,用來控制編譯或者重復編譯,自動管理軟體編譯內容、方式和時機。
基於S3C2410嵌入式Linux的開發的邏輯空間和物理空間如何對應?詳細描述之。
在支持MMU的32位處理器平台上,Linux系統中的物理存儲空間和虛擬存儲空間的地址范圍分別都是從0x00000000到0xFFFFFFFF,共4GB,但物理存儲空間與虛擬存儲空間布局完全不同。Linux運行在虛擬存儲空間,並負責把系統中實際存在的遠小於4GB的物理內存根據不同需求映射到整個4GB的虛擬存儲空間中。
n 物理存儲空間布局
Linux的物理存儲空間布局與處理器相關,詳細情況可以從處理器用戶手冊的存儲空間分布表(memory map)相關章節中查到,我們這里只列出嵌入式處理器平台Linux物理內存空間的一般布局,如圖18-4所示。

圖18-4 Linux物理內存空間一般布局示意圖
說明:
1)最大node號n不能大於MAX_NUMNODES-1。
2)MAX_NUMNODES表示系統支持的最多node數。在ARM系統中,Sharp晶元最多支持16個nodes,其他晶元最多支持4個nodes。
3)numnodes是當前系統中實際的內存node數。
4)在不支持CONFIG_DISCONTIGMEM選項的系統中,只有一個內存node。
5)最大bank號m不能大於NR_BANKS-1。
6)NR_BANKS表示系統中支持的最大內存bank數,一般等於處理器的RAM片選數。在ARM系統中,Sharp晶元最多支持16個banks,其他晶元最多支持8個banks。
7)mem_init()函數會將所有節點的頁幀位碼表所佔空間、孔洞頁描述符空間及空閑內存頁都釋放掉。

n虛擬存儲空間布局
在支持MMU的系統中,當系統做完硬體初始化後就使能MMU功能,這樣整個系統就運行在虛擬存儲空間中,實現虛擬存儲空間到物理存儲空間映射功能的是處理器的MMU,而虛擬存儲空間與5路存儲空間的映射關系則是由Linux內核來管理的。32位系統中物理存儲空間佔4GB空間,虛擬存儲空間同樣佔4GB空間,Linux把物理空間中實際存在的遠遠小於4GB的內存空間映射到整個4GB虛擬存儲空間中除映射I/O空間之外的全部空間,所以虛擬內存空間遠遠大於物理內存空間,這就說同一塊物理內存可能映射到多處虛擬內存地址空間上,這正是Linux內存管理職責所在。圖18-5列出了Linux內核中虛擬內存空間的一般布局(其實I/O空間也在其中,通常佔用高端內存空間,在此未標出)。

圖18-5 Linux系統虛擬內存空間一般布局示意圖
說明:
1)線性地址空間:是指Linux系統中從0x00000000到0xFFFFFFFF整個4GB虛擬存儲空間。
2)內核空間:內核空間表示運行在處理器最高級別的超級用戶模式(supervisor mode)下的代碼或數據,內核空間佔用從0xC0000000到0xFFFFFFFF的1GB線性地址空間,內核線性地址空間由所有進程共享,但只有運行在內核態的進程才能訪問,用戶進程可以通過系統調用切換到內核態訪問內核空間,進程運行在內核態時所產生的地址都屬於內核空間。
3)用戶空間:用戶空間佔用從0x00000000到0xBFFFFFFF共3GB的線性地址空間,每個進程都有一個獨立的3GB用戶空間,所以用戶空間由每個進程獨有,但是內核線程沒有用戶空間,因為它不產生用戶空間地址。另外子進程共享(繼承)父進程的用戶空間只是使用與父進程相同的用戶線性地址到物理內存地址的映射關系,而不是共享父進程用戶空間。運行在用戶態和內核態的進程都可以訪問用戶空間。
4)內核邏輯地址空間:是指從PAGE_OFFSET(3G)到high_memory(物理內存的大小,最大896)之間的線性地址空間,是系統物理內存映射區,它映射了全部或部分(如果系統包含高端內存)物理內存。內核邏輯地址空間與圖18-4中的系統RAM內存物理地址空間是一一對應的(包括內存孔洞也是一一對應的),內核邏輯地址空間中的地址與RAM內存物理地址空間中對應的地址只差一個固定偏移量(3G),如果RAM內存物理地址空間從0x00000000地址編址,那麼這個偏移量就是PAGE_OFFSET。
5)低端內存:內核邏輯地址空間所映射物理內存就是低端內存(實際物理內存的大小,但是小於896),低端內存在Linux線性地址空間中始終有永久的一一對應的內核邏輯地址,系統初始化過程中將低端內存永久映射到了內核邏輯地址空間,為低端內存建立了虛擬映射頁表。低端內存內物理內存的物理地址與線性地址之間的轉換可以通過__pa(x)和__va(x)兩個宏來進行,#define __pa(x) ((unsignedlong)(x)-PAGE_OFFSET) __pa(x)將內核邏輯地址空間的地址x轉換成對應的物理地址,相當於__virt_to_phys((unsigned long)(x)),__va(x)則相反,把低端物理內存空間的地址轉換成對應的內核邏輯地址,相當於((void *)__phys_to_virt((unsigned long)(x)))。
6)高端內存:低端內存地址之上的物理內存是高端內存(物理內存896之上),高端內存在Linux線性地址空間中沒有沒有固定的一一對應的內核邏輯地址,系統初始化過程中不會為這些內存建立映射頁表將其固定映射到Linux線性地址空間,而是需要使用高端內存的時候才為分配的高端物理內存建立映射頁表,使其能夠被內核使用,否則不能被使用。高端內存的物理地址於現行地址之間的轉換不能使用上面的__pa(x)和__va(x)宏。
7)高端內存概念的由來:如上所述,Linux將4GB的線性地址空間劃分成兩部分,從0x00000000到0xBFFFFFFF共3GB空間作為用戶空間由用戶進程獨占,這部分線性地址空間並沒有固定映射到物理內存空間上;從0xC0000000到0xFFFFFFFF的第4GB線性地址空間作為內核空間,在嵌入式系統中,這部分線性地址空間除了映射物理內存空間之外還要映射處理器內部外設寄存器空間等I/O空間。0xC0000000~high_memory之間的內核邏輯地址空間專用來固定映射系統中的物理內存,也就是說0xC0000000~high_memory之間空間大小與系統的物理內存空間大小是相同的(當然在配置了CONFIG_DISCONTIGMEMD選項的非連續內存系統中,內核邏輯地址空間和物理內存空間一樣可能存在內存孔洞),如果系統中的物理內存容量遠小於1GB,那麼內核現行地址空間中內核邏輯地址空間之上的high_memory~0xFFFFFFFF之間還有足夠的空間來固定映射一些I/O空間。可是,如果系統中的物理內存容量(包括內存孔洞)大於1GB,那麼就沒有足夠的內核線性地址空間來固定映射系統全部物理內存以及一些I/O空間了,為了解決這個問題,在x86處理器平台設置了一個經驗值:896MB,就是說,如果系統中的物理內存(包括內存孔洞)大於896MB,那麼將前896MB物理內存固定映射到內核邏輯地址空間0xC0000000~0xC0000000+896MB(=high_memory)上,而896MB之後的物理內存則不建立到內核線性地址空間的固定映射,這部分內存就叫高端物理內存。此時內核線性地址空間high_memory~0xFFFFFFFF之間的128MB空間就稱為高端內存線性地址空間,用來映射高端物理內存和I/O空間。896MB是x86處理器平台的經驗值,留了128MB線性地址空間來映射高端內存以及I/O地址空間,我們在嵌入式系統中可以根據具體情況修改這個閾值,比如,MIPS中將這個值設置為0x20000000B(512MB),那麼只有當系統中的物理內存空間容量大於0x20000000B時,內核才需要配置CONFIG_HIGHMEM選項,使能內核對高端內存的分配和映射功能。什麼情況需要劃分出高端物理內存以及高端物理內存閾值的設置原則見上面的內存頁區(zone)概念說明。
8)高端線性地址空間:從high_memory到0xFFFFFFFF之間的線性地址空間屬於高端線性地址空間,其中VMALLOC_START~VMALLOC_END之間線性地址被vmalloc()函數用來分配物理上不連續但線性地址空間連續的高端物理內存,或者被vmap()函數用來映射高端或低端物理內存,或者由ioremap()函數來重新映射I/O物理空間。PKMAP_BASE開始的LAST_PKMAP(一般等於1024)頁線性地址空間被kmap()函數用來永久映射高端物理內存。FIXADDR_START開始的KM_TYPE_NR*NR_CPUS頁線性地址空間被kmap_atomic()函數用來臨時映射高端物理內存,其他未用高端線性地址空間可以用來在系統初始化期間永久映射I/O地址空間。
http://blog.21ic.com/user1/8499/archives/2012/90535.html

I. linux內核為什麼引入模塊機制

簡單的理解就是為了保持內核的精簡,方便維護,移植到不同的平台可以按所需功能添加相應模塊,適應不同的需求。

J. arm-linux模塊機制 模塊宏什麼意思

嵌入式linux系統沒有usb轉模塊驅動是需要自己開發的,而pc上的liunx系統是廠家已經做好的包含有常用的驅動,嵌入式開發就是這樣,驅動內核開發等一些底層開發需要做的,親要是要使用方便可以去了解下嵌視科技的qs-pte9視覺開發板,不用考慮底層...

閱讀全文

與linux模塊機制相關的資料

熱點內容
解放了的中國電影 瀏覽:658
97不用下載播放器的電影 瀏覽:624
韓國一個男的和一個男的坐著聊天是什麼電影 瀏覽:60
騰達u1在linux 瀏覽:925
香港絕版愛情片 瀏覽:585
名城廣場電影院 瀏覽:714
向飛雪糕給你吃是哪部電影 瀏覽:114
想找主播帶貨如何知道數據真假 瀏覽:122
韓國電影 理發師 瀏覽:740
xp升級win7下載 瀏覽:3
同款app都有哪些 瀏覽:244
男主外號叫撒旦的小說 瀏覽:382
導航APK升級文件 瀏覽:216
看未上映電影的網站 瀏覽:693
蘋果解壓有密碼的文件 瀏覽:521
5g視頻網站都有哪些 瀏覽:551
尹美麗還演過什麼 瀏覽:650
抗日奇俠之終極任務演員表 瀏覽:628
電影短片網 瀏覽:646
日本的電影大全免費看中文版 瀏覽:188

友情鏈接