linux64位ioremap函数,linux操作系统中的ioremap函数详解
在编写驱动程序的过程中,我们总免不了要使用ioremap函数来将我们的硬件的地址映射到系统的虚拟地址空间。
ioramp函数原型:
#define ioremap(cookie,size) __ioremap(cookie,size,0,1)
这是一个宏来实现的,当然要进入__ioremap去看看究竟。
void __iomem *
__ioremap(unsigned long phys_addr, size_t size, unsigned long
flags,
unsigned long align)
{
void * addr;
struct vm_struct * area;//管理虚拟页面所使用的结构体
unsigned long offset, last_addr;
last_addr = phys_addr + size - 1;
if (!size || last_addr 《 phys_addr)
return NULL;
offset = phys_addr & ~PAGE_MASK; //取得偏移量
phys_addr &= PAGE_MASK; //得到页面的基地址
size = PAGE_ALIGN(last_addr + 1) - phys_addr;
//取得所需要的尺寸。注意是按照对齐来算的
area = get_vm_area(size, VM_IOREMAP);//通过get_vm_area来获得虚拟内存
if (!area)
return NULL;
addr = area-》addr;
if (remap_area_pages((unsigned long) addr, phys_addr, size, flags))
{
vfree(addr);
return NULL;
}
return (void __iomem *) (offset + (char *)addr);
}
遇到了get_vm_area函数,我们goto Defination去看看。
struct vm_struct *get_vm_area(unsigned long size, unsigned long
flags)
{
return __get_vm_area(size, flags, VMALLOC_START, VMALLOC_END);
}
继续
struct vm_struct *__get_vm_area(unsigned long size, unsigned long
flags,
unsigned long start, unsigned long end)
{
struct vm_struct **p, *tmp, *area;
unsigned long align = 1;
unsigned long addr;
if (flags & VM_IOREMAP) {
int bit = fls(size); //获得最高位为1所在的位置,0x00000600返回10
if (bit 》 IOREMAP_MAX_ORDER) //如果分配超过最大尺寸,按照最大尺寸处理
bit = IOREMAP_MAX_ORDER;
else if (bit 《 PAGE_SHIFT)
bit = PAGE_SHIFT; //以页为单位进行分配,最小单位是页
align = 1ul 《 bit;//以页来对齐
}
addr = ALIGN(start, align);
area = kmalloc(sizeof(*area), GFP_KERNEL);//分配一个空间来保存这些信息的结构体
if (unlikely(!area))
return NULL;
size += PAGE_SIZE;//中间空了一页,目的是安全稳定
if (unlikely(!size)) {
kfree (area);
return NULL;
}
write_lock(&vmlist_lock);
for (p = &vmlist; (tmp = *p) != NULL ;p =
&tmp-》next) {
if ((unsigned long)tmp-》addr 《 addr) {
if((unsigned long)tmp-》addr + tmp-》size 》= addr)
addr = ALIGN(tmp-》size +
(unsigned long)tmp-》addr, align);//找空闲的虚拟地址
continue;
}
if ((size + addr) 《 addr)
goto out;
linux64位ioremap函数,linux操作系统中的ioremap函数详解相关推荐
- linux日志配置含义,Linux操作系统中的日志功能详解
日志系统将我们系统运行的每一个状况信息都使用文字记录下来,这些信息有助我们观察系统运行过程中正常状态和系统运行错误时快速定位错误位置的途径等;下面学习啦小编主要概述一下Linux操作系统中的日志功能. ...
- Linux系统中的软件管理详解(下)—搭建网络软件仓库及第三方软件仓库
Linux系统中的软件管理详解(下) 5.软件仓库管理命令 a)dnf 命令: 管理软件仓库中的安装包 dnf repolist ##列出仓库信息clean all ##清除系统中已经加载的仓库缓存信 ...
- linux系统里route -n不起作用,Linux系统中traceroute命令使用详解
Linux系统中traceroute命令可以追踪到网络数据包的路由途径.下面由学习啦小编为大家整理了linux系统中traceroute命令使用详解,希望对大家有帮助! Linux系统中tracero ...
- Linux 内核中RAID5源码详解之守护进程raid5d
Linux 内核中RAID5源码详解之守护进程raid5d 对于一个人,大脑支配着他的一举一动:对于一支部队,指挥中心控制着它的所有活动:同样,对于内核中的RAID5,也需要一个像大脑一样的东西来支配 ...
- Linux系统中UID和GID详解
Linux系统中UID和GID详解 在Linux系统中,每个用户和组都有一个唯一的数字标识符,分别称为UID(用户ID)和GID(组ID).这些标识符用于在系统级别上对用户和组进行身份验证和授权,并且 ...
- linux的常用的wc命令,Linux系统中wc命令使用详解
Linux系统中wc命令是统计文件文本的字节数等并显示输出.下面由学习啦小编为大家整理了linux系统中wc命令使用详解,希望对大家有帮助! Linux系统中wc命令使用详解 Linux系统中的wc( ...
- linux tftp客户端安装命令,Linux系统中tftp命令使用详解
Linux系统中tftp命令主要是传输文件用的.下面由学习啦小编为大家整理了linux系统中tftp命令使用详解,希望对大家有帮助! Linux系统中tftp命令使用详解 语法 tftp [主机名称或 ...
- Linux操作系统基础知识命令参数详解
Linux操作系统 RAID分组 RAID JBOD RAID JBOD的意思是Just a Bunch Of Disks,是将多块硬盘串联起来组成一个大的存储设备,从某种意义上说这种类型不被算作RA ...
- linux hook 任意内核函数,linux内核中的hook函数详解
在编写linux内核中的网络模块时,用到了钩子函数也就是hook函数.现在来看看linux是如何实现hook函数的. 先介绍一个结构体: struct nf_hook_ops,这个结构体是实现钩子函数 ...
最新文章
- 32位postman_谷歌浏览器下载安装postman教程(详细)
- Robot Framework自动化测试(六)--- robotremoteserver使用
- java 打包apk_Android APK打包流程
- opencv入门 - 显示图像学习总结
- perl里字符串取长度,比较等一些操作
- Visual Studio 2013开发 mini-filter driver step by step 应用层与内核通讯(8)
- QImage、 QPixmap、 QBitmap、 QPicture区别
- html中图片的属性优化,Html标签元素在SEO中的优化方式(二)
- C++ class实现双向循环链表(完整代码)
- php 简析对象,PHP白盒审计工具RIPS源码简析
- 守护进程之守护进程的特征
- 浏览器原生支持平滑滚动
- 《数据结构》-二叉树(二叉链表实现)
- 关于谷歌不兼容showModalDialog的解决方案
- 【电力】永磁同步电机-自抗扰控制PMSM ADRC附matlab代码
- 移动应用/APP的测试流程及方法
- ubuntu命令行fdisk扩展分区
- MOS管RC缓冲电路相关参数计算方法
- 服务器共享文件搜索慢的原因,客户端访问服务器共享文件反应很慢.doc
- 功放、音响、耳机、播放器试音歌曲,说不定你会喜欢