linux 的 page 結構體的一點筆記
* Each physical page in the system has a struct page associated with
* it to keep track of whatever it is we are using the page for at the
* moment. Note that we have no way to track which tasks are using
* a page, though if it is a pagecache page, rmap structures can tell us
* who is mapping it.
*/
struct page {
unsigned long flags; /* Atomic flags, some possibly
* updated asynchronously */
atomic_t _count; /* Usage count, see below. */
union {
atomic_t _mapcount; /* Count of ptes mapped in mms,
* to show when page is mapped
* & limit reverse map searches.
*/
struct { /* SLUB */
u16 inuse;
u16 objects;
};
};
union {
struct {
unsigned long private; /* Mapping-private opaque data:
* usually used for buffer_heads
* if PagePrivate set; used for
* swp_entry_t if PageSwapCache;
* indicates order in the buddy
* system if PG_buddy is set.
*/
struct address_space *mapping; /* If low bit clear, points to
* inode address_space, or NULL.
* If page mapped as anonymous
* memory, low bit is set, and
* it points to anon_vma object:
* see PAGE_MAPPING_ANON below.
*/
};
#if USE_SPLIT_PTLOCKS
spinlock_t ptl;
#endif
struct kmem_cache *slab; /* SLUB: Pointer to slab */
struct page *first_page; /* Compound tail pages */
};
union {
pgoff_t index; /* Our offset within mapping. */
void *freelist; /* SLUB: freelist req. slab lock */
};
struct list_head lru; /* Pageout list, eg. active_list
* protected by zone->lru_lock !
*/
/*
* On machines where all RAM is mapped into kernel address space,
* we can simply calculate the virtual address. On machines with
* highmem some memory is mapped into kernel virtual memory
* dynamically, so we need a place to store that address.
* Note that this field could be 16 bits on x86 ... ;)
*
* Architectures with slow multiplication can define
* WANT_PAGE_VIRTUAL in asm/page.h
*/
#if defined(WANT_PAGE_VIRTUAL)
void *virtual; /* Kernel virtual address (NULL if
not kmapped, ie. highmem) */
#endif /* WANT_PAGE_VIRTUAL */
#ifdef CONFIG_WANT_PAGE_DEBUG_FLAGS
unsigned long debug_flags; /* Use atomic bitops on this */
#endif
#ifdef CONFIG_KMEMCHECK
/*
* kmemcheck wants to track the status of each byte in a page; this
* is a pointer to such a status block. NULL if not tracked.
*/
void *shadow;
#endif
};
相關推薦
linux 的 page 結構體的一點筆記
/* * Each physical page in the system has a struct page associated with * it to keep track of whatever it is we are using the page for at the * moment. Not
linux核心page結構體的PG_referenced和PG_active標誌
linux核心使用了lru演算法來置換記憶體頁面,但是實際上並不是純的lru演算法,裡面摻雜了很多別的思想,比如第二次機會,比如雙時鐘指標等等。這裡著重說一下第二次機會的體現。在核心中有一個mark_page_accessed函式,它實際上體現一個狀態機,這是它的實現: if
linux中結構體對齊【轉】
src double 無需 fine types 查看 真理 blog 多個 轉自:https://blog.csdn.net/suifengpiao_2011/article/details/47260085 linux中定義對齊字節 typedef struct
Linux 變數結構體等命名規則
1 識別符號 在程式設計中,變數名、函式名、陣列名等統稱為識別符號。簡單地說,識別符號就是一個名字。除庫函式的函式名由系統定義外,其餘都由使用者自定義。C語言規定,識別符號只能由字母(a~z,A~Z)、數字(0~9)、下劃線(_)組成,並且識別符號的第一個字元必須是字母或下劃線,不能以數字開頭。C語言
linux C 結構體struct的定義和初始化
struct 定義: struct test { int a; long b; float c; char d; char e[]; }tt1,tt2;//物件宣告列表緊跟struct定義 struct test tt3,tt4;//單獨宣告物件列表 //宣告一個沒結構體名
Linux 中結構體的記憶體分配問題
不要用sizeof(struct gg),這個不能說明問題,你需要在定義一個gg的變數後,再在其後定義另一個變數,將這兩個變數的地址相減才能求出實際結果,而且你的測試一定是在VC中,GCC中是4個位元組的不能用這種方式來求結構體佔用的空間,這是不準確的,不過在另一種程度上可以說得過去,因為結構體地址是被4整除
linux通過結構體struct resource描述一個具體的硬體
linux對掛接在4G匯流排空間上的裝置實體的管理方式 -- struct resource/usr/src/linux-2.6.21.5/include/linux/ioport.hstruct re
結構體學習筆記3——結構體取成員運算符
兩種 style stdlib.h 變量定義 tdi urn 飛揚 單獨 span 訪問成員:學會之後可以對結構體中的成員,單獨進行操作。 結構體訪問成員分兩種:1,對結構體實例變量的訪問 2,對結構體指針變量的訪問。 struct Stu stu1;//實例變量就
結構體學習筆記6——結構體嵌套
%d class std {} 當前 system 學習 use pau 結構體嵌套就是 在當前的結構體內的一個成員是另一個整體的結構體變量! struct Stu { char name[10]; int age; }; struct Te
結構體學習筆記7——結構體數組
truct struct %s \n 元素 結構體類型 類型 char printf 結構體數組:有一個數組,每個元素是一個結構體類型。 #include <stdio.h> #include <stdlib.h> struct Teach
學習筆記 linux 結構體位元組對齊
網路位元組序傳傳輸的,結構體要用一位元組對齊,否則會因為預設對齊方式而造成程式資料異常,如下圖結構體,預設對齊方式下,結構體長度為2+2+2+2=8;一位元組對齊方式下,結構體長度為1+2+2+2=7 #pragma pack(1) typedef struc
Linux下C結構體初始化
直觀 tro 擴展性 方式 建議 struct 初始化方式 www 寫到 原文地址在這裏: http://www.cnblogs.com/Anker/p/3545146.html 我 只把裏面的主要介紹和代碼寫到這裏了. 順序初始化 教科書上講C語言結構體初始化
【2017-07-01】Linux應用開發工程師面試問題記錄之二:關於結構體的大小及內存對齊問題
偶數 而且 strong span net 但是 開發 f11 flag Tencent後臺服務器開發有一道題是計算一個結構體的sizeof的大小: struct strData { int m_Int; char m_Char; short m_Short; char
golang筆記(1)-數據庫查詢結果映射至結構體
tint 地址 style 定義數據 range con clas num end 通用的映射模式 query:="select id,name from user where id=?" //單個結構體ret:=&Activity{} DbClient(
Linux系統結構目錄、ls命令、文件類型、alias命令筆記
linux系統結構目錄 文件類型 ls命令 alias命令 Linux系統結構目錄: 使用ls命令查看根目錄就可以看到系統結構目錄:useradd命令可以創建一個普通用戶:安裝tree命令: tree命令可以樹形的方式顯示目錄結構,在CentOS7中的最小化安裝tree命令是需要自己手動安
c語言學習筆記.結構體.
成員訪問運算符 div 成員 bsp tro truct 年齡 可用 語言學 結構體: 一種用戶自定義的可用的數據類型,它允許您存儲不同類型的數據項。 定義/聲明: struct 類型名{ 成員1; 成員2; ... 成員n; } 變量
c語言執行linux命令並通過結構體返回每行命令的輸出
打印 linux pop sscanf [] #define ufs pan pipe #include <stdio.h> #include <stdlib.h> #include <unistd.h>
關於指針和結構體的一點教訓
地址 usart 但是 image 分代 數據 圖片 數值 inf 在DMA控制中,我使用了這樣的一部分代碼,想實現從內存到外設 的數據搬運。 後來經過仔細查證,發現了指針的一些基礎不牢。現總結如下: 圖中的外設地址寫的為USART1,其地址為0x40011000,而
Linux進程描述符task_struct結構體詳解--Linux進程的管理與調度(一)【轉】
mage ase 設備 兩種 等價 而且 當前 結構體 技術 Linux內核通過一個被稱為進程描述符的task_struct結構體來管理進程,這個結構體包含了一個進程所需的所有信息。它定義在include/linux/sched.h文件中。 談到task_struct結構體
go學習筆記-結構體
結構體 結構體是由一系列具有相同型別或不同型別的資料構成的資料集合 定義 格式 type struct_variable_type struct { member definition; member definition; ... member definition; }