与内存管理相关的几个宏

【转】与内存管理相关的几个宏

这几个宏把无符号整数转换成对应的类型
   
  
#define __pte(x) ((pte_t) { (x) } )
   #define __pmd(x) ((pmd_t) {
(x) } )
   #define __pgd(x) ((pgd_t) { (x) } )
  
#define __pgprot(x)     ((pgprot_t) { (x) }
)

   根据x把它转换成对应的无符号整数
   
  
#define pte_val(x)      ((x).pte_low)
  
#define pmd_val(x)      ((x).pmd)
  
#define pgd_val(x)      ((x).pgd)
  
#define pgprot_val(x)   ((x).pgprot)

  
与下一个页框对齐
   #define
PAGE_ALIGN(addr)       
(((addr)+PAGE_SIZE-1)&PAGE_MASK)
   
  
把内核空间的线性地址转换为物理地址
   #define
__pa(x)                
((unsigned long)(x)-PAGE_OFFSET)

  
把物理地址转化为线性地址
   #define
__va(x)                
((void *)((unsigned long)(x)+PAGE_OFFSET))

  
首先把pfn页框号转化为内核线性地址, 然后左移12位, 得到对应的内核线性地址
   #define
pfn_to_kaddr(pfn)      __va((pfn) <<
PAGE_SHIFT)

   根据页框号得到对应的物理页描述符
   #define
pfn_to_page(pfn)        (mem_map +
(pfn))

   根据物理描述符得到对应的页框号
   #define
page_to_pfn(page)       ((unsigned long)((page) -
mem_map))
   
  
根据内核线性地址得到其对应的物理页描述符
   #define
virt_to_page(kaddr)     pfn_to_page(__pa(kaddr) >>
PAGE_SHIFT)

   清除一个页表项并返回前一个值
   #define
ptep_get_and_clear(xp) __pte(xchg(&(xp)->pte_low, 0))

  
判断一个页表项是否指向同一页并且访问优先级相同
   #define pte_same(a,
b)          ((a).pte_low ==
(b).pte_low)
   
   x是页表项值, 通过pte_pfn得到其对应的物理页框号,
最后通过pfn_to_page得到对应的物理页描述符
   #define
pte_page(x)            
pfn_to_page(pte_pfn(x))

   如果对应的表项值为0, 返回1
  
#define
pte_none(x)            
(!(x).pte_low)

   x是页表项值, 右移12位后得到其对应的物理页框号
  
#define
pte_pfn(x)             
((unsigned long)(((x).pte_low >> PAGE_SHIFT)))

  
根据页框号和页表项的属性值合并成一个页表项值
   #define pfn_pte(pfn,
prot)      __pte(((pfn) << PAGE_SHIFT) |
pgprot_val(prot))

   根据页框号和页表项的属性值合并成一个中间表项值
  
#define pfn_pmd(pfn, prot)      __pmd(((pfn) <<
PAGE_SHIFT) | pgprot_val(prot))
   
  
向一个表项中写入指定的值
   #define set_pte(pteptr, pteval) (*(pteptr) =
pteval)
   #define set_pte_atomic(pteptr, pteval)
set_pte(pteptr,pteval)
   #define set_pmd(pmdptr, pmdval)
(*(pmdptr) = pmdval)
   #define set_pgd(pgdptr, pgdval) (*(pgdptr)
= pgdval)
   
   根据线性地址得到高10位值,
也就是在目录表中的索引
   #define pgd_index(address) (((address) >>
PGDIR_SHIFT) & (PTRS_PER_PGD-1))

  
根据mm和线性地址address得到目录项值
   #define pgd_offset(mm, address)
((mm)->pgd+pgd_index(address))

  
根据线性地址address提取在页表中的索引
   #define pte_index(address)
\
               
(((address) >> PAGE_SHIFT) & (PTRS_PER_PTE - 1))

  
根据页描述符和属性得到一个页表项值
   #define mk_pte(page, pgprot)   
pfn_pte(page_to_pfn(page), (pgprot))

与内存管理相关的几个宏,布布扣,bubuko.com

时间: 2024-10-12 09:02:00

与内存管理相关的几个宏的相关文章

YJX_Driver_034_内存管理相关内核API

1. 内存管理相关内核API A.RtlCopyMemory,RtlCopyBytes和RtlMoveMemory C.RtlZeroMemory和RtlFillMemory D.RtlEqualMemory E.ExAllocatePool和 ExFreePool F.重载new和delete操作符 [225]下面是从MSDN里面,复制出来的函数的说明 “ RtlCopyMemory//把地址Source开始的长度为Length这块内存数据 复制到Destination VOID RtlCop

OC内存管理相关整理

OC内存管理 一.基本原理 (一)为什么要进行内存管理.内存管理的目的是什么? 由于移动设备的内存极其有限,所以每个APP所占的内存也是有限制的,当app所占用的内存较多时,系统就会发出内存警告,这时需要回收一些不需要再继续使用的内存空间,比如回收一些不再使用的对象和变量等. 管理范围:任何继承NSObject的对象,对其他的基本数据类型无效 管理目的: 1.不要释放或者覆盖还在使用的内存,这会引起程序崩溃: 2.释放不再使用的内存,防止内存泄露.(ios程序的内存资源很是宝贵.) 本质原因是因

内存管理 相关宏

CC_SAFE_DELETE(p)       使用delete操作符删除一个C++对象p,如果p为NULL,则不进行操作 CC_SAFE_DELETE_ARRAY(p) 使用delete[]操作符删除一个C++数组p,如果p为NULL,则不进行操作 CC_SAFE_FREE(p)         使用free()函数删除p,如果p为NULL,则不进行操作 CC_SAFE_RELEASE(p)      使用release()方法释放Cocos2d-x对象p的一次引用,如果p为NULL,则不进行

C/C++中内存管理相关知识

内存分配方式 内存分配方式有三种: (1) 从静态存储区域分配.内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在.例如全局变量, static 变量. (2) 在栈上创建.在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放.栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限. (3) 从堆上分配,亦称动态内存分配.程序在运行的时候用 malloc 或 new 申请任意多少的内存,程序员自己负责在何时用 free 或

linux内核探索之内存管理(二):linux系统中的内存组织--结点、内存域和页帧

本文主要参考<深入linux内核架构>(3.2节)及Linux3.18.3内核源码 概述:本文主要描述了内存管理相关的数据结构:结点pg_data_t.内存域struct zone以及页帧(物理页):struct page ,以及该结构相关的一些基本概念. 1. 概述 内存划分为接点,每个结点关联到系统中的一个处理器,在内核中表示为pg_data_t. 各个结点又划分为内存域,比如DMA内存域,高端内存域,普通内存域. 内核内存域的宏: enum zone_type { #ifdef CONF

【转载】OGRE 内存管理

原文:OGRE 内存管理 Ogre引擎中与内存管理相关的文件大致有以下几个(只列出头文件) OgreAlignedAllocator.h OgreMemoryAllocatedObject.h OgreMemoryAllocatorConfig.h OgreMemoryNedAlloc.h OgreMemoryNedPooling.h OgreMemoryStdAlloc.h OgreMemorySTLAllocator.h OgreMemoryTracker.h Ogre引擎的内存分配方式主要

菜鸟学习Cocos2d-x 3.x——内存管理

菜鸟学习Cocos2d-x 3.x——内存管理 2014-12-10 分类:Cocos2d-x / 游戏开发 阅读(394) 评论(6) 亘古不变的东西 到现在,内存已经非常便宜,但是也不是可以无限大的让你去使用,特别是在移动端,那么点内存,那么多 APP要抢着用,搞不好,你占的内存太多了,系统直接干掉你的APP,所以说了,我们又要老生常谈了——内存管理.总结COM开发的时候,分析过COM的 内存管理模式:总结Lua的时候,也分析了Lua的内存回收机制:前几天,还专门写了C++中的智能指针在内存

iOS-旧项目中手动内存管理(MRC)转ARC

在ARC之前,iOS内存管理无论对资深级还是菜鸟级开发者来说都是一件很头疼的事.我参 加过几个使用手动内存管理的项目,印象最深刻的是一个地图类应用,由于应用本身就非常耗内存,当时为了解决内存泄露问题,每周都安排有人值班用 Instruments挨个跑功能,关键是每次都总能检查出来不少.其实不管是菜鸟级还是资深级开发者都避免不了写出内存泄露的代码,规则大家都懂,可是 天知道什么时候手一抖就少写了个release? 好在项目决定转成ARC了,下面将自己转换的过程和中间遇到的问题写出来和大家共享,希望

Magenta源代码笔记(3) —— 内存管理【转】

转自:http://blog.csdn.net/boymax2/article/details/52550197 版权声明:本文为博主原创文章,未经博主允许不得转载. Magenta内核支持虚拟地址的配置,依赖于cpu内的mmu模块. 下面会从以下几个方面对Magenta内核内存管理方面的代码进行分析: 1.mmu初始化,也就是硬件mmu的初始化,以底层寄存器操作为主,汇编 2.pmm初始化,也就是代码中物理内存结构的初始化 3.vmm初始化,也就是代码中虚拟内存结构的初始化 mmu初始化 mm