linux核心固定對映解析

2021-08-27 21:48:23 字數 1515 閱讀 6866

前言:

新版本的核心對於儲存在idtr暫存器中的idt表位址使用的是核心固定對映線性位址,所以在這裡再把核心中固定對映的定址機制描述一下。

一、固定對映概念

核心線性位址第四個gb的初始部分對映系統的物理記憶體。但是至少128m的線性位址總是留作他用,因為核心使用這些線性位址實現非連續記憶體分配和固定對映的線性位址。

固定對映位址類似於常量線性位址,其對應的實體地址不必等於線性位址減去0xc0000000,而是可以以任意方式建立。因此每個固定對映的線性位址都對映乙個物理記憶體的頁框。

二、固定對映線性位址

每個固定對映線性位址都有fixed_addresses結構中的索引來指定(只列出部分32位模式)。

enum fixed_addresses ;

三、固定對映線性位址的對映

核心使用set_fixmap(idx,phys)和set_fixmap_nocache(idx, phys)來建立固定線性位址與實體地址的對映。通過clear_fixmap(idx)解除固定線性位址的對映。

//idx是fixed_addresses結構中的索引值,即指定固定線性位址,phys是實體地址

#define set_fixmap(idx, phys) __set_fixmap(idx, phys, page_kernel)

//禁用硬體快取記憶體

#define set_fixmap_nocache(idx, phys) \

__set_fixmap(idx, phys, page_kernel_nocache)

#define clear_fixmap(idx) _set_fixmap(idx, 0, __pgprot(0))

//這兩個函式都呼叫__set_fixmap函式,只是第二個禁用硬體快取記憶體,這樣線性位址到實體地址的轉換不會儲存在硬體快取記憶體中(即tlb)。

static inline void __set_fixmap(enum fixed_addresses idx,phys_addr_t phys, pgprot_t flags)

void native_set_fixmap(enum fixed_addresses idx, phys_addr_t phys,pgprot_t flags)

void __native_set_fixmap(enum fixed_addresses idx, pte_t pte)

//用idt_table所在物理頁框對應的頁表項內容與固定對映的線性位址聯絡起來,即完成了對映

set_pte_vaddr(address, pte);

fixmaps_set++;//設定固定線性位址對映計數

}//從固定對映線性位址的最大位址0xfffff000往下減就可得到該索引號對應的固定線性位址(間隔是一頁的大小),其實也可以看出對於前邊結構中連續的idx索引值,它能對映的空間都是一頁的大小,即4k。

unsigned long __fixaddr_top = 0xfffff000;

#define __fix_to_virt(x) (fixaddr_top - ((x) << page_shift))

linux系統核心解析

在linux下有乙個目錄,即 usr src kernels 目錄,下面記載著乙個linux系統的核心檔案。linux核心 kernel 是整個作業系統的最底層,它負責整個硬體的驅動,以及提供各種系統所需的核心功能,包括防火牆機制 是否支援lvm或quota等檔案系統等等,如果核心不認識某個最新的硬...

Linux 核心等待佇列解析

在閱讀tun驅動時看到,有一些類似 add wait queue 的函式,這些函式正是執行等待佇列的相關操作,要說等待佇列還得從核心程序排程說起,核心排程系統內程序,分配時間片,但是有些程序如從網絡卡中讀資料,在網絡卡有資料到達之前程序處於阻塞狀態,如果此時給相應程序分配時間片做排程,無疑是浪費系統...

linux 核心解析(記憶體管理)

記憶體映象 一種記憶體冗餘技術,為了提高伺服器的可靠性,防止記憶體故障導致伺服器的資料永久丟失或者系統宕機。記憶體映象的工作原理與硬碟的熱備份類似,記憶體映象是將記憶體資料做了兩個拷貝,分別放在主記憶體和映象記憶體中。系統工作時會像兩個記憶體中寫入資料,因此使得記憶體資料有兩套完整的備份。記憶體整理...