- 博客(17)
- 收藏
- 关注
原创 内核中与驱动相关的内存操作之十七(DMA)
DMA,即Direct Memory Access,直接内存访问.主要是考虑到CPU和外设之间拷贝大量数据时提升性能的一种硬件策略.
2014-03-18 16:16:23 2856
原创 内核中与驱动相关的内存操作之十六(异步I/O)
1.异步IO: 异步IO机制是指:一旦设备就绪,则主动通知应用程序,这样应用程序就不需要查询设备状态了.当设备就绪条件满足时,设备驱动发一个信号给对应的用户空间程序即可.对关设备是否可操作内核提供了三套机制:阻塞IO、非阻塞IO(poll)、异步通知.主要特性如下:
2014-03-18 16:14:11 974 1
原创 内核中与驱动相关的内存操作之十五(标准I/O)
标准IO又叫缓存IO,内核默认的就是标准IO机制.大多数文件系统的默认I/O操作都是缓存 I/O,比如用户将要写到磁盘的数据会被标准IO缓存,在一定的时机内核会把缓冲的数据写到物理磁盘上.其思想框架如下图所示: 标准IO有以下优点:•缓存 I/O 使用了操作系统内核缓冲区,在一定程度上分离了应用程序空间和实际的物理设备;•缓存 I/O 可以减少读盘的次数,从而提高性能;
2014-03-18 16:13:45 899
原创 内核中与驱动相关的内存操作之十四(直接I/O)
1.直接IO的宏观思想: 直接I/O,它是指数据可以直接在磁盘和应用程序地址空间进行传输,而不用路由内核提供的数据缓冲区.宏观框架示意图如下:2.直接IO出现的原因: 标准I/O即缓冲I/O,大多数文件系统的默认操作就是标准I/O.它的存在,缓冲了应用程序到实质物理设备的数据,内核会根据一定的时机更新到实质的物理设备和应用程序空间里面去.像一些应用程序,它有
2014-03-18 16:11:02 989
原创 内核中与驱动相关的内存操作之十三(/dev/mem)
在不少平台,包括嵌入式的,如jz4730,pxa-166等都把CPU可访问的整个物理地址空间(逻辑地址空间)映射到用户空间去.其和用户交互的设备节点就是/dev/mem.用户空间通过这个设备节点可以直接访问整个CPU可访的物理地址空间(逻辑地址空间).这里的映射,从宏观来讲,是一种"中介",一种"逻辑转换". 如果我们因为某种特殊需求需要在用户空间编写程序的话(现在有很多用户空间的驱动,
2014-03-18 16:10:08 1479
原创 内核中与驱动相关的内存操作之十二(mmap)
mmap是标准的用户空间的系统调用API.最为常见的就是用户空间对LCD的操作.mmap允许用户直接对硬件设备实现直接访问操作,因此,其效率是很高的.要正确使用mmap机制,首先重温一下VMA.
2014-03-18 16:09:15 1073
原创 内核中与驱动相关的内存操作之十一(IO内存)
设备通常会提供一组寄存器用于控制设备、读定设备和获取设备状态,即控制寄存器、数据寄存器和状态寄存器.这些寄存器可能位于I/O空间,也可能位于内存空间.当位于I/O空间时,通常被称为I/O端口,位于内存空间时,对应的内存空间被称为I/O内存.在嵌入式LINUX中,我们接触最多的就是I/O内存:#define request_mem_region(start,n,name) __request_r
2014-03-18 16:08:44 768
原创 内核中与驱动相关的内存操作之十(内存屏障)
虽然实际驱动中不常用,但是阅读内核比较深层的代码经常会遇到.为什么存在内存屏障呢?先看一下下面的场景: 编译器和处理器为了提高效率,可能对读和写操作重新进行了排序,例如:在某些处理器上,以下代码: A = 1; B = 2; 有可能在A中存放新值之前就在B中存放新值. 但是,我们在操作内存或者和硬件交互时,常常需要确保一个给定的顺序.
2014-03-18 16:05:04 716
原创 内核中与驱动相关的内存操作之九(重映射)
ioremap()函数也是需要建立新的页表,但是不会分配内存.它的功能是将一个物理地址转换成内核需要的虚拟地址(逻辑地址),从而实际硬件的操作.其相反的动作为iounmap(). 以S3C2440的RTC驱动为例:struct platform_device s3c_device_rtc = { .name = "s3c2410-rtc", .id
2014-03-18 16:04:10 846
原创 内核中与驱动相关的内存操作之七(slab)
slab分配器,是内核为了达到高效利用内存的一种管理算法,它以牺牲一些内存空间的代价,收获了代码在时间上的利益. 1.slab的动机: 在操作系统动作过程中,经常会涉及到大量对象的重复生成、使用与释放.在LINUX系统中所用到的对象,比较典型的例子是inode、task_struct等.这些大量的常用的对象如果每次都要从无到有生成、投入使用、使用完再释放,类似这样的操作频率很高.
2014-03-18 16:01:20 1314
原创 内核中与驱动相关的内存操作之六(vmalloc)
vmalloc是在整个虚拟空间分配出一段内存,它所面向的处理对象是CPU整个虚拟内存空间,而kmalloc是CPU的逻辑地址空间.逻辑地址空间也是"虚拟"的,只不过它和物理地址空间保持着线性关系的一种"虚拟地址空间",可以说,逻辑地址是虚拟地址的一个子集.1.原型: 2.参数说明: 3.返回值: 4.应用场景: 5.实例:
2014-03-18 16:00:46 833
原创 内核中与驱动相关的内存操作之五(kmalloc)
在内核空间里面获取一段内存区域,最常用到的API就是kmalloc.1.原型(lk2.6.22)如下:static inline void *kmalloc(size_t size, gfp_t flags) 2.参数说明:size: 要分配内存空间的大小,以字节为单位.flags: 分配标志,用来控制kmalloc的行为.主要如下:
2014-03-18 15:59:51 2612
原创 内核中与驱动相关的内存操作之三(内存模型)
1 页内核把物理页作为内存管理单元.大多数32全体系结构支持4KB的页.从虚拟内存角度来说,页就是最小单位.struct page结构体定义于中: Page结构与物理页相关的,而并非与虚拟页相关.因此,该结构对页的描述只是短暂的.即使页中所包含的数据继续存在,由于交换等原因,它们可能不再和同一个page结构关联.内核仅仅用这个数据结构来描述当前时刻在相关的物理页存放的东西.这种数据结构
2014-03-18 15:59:15 907
原创 内核中与驱动相关的内存操作之二(cache)
ARM处理器的主频比较高,而一般的主存储器的主频比较低.这样,如果指令和数据都存放在主存储器中,主存储器的速度将会严重制约整个系统的性能.为解决这一矛盾,引入了高速缓冲存储器(cache)和写缓冲区(write buffers).它位于主存储器和CPU之间,用来提高存储系统的性能的一种策略.其流程如下:CPUCache/WriteBufferRAM 1.高速缓冲存储器和写
2014-03-18 15:57:16 798
转载 u盘自动挂载-udev
Linux传统上使用静态设备创建的方法,在dev下创建了大量的节点,而不管这些节点相应的硬件设备是否存在。采用udev的方法,系统检测到设备才会往创建这些设备对应的节点。 这里我们简单的说一下udev的工作原理: Udev是依靠于sysfs的,当系统中添加一个新的设备后,内核检测到后就会产生一个hotplug event并查找/proc/sys/kernel/hotplug往找出治理设
2014-03-03 16:03:15 770
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人