linux 内核管理子系统
来源:互联网 发布:下载ed2k的软件 编辑:程序博客网 时间:2024/05/16 19:14
一、
、
二、地址是32位,就有4G的空间,0-3G为用户空间,3-4G为内核空间。
内核空间又分为4个部分,黑色1、表示直接映射区,3G~3G+896M地址,这个只能访问低端地址,在3G+896M下3G以上的称低端内存,以上的称高端内存。这个是直接的3G+物理地址。
黑色2、vmalloc区域,可以访问低端和高端地址。
黑色3、永久内核映射区,只能访问高端地址。
黑色4、表示固定的,访问一些特殊的寄存器
注:红色1是物理内存分配。
红色2是物理地址与虚拟地址的映射
三、虚拟地址如何转换成物理地址:
首先先取出高10位可以找到页目录,在中间的10位找到页表,在11位找到物理页。
四、物理内存分配:
物理内存:detasheet里面的寄存器地址等。
虚拟内存:程序用到的地址。
但malloc时只有分配到虚拟的内存。当要用到的时候才有用到物理内存。kmalloc是真正的物理内存。slab会分配一个内存池。
以下转载:http://www.eefocus.com/spencer/blog/13-04/293210_d92e2.html
一般情况下,Linux系统中,进程的4GB内存空间被划分成为两个部分------用户空间和内核空间,大小分别为0~3G,3~4G。
用户进程通常情况下,只能访问用户空间的虚拟地址,不能访问到内核空间。
每个进程的用户空间都是完全独立、互不相干的,用户进程各自有不同的页表。而内核空间是由内核负责映射,它并不会跟着进程改变,是固定的。内核空间地址有自己对应的页表,内核的虚拟空间独立于其他程序。
3~4G之间的内核空间中,从低地址到高地址依次为:物理内存映射区—隔离带—vmalloc虚拟内存分配区—隔离带—高端内存映射区—专用页面映射区—保留区。
【内核空间内存动态申请】
主要包括三个函数:kmalloc(), __get_free_pages, vmalloc。
kmalloc(), __get_free_pages申请的内存位于物理地址映射区,而且在物理上也是连续的,它们与真实的物理地址只有一个固定的偏移,因此存在较简单的转换关系。而vmalloc申请的内存位于vmalloc虚拟内存分配区(这些区都是以线性地址为度量),它在虚拟内存空间给出一块连续的内存区,实质上,这片连续的虚拟内存在物理内存中并不一定连续,而vmalloc申请的虚拟内存和物理内存之间也没有简单的换算关系。
因为vmalloc申请的在虚拟内存空间连续的内存区在物理内存中并不一定连续,可以想象为了完成vmalloc,新的页表需要被建立,因此,知识调用vmalloc来分配少量内存是不妥的。
一般来讲,kmalloc用来分配小于128K的内存,而更大的内存块需要用vmalloc来实现。
【虚拟地址与物理地址关系】
对于内核物理内存映射区的虚拟内存(用kmalloc(), __get_free_pages申请的),使用virt_to_phys()和phys_to_virt()来实现物理地址和内核虚拟地址之间的互相转换。它实际上,仅仅做了3G的地址移位。
上述方法适用于常规内存(内核物理内存映射区),高端内存的虚拟地址与物理地址之间不存在如此简单的换算关系。因为它涉及到了分离物理页的页表控制机制。
【ioremap】
在ARM中,设备的寄存器或者存储块的这部分空间属于内存空间的一部分,我们称之为IO内存。
在内核中访问IO内存之前,我们只有IO内存的物理地址,这样是无法通过软件直接访问的,需要首先用ioremap()函数将设备所处的物理地址映射到内核虚拟地址空间(3GB~4GB)。然后,才能根据映射所得到的内核虚拟地址范围,通过访问指令访问这些IO内存资源。
在将I/O内存资源的物理地址映射成核心虚地址后,理论上讲我们就可以象读写RAM那样直接读写I/O内存资源了。为了保证驱动程序的跨平台的可移植性,我们应该使用Linux中特定的函数来访问I/O内存资源,而不应该通过指向核心虚地址的指针来访问。
【mmap】
用mmap映射一个设备,意味着使用户空间的一段地址关联到设备内存上,这使得只要程序在分配的地址范围内进行读取或者写入,实际上就是对设备的访问。这种数据传输是直接的,不需要用到内核空间作为数据转移的中间站。
remap_page_range函数的功能是构造用于映射一段物理地址的新页表,实现了内核空间与用户空间的映射。
在内核驱动程序的初始化阶段,通过ioremap()将物理地址映射到内核虚拟空间;在驱动程序的mmap系统调用中,使用remap_page_range()将该块ROM映射到用户虚拟空间。这样内核空间和用户空间都能访问这段被映射后的虚拟地址。
Ioremap:
进程空间?内核空间?IO内存
其中,后面两个指的是同一段物理内存区域,只是一个为虚拟地址,一个为物理地址。进程空间和内核空间对应着不同的物理地址,它们之间的数据传递,是实际的数据的拷贝。
Mmap:
进程空间?IO内存
其中,进程空间mmap得到的那段虚拟地址跟IO内存对应着同一段物理地址。这个过程没有额外的数据中转,读写都直接针对硬件的物理地址进行。
一般来讲,小数据量的传输用ioremap()就足够了,
【IO内存的一般访问方法】
1. 首先是调用request_mem_region()申请资源,即告诉内核,本驱动正在使用这段物理内存,其他驱动不得访问它们。在设备驱动模块加载或open()函数中进行。
2. 接着讲寄存器地址通过ioremap()映射到内核空间虚拟地址,之后就可以通过Linux设备访问编程接口访问这些设备的寄存器了。在设备驱动初始化、write(),read(),ioctl()函数中进行。
3. 访问完成之后,应对ioremap()申请的虚拟地址进行释放,并释放release_mem_region()申请的IO内存资源。在设备驱动模块卸载或release()函数中进行
上一篇:linux 动态.so和静态.a 和 makefile
下一篇:arm裸机开发
- linux 常见服务端口
- 【ROOTFS搭建】busybox的httpd...
- xmanager 2.0 for linux配置
- 什么是shell
- linux socket的bug??
- 请问Linux默认shell的是什么 ...
- 谁能够帮我解决LINUX 2.6 10...
- 现在的博客积分不会更新了吗?...
- shell怎么读取网页内容...
- ssh等待连接的超时问题...
- linux 内核管理子系统
- Linux内核子系统---内存管理子系统、进程管理子系统
- Linux 内核内存管理子系统
- linux 内核进程管理子系统
- linux内核内存管理子系统概要分析
- Linux 内核子系统之内存与进程管理子系统
- Linux内核时间管理子系统——时钟源
- Linux内核时间管理子系统——timekeeping
- Linux内核驱动学习(四)----内存管理子系统
- Linux内核驱动学习(五)----进程管理子系统
- Linux内核驱动学习(五)----进程管理子系统
- Linux内核驱动学习(四)----内存管理子系统
- Linux内核工程导论——电源管理子系统
- linux内核DCB子系统
- linux内核子系统
- linux内核DCB子系统
- linux内核网络子系统
- linux内核子系统
- 第十七周项目6-学生成绩统计(4)
- 内核打补丁
- css3制作小三角和镂空样式的小三角
- 关于Tor比较全面的讲解
- 如何在远程桌面的机器上访问自己本地硬盘
- linux 内核管理子系统
- arm裸机开发
- utf8 utf16区别(转)
- Linux设备驱动中的并发控制总结
- 近期小结
- linux内核分析之旅
- 关于Tor
- linux 内核同步机制
- 反射的基本使用实例