概述
内核时间
时间中断由系统定时硬件以周期性的间隔产生,这个间隔由内核根据HZ的值设定,大多数平台每秒有100次或1000次中断。计数器是一个64位变量,即使在32位架构上也是,称为jiffies_64,但是驱动程序开发者通常访问的是jiffies变量,它是unsigned long型变量,要么和jiffies_64相同,要么只是它的低32位。
老的timeval使用秒和毫秒,新的timespec使用秒和纳秒
struct timeval
{
__time_t tv_sec; /* Seconds. */
__suseconds_t tv_usec; /* Microseconds. */
};
struct timespec
{
time_t tv_sec; /*second*/
long tv_nsec; /*nanosecond*/
}
kmalloc在空闲内存较少时把当前进程转入休眠以等待一个页面,因此使用GFP_KERNEL分配内存的函数必须是可重入的。有时kmalloc是进程上下文之外被调用的, 例如在中断例程、tasklet以及内核定时器中调用。这种情况下current进程就不应该休眠,驱动程序则应该调用GFP_ATOMIC标志。
Linux内核把内存分为三个区段:可用于DMA的内存、常规内存、高端内存。通常的内存奉陪发生在常规内存区。高端内存是32位平台为访问大量内存而存在的一种机制。内核负责管理系统物理内存,物理内存只能按页面进行分配。
后备高速缓存
设备驱动程序常常会反复分配很多同一大小的内存块,为这些反复使用的块增加某些特殊的内存池称为后备高速缓存。USB和SCSI驱动程序会使用高速缓存。Linux内核的高速缓存管理有时称为“slab分配器”。kmem_cache_create()创建池,kmem_cache_alloc()分配。
scullc 基于slab高速缓存
scullp 使用整页__get_free_pages()函数
scullv 使用虚拟地址
vmalloc分配虚拟地址空间的连续区域。尽管这段区域在物理上可能不连续。kmalloc和__get_free_pages返回的内存地址也是虚拟地址,但是其使用的虚拟地址和物理地址是一一对应的。这两个函数不需要为该段地址修改页表。valloc和ioremap使用的地址范围完全是虚拟的,每次分配都要通过对页表适当设置来建立虚拟内存区域。ioremap更多用于映射物理的PCI缓冲区地址到虚拟内核空间。
pre-CPU变量
当建立一个pre-CPU变量时,系统中每个处理器都会拥有该变量的副本,对该变量的访问几乎不需要锁定。
最后
以上就是疯狂八宝粥为你收集整理的Linux驱动----6、时间延迟、内存分配的全部内容,希望文章能够帮你解决Linux驱动----6、时间延迟、内存分配所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复