生死契阔,与子成说,执子之手,与子携老

一、ioremap

1.参考:

理解

(1)http://www.linuxidc.com/Linux/2011-04/34295.htm

代码过程

(1)http://wenku.baidu.com/link?url=ol3FJuVkhMrs80Q8wbGsFjTwclEMKZdN2fzsaqggSnGEPyqLuWOI0YDvXil0P2cp5UHQrd4Za7BWEuQGGN2NKrhbFYxxUqgFG-wMM5uFTN_

(2)

http://hi.baidu.com/zengzhaonong/item/a2dc5eb4f805fe9719469726

ioremap代码参数

(1)

http://baike.baidu.com/link?url=vfrIFDTnwR1aW_yDOkVLvnoQci4TwmD8jT28m9KSdTL5LEnyfG_nAB1Wcb9aozQSnjrJNMOu28qbL83SmdWxsK

(2)

http://blog.csdn.net/fuyjlu/article/details/5039782

(3)

http://www.hh010.com/os/html/47-2/2811.htm

2.实现

(1) Linux在io.h头文件中声明了函数ioremap(),用来将I/O内存资源的物理地 址映射到核心虚地址空间(3GB-4GB)中,原型如下:

void * ioremap(unsigned long phys_addr, unsigned long size, unsigned long flags);

  iounmap函数用于取消ioremap()所做的映射,原型如下:

void iounmap(void * addr);

  这两个函数都是实现在mm/ioremap.c文件中。

(2)

  在将I/O内存资源的物理地址映射成核心虚地址后,理论上讲我们就可以象读写RAM那样直接读写I/O内存资源了。为了保证驱动程序的跨平台的 可移植性,我们应该使用Linux中特定的函数来访问I/O内存资源,而不应该通过指向核心虚地址的指针来访问。如在x86平台上,读写I/O的函数如下 所示:

#define readb(addr) (*(volatile unsigned char *) __io_virt(addr))
#define readw(addr) (*(volatile unsigned short *) __io_virt(addr))
#define readl(addr) (*(volatile unsigned int *) __io_virt(addr))

#define writeb(b,addr) (*(volatile unsigned char *) __io_virt(addr) = (b))
#define writew(b,addr) (*(volatile unsigned short *) __io_virt(addr) = (b))
#define writel(b,addr) (*(volatile unsigned int *) __io_virt(addr) = (b))

#define memset_io(a,b,c) memset(__io_virt(a),(b),(c))
#define memcpy_fromio(a,b,c) memcpy((a),__io_virt(b),(c))
#define memcpy_toio(a,b,c) memcpy(__io_virt(a),(b),(c))

(3)

在内核驱动程序的初始化阶段,通过ioremap()将物理地址映射到内核虚拟空间;在驱动程序的mmap系统调用中,使用remap_page_range()将该块ROM映射到用户虚拟空间。这样内核空间和用户空间都能访问这段被映射后的虚拟地址。

remap_page_range函数的功能是构造用于映射一段物理地址的新页表,实现了内核空间与用户空间的映射,其原型如下:

int remap_page_range(vma_area_struct *vma, unsigned long from, unsigned long to, unsigned long size, pgprot_tprot);

(4)

在X86体系下的,CPU的物理地址和PCI总线地 址共用一个空间。linux内核将3G-4G的虚拟地址固定映射到了物理地址的0-1G的地方。但是如果外围设备上的地址高于1G,例如某块PCI卡分配 到了一个高于1G的地址,就需要调用ioremap来重新建立该物理地址(总线地址)和虚拟地址之间的映射。这个映射过程是这样的:在ioremap.c 文件的__ioremap函数中首先对将来映射的物理地址进行检查,也就是不能重新映射640K-1M地址(由于历史的原因,物理地址640k到1M空间 被保留给了显卡),普通的ram地也不能重新被映射。之后调用get_vm_area获得可用的虚拟地址,然后根这虚拟地址和欲映射的物理地址修改页表, 之后内核就可以用这个虚拟地址来访问映射的物理地址了。

二、buddy system

 

ioremap&buddy system的更多相关文章

  1. Buddy system伙伴分配器实现

    wikipedia:http://en.wikipedia.org/wiki/Buddy_memory_allocation The buddy memory allocation technique ...

  2. PatentTips - Modified buddy system memory allocation

    BACKGROUND Memory allocation systems assign blocks of memory on request. A memory allocation system ...

  3. Operating System Memory Management、Page Fault Exception、Cache Replacement Strategy Learning、LRU Algorithm

    目录 . 引言 . 页表 . 结构化内存管理 . 物理内存的管理 . SLAB分配器 . 处理器高速缓存和TLB控制 . 内存管理的概念 . 内存覆盖与内存交换 . 内存连续分配管理方式 . 内存非连 ...

  4. 内存管理(1)-buddy和slub算法

    Linux内存管理是一个很复杂的系统,也是linux的精髓之一,网络上讲解这方面的文档也很多,我把这段时间学习内存管理方面的知识记录在这里,涉及的代码太多,也没有太多仔细的去看代码,深入解算法,这篇文 ...

  5. Linux内存管理 - buddy系统

    本文目的在于分析Linux内存管理机制中的伙伴系统.内核版本为2.6.31.1. 伙伴系统的概念 在系统运行过程中,经常需要分配一组连续的页,而频繁的申请和释放内存页会导致内存中散布着许多不连续的页, ...

  6. Linux mem 2.4 Buddy 内存管理机制

    文章目录 1. Buddy 简介 2. Buddy 初始化 2.1 Struct Page 初始化 2.2 Buddy 初始化 3. 内存释放 4. 内存分配 4.1 gfp_mask 4.2 nod ...

  7. Linux驱动面试题

    1. Linux设备中字符设备与块设备有什么主要的区别?请分别列举一些实际的设备说出它们是属于哪一类设备. 字符设备:字符设备是个能够像字节流(类似文件)一样被访问的设备,由字符设备驱动程序来实现这种 ...

  8. Linux内核中常见内存分配函数【转】

    转自:http://blog.csdn.net/wzhwho/article/details/4996510 1.      原理说明 Linux内核中采用了一种同时适用于32位和64位系统的内存分页 ...

  9. Linux内核相关常见面试题

      转:http://www.embeddedlinux.org.cn/html/xinshourumen/201303/11-2475.html   本文详细阐述了linux内核相关的开发职位面试中 ...

随机推荐

  1. 【Android-布局复用】 多个界面复用一个布局文件(二)

    多个界面复用一个布局界面 ,如何找到复用布局文件中的控件的id? 举个栗子: 1.  layout_common.xml 复用的布局文件,如何找到button 的id? <?xml versio ...

  2. For 循环的嵌套与九九乘法表

    ㈠通过程序,在页面中输入如下图形 * * * * * * * * * * * * * * * * * * * * * * * * *  代码如下: //向body中输入一个内容 //document. ...

  3. Jmeter测试部全体学习

    Jmeter小助手:__counter   __Random   __UUID   __CSVRead 性能指标:CPU  内存  磁盘  网络   版本(系统版本) linux命令: top 能够试 ...

  4. js中showModalDialog的使用

    基本介绍:          showModalDialog()         (IE 4+ 支持)          showModelessDialog()      (IE 5+ 支持)    ...

  5. 用JavaScript实现快排

    啥是快排这里就不讲了,主要还是把原来c++学的东西抓紧转化过来 快排运用的是分而治之的思想,确定一个中值,把大的放右边,小的放左边,然后再左右分别对左右的左右(雾)进行处理 需要注意的一点是,这玩意远 ...

  6. SQL Server 基础:朝花夕拾

    序言 INSERT INTO SELECT 与 SELECT INTO 通俗来讲,INSERT INTO SELECT 和 SELECT INTO 两个语句的作用都是复制表,因为都是从一个表中查询出数 ...

  7. 在一个非默认的位置包含头文件stdafx.h

    如果stdafx.h和你当前的工程不在一个文件夹下,当你在代码中第一行写下#include "stdafx.h"时,VC编译器会根据编译规则(相关的规则请查看MSDN)来区别std ...

  8. 第四届西安邮电大学acm-icpc校赛 流浪西邮之寻找火石碎片 多体积条件背包

    题目描述 众所周知,由于木星引力的影响,世界各地的推进发动机都需要进行重启.现在你接到紧急任务,要去收集火石碎片,重启西邮发动机.现在火石碎片已成为了稀缺资源,获得火石碎片需要钱或者需要一定的积分.火 ...

  9. Oracle中将密码有效期由默认的180天修改成“无限制”

    将密码有效期由默认的180天修改成“无限制”: 在系统管理员下执行如下语句即可 ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED 修改之 ...

  10. python中list不能做索引

    先看python中内置的list不能作为字典的key. 可将list或者ndarray转化为tuple再做索引. list不能进行hash: import numpy as np a1 = np.ar ...