时间延迟、内存分配

版权声明:没有技术的的技术宅 https://blog.csdn.net/qq_23084801/article/details/82378312

内核时间

时间中断由系统定时硬件以周期性的间隔 产生,这个间隔由内核根据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变量时,系统中威哥处理器都会拥有该变量的副本,对该变量的访问几乎不需要锁定。

猜你喜欢

转载自blog.csdn.net/qq_23084801/article/details/82378312