
memory
文章平均质量分 79
lamdoc
这个作者很懒,什么都没留下…
展开
-
内存驱动_MMU
一.内存空间和I/O空间,MMU1. 内存空间与I/O空间 X86处理器中,存在I/O空间的概念;I/O空间是相对于内存空间而言的。 大多数嵌入式微处理器中,如ARM,PowerPC等,并不提供I/O空间,只有内存空间。 2. 内存管理单元MMU MMU辅助操作系统,进行内存管理,提供虚拟地址和物理地址的映射,内存访问权限和cache缓存控制原创 2012-06-25 12:54:54 · 518 阅读 · 0 评论 -
iomap 一段内存映射相关的驱动
这个驱动设计了一个内存设备,这个设备完成对物理内存的映射,会生成/dev/iomap* 设备节点,供用户空间去访问, 从来间接实现了用户空间访问物理内存的方法。其实只需要mmap /dev/mem 方法去实现的,目前我也不知道这种驱动映射方法的优点。映射物理内存的设备结构体定义如下:/* define to use readb and writeb to read/write原创 2013-05-18 11:21:57 · 1387 阅读 · 0 评论 -
remap_pfn_range()和 vm_area_struct
remap_pfn_range() 函数的原型:int remap_pfn_range(struct vm_area_struct *vma, unsigned long virt_addr, unsigned long pfn, unsigned long size, pgprot_t prot); 该函数的功能是创建页表。参数:vma : 是内核根据用户的请求自己填写的,add原创 2013-05-18 10:15:54 · 433 阅读 · 0 评论 -
ioremap
根据CPU体系结构的不同,CPU对IO端口的编址方式有两种: (1)I/O映射方式(I/O-mapped) 典型地,如X86处理器为外设专门实现了一个单独的地址空间,称为"I/O地址空间"或者"I/O端口空间",CPU通过专门的I/O指令(如X86的IN和OUT指令)来访问这一空间中的地址单元。 (2)内存映射方式(Memory-mapped) RISC指令系统的CPU原创 2013-05-17 10:08:10 · 471 阅读 · 1 评论 -
BSS段_数据段_代码段_堆_栈
BSS段:BSS段(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域。BSS是英文Block Started by Symbol的简称。BSS段属于静态内存分配。数据段:数据段(data segment)通常是指用来存放程序中已初始化的全局变量的一块内存区域。数据段属于静态内存分配。代码段:代码段(code segment/text segment)通常是指用原创 2012-08-17 15:50:22 · 600 阅读 · 0 评论 -
highmem test
1. 下面是使能highmem 和添加 highmem memory region的一个补丁:diff --git a/arch/mips/Kconfig b/arch/mips/Kconfigindex 428e767..25c8499 100644--- a/arch/mips/Kconfig+++ b/arch/mips/Kconfig@@ -69,6 +69,7 @原创 2013-01-16 18:14:46 · 460 阅读 · 0 评论 -
kmalloc/kfree_vmalloc/vfree
Linux 处理内存分配通过创建一套固定大小的内存对象池. 分配请求被这样来处理, 进入一个持有足够大的对象的池子并且将整个内存块递交给请求者. 驱动开发者应当记住的一件事情是, 内核只能分配某些预定义的, 固定大小的字节数组.如果你请求一个任意数量内存, 你可能得到稍微多于你请求的, 至多是 2 倍数量. 同样, 程序员应当记住 kmalloc 能够处理的最小分配是原创 2012-06-13 18:22:54 · 856 阅读 · 0 评论 -
内核空间_用户空间_特权级别
1. linux将虚拟地址空间划分为两部分,内核空间和用户空间。一般32位处理器,虚拟内存大小= 2的32次方 B = 4GB.现在的64位处理器可以支持 虚拟内存 = 2的64次方 B = 16GB.用户空间地址范围 0 --- TASK_SIZE.内核空间地址范围 TASK_SIZE --- 4GB/16GB。一般32位处理器 TASK_SIZE = 3G,这个比较常见。原创 2012-06-13 17:28:56 · 388 阅读 · 0 评论 -
kernel启动时memory init情况
1. linux kernel启动时,会首先调用init/main.c 中的 asmlinkage void __init start_kernel(void); 定义如下:asmlinkage void __init start_kernel(void){ char * command_line; extern struct kernel_param原创 2012-12-27 10:04:43 · 1221 阅读 · 0 评论 -
DDR 初始化的一些代码
这是sta2065芯片的 DDR 初始化时候的一段代码,在bootloader中使用:int BL_InitDDRMemory(void){ uint32_t *i; int k; *((uint32_t *)0x101E0000) = 0x00021003; // ---------------------原创 2012-11-15 13:59:50 · 571 阅读 · 0 评论 -
a DDR Memory error
在DDR memory 初始化的地方遇到一个问题从nandflash 读取数据到memory, 再把memory中的数据dump出来之后,输出总是 低4位总是FFFF,如下所示:Setting DDR registersRemap RAMWait on RAMWait DLL locks RAMRemove remap RAMDoneReading OS...Bloc原创 2012-10-29 16:45:24 · 504 阅读 · 0 评论 -
多核中percpu的数据分配
linux2.6 为了方便创建和操作每个CPU数据,引进了新的操作接口,percpu(),该接口简化了创建了操作每个CPU的数据。定义于 和 中1. 定义和声明每个CPU变量:DEFINE_PER_CPU(type, name);这语句为系统的每个CPU都创建了一个类型为type,名字为name的变量。如果需要在别处声明此变量,以防编译时的警告,可使用下面的宏:原创 2012-07-30 15:45:55 · 1093 阅读 · 0 评论 -
高端内存的映射 -- 永久映射和临时映射
高端内存(Highmem)中的页不能永久地映射到内核地址空间,因此,通过alloc_pages()函数,以__GFP_HIGHMEM标志分配的页不可能有虚拟地址。X86体系结构中,高于896MB的所有物理内存都是高端内存,这些物理内存页不会永久的或自动的映射到内核地址空间。这些页需要被分配之后,才会映射到内核的虚拟地址空间上。X86体系结构中,高端内存中的页,通常被映射到3G-4G虚拟地址原创 2012-07-30 14:55:46 · 847 阅读 · 0 评论 -
slab分配器_高速缓存(kmem_cache)
Linux内核提供了slab层,也就是所谓的slab分配器。slab分配器扮演了通用数据结构缓存层的角色。1. slab层 有下面3个概念:高速缓存(kmem_cache):每个高速缓存(kmem_cache)由一个或多个slab组成。slab 由一个或多个物理上连续的页组成,一般情况也就一页。每个slab都包含一些对象成员,这些对象成员就是被缓存的数据结构。每个sla原创 2012-07-30 12:57:47 · 964 阅读 · 0 评论 -
页_区_获得页_释放页
内核把物理页作为内存管理的基本单位。内存管理单元(MMU)通常以页为单位进行处理,MMU是负责管理内存并把虚拟地址转换为物理地址的硬件。MMU以页(page)大小为单位来管理系统中的页表。体系结构的不同,所支持的页的大小也不尽相同,大多数32位体系结构支持4KB PAGE_SIZE, 64位的体系结构一般支持8KB的PAGE_SIZE。如果PAGE_SIZE=4KB, 1G物理内存原创 2012-07-27 14:27:47 · 514 阅读 · 0 评论 -
虚拟地址_物理地址_逻辑地址_页表_内存映射
1. 虚拟地址和物理地址:虚拟地址关系到进程的用户空间和内核空间,而物理地址则用来寻址实际可用的内存。linux用页表来为物理地址分配虚拟地址。进程的虚拟地址空间,都被内核划分为很多等长的部分,这样的部分成为页。物理内存也划分为同样大小的页。2. 页表页表是一种数据结构,用来将虚拟地址空间映射到物理地址空间。实现两个地址空间关联最容易的方法是使用数组,对虚拟地址空间的每一页原创 2012-06-13 17:29:51 · 1096 阅读 · 0 评论 -
kzalloc()_kcalloc()
定义在/include/linux/slab.h中1. kzalloc() --- kmalloc + memset 0; /** * kzalloc - allocate memory. The memory is set to zero. * @size: how many bytes of memory are required. * @f原创 2012-06-13 18:19:53 · 848 阅读 · 0 评论 -
malloc() 与 calloc()
1.分配内存空间函数malloc 调用形式: (类型说明符*) malloc (size) 功能:在内存的动态存储区中分配一块长度为"size" 字节的连续区域。函数的返回值为该区域的首地址。 “类型说明符”表示把该区域用于何种数据类型。(类型说明符*)表示把返回值强制转换为该类型指针。“size”是一个无符号数。例如: pc=(char *) malloc (100); 表示分配1原创 2012-06-21 11:15:55 · 485 阅读 · 0 评论 -
mmap读写/dev/mem设备,可用于读取物理内存内容
mmap操作提供了一种机制,让用户程序直接访问设备内存,这种机制,相比较在用户空间和内核空间互相拷贝数据,效率更高。在要求高性能的应用中比较常用。mmap映射内存必须是页面大小的整数倍,面向流的设备不能进行mmap,mmap的实现和硬件有关。mmap原型:#include void *mmap(void *start, size_t length, int prot, int flags原创 2012-12-05 15:11:53 · 916 阅读 · 2 评论