l l waiteventqueue condition waiteventinterruptiblequeue condition waiteventtimeoutqueue condition
与休眠相关的数据结构和函数 l 等待队列 l 等待-唤醒函数 ¡wait_event(queue, condition) ¡wait_event_interruptible(queue, condition) ¡wait_event_timeout(queue, condition, timeout) ¡wait_event_interruptible_timeout(queue, conditio n, timeout) ¡void wake_up(wait_queue_head_t *queue); ¡void wake_up_interruptible(wait_queue_head_t *queue);
获知当前时间 l void do_gettimeofday(struct timeval *tv);
延后执行 l 长延时技术 ¡忙等待 ¡让出处理器 ¡超时 l 短延时技术 ¡void ndelay(unsigned long nsecs); ¡void udelay(unsigned long usecs); ¡void mdelay(unsigned long msecs);
内存分配 l 内存分配的最常用接口. l #include <linux/slab. h> l void *kmalloc(size_t size, int flags); l void kfree(void *obj);
内存分配标志 l 这些标志分配内存时修改内核的行为 l __GFP_DMA l __GFP_HIGHMEM l __GFP_COLD l __GFP_NOWARN l __GFP_HIGH l __GFP_REPEAT l __GFP_NOFAIL l __GFP_NORETRY
slab 缓存 l 创建和销毁一个 slab 缓存. 这个缓存可被用 来分配几个相同大小的对象. l #include <linux/malloc. h> l kmem_cache_t *kmem_cache_create(char *name, size_t size, size_t offset, unsigned long flags, constructor(), destructor( )); l int kmem_cache_destroy(kmem_cache_t *cache);
缓存标志 l 在创建一个缓存时可指定的标志. l SLAB_CTOR_ATOMIC l SLAB_CTOR_CONSTRUCTOR
缓存中分配释放单个对象 l 从缓存中分配和释放一个单个对象. /proc/slabinfo 一个包含对 slab 缓存使用情 况统计的虚拟文件. l void *kmem_cache_alloc(kmem_cache_t *cache, int flags); l void kmem_cache_free(kmem_cache_t *cache, const void *obj);
硬件读写屏障 l 硬件内存屏障. 它们请求 CPU(和编译器)来 检查所有的跨这个指令的内存读, 写 l #include <asm/system. h> l void rmb(void); l void read_barrier_depends(void); l void wmb(void); l void mb(void);
I/O读写 l 用来读和写 I/O 端口的函数. 它们还可以被用户空 间程序调用, 如果它们有正当的权限来存取端口. l #include <asm/io. h> l unsigned inb(unsigned port); l void outb(unsigned char byte, unsigned port); l unsigned inw(unsigned port); l void outw(unsigned short word, unsigned port); l unsigned inl(unsigned port); l void outl(unsigned doubleword, unsigned port);
I/O 端口资源分配 l I/O 端口的资源分配器. 这个检查函数成功 返回 0 并且在错误时小于 0 l #include <linux/ioport. h> l struct resource *request_region(unsigned long start, unsigned long len, char *name); l void release_region(unsigned long start, unsigned long len); l int check_region(unsigned long start, unsigned long len);
I/O地址映射 l ioremap 重映射一个物理地址范围到处理器 的虚拟地址空间, 使它对内核可用. iounmap 释放映射当不再需要它时. l #include <asm/io. h> l void *ioremap(unsigned long phys_addr, unsigned long size); l void *ioremap_nocache(unsigned long phys_addr, unsigned long size); l void iounmap(void *virt_addr);
内存区处理资源分配 l 为内存区处理资源分配的函数 l struct resource *request_mem_region(unsigned long start, unsigned long len, char *name); l void release_mem_region(unsigned long start, unsigned long len); l int check_mem_region(unsigned long start, unsigned long len);
I/O 内存存取函数 l 用来使用 I/O 内存的存取者函数. l #include <asm/io. h> l unsigned int ioread 8(void *addr); l unsigned int ioread 16(void *addr); l unsigned int ioread 32(void *addr); l void iowrite 8(u 8 value, void *addr); l void iowrite 16(u 16 value, void *addr); l void iowrite 32(u 32 value, void *addr); l
I/O 内存函数. l 旧的, 类型不安全的存取 I/O 内存的函数. l unsigned readb(address); l unsigned readw(address); l unsigned readl(address); l void writeb(unsigned value, address); l void writew(unsigned value, address); l void writel(unsigned value, address); l memset_io(address, value, count); l memcpy_fromio(dest, source, nbytes); l memcpy_toio(dest, source, nbytes);
注册注销中断处理 l 调用这个注册和注销一个中断处理. l #include <linux/interrupt. h> l int request_irq(unsigned int irq, irqreturn_t (*handler)( ), unsigned long flags, const char *dev_name, void *dev_id); l void free_irq(unsigned int irq, void *dev_id);
中断申请标志 l 给 request_irq 的标志. l SA_INTERRUPT 请求安装一个快速处理者 ( 相反是一个慢速的). l SA_SHIRQ 安装一个共享的处理者 l #include <asm/signal. h> l SA_INTERRUPT l SA_SHIRQ l SA_SAMPLE_RANDOM
使能和禁止中断 l 可以使能和禁止中断。共享处理不使用这个 函数. l void disable_irq(int irq); l void disable_irq_nosync(int irq); l void enable_irq(int irq);
禁止中断 l 使用 local_irq_save 来禁止本地处理器的中 断并且记住它们之前的状态 l void local_irq_save(unsigned long flags); l void local_irq_restore(unsigned long flags);
使能和禁止中断 l 在当前处理器无条件禁止和使能中断的函数. l void local_irq_disable(void); l void local_irq_enable(void);
内核定时器 l struct timer_list { /*. . . */ unsigned long expires; l void (*function)(unsigned long); unsigned long data; }; l void init_timer(struct timer_list *timer); l struct timer_list TIMER_INITIALIZER(_function, _expires, _data); l void add_timer(struct timer_list * timer); l int del_timer(struct timer_list * timer);
Tasklets 机制 l struct tasklet_struct { /*. . . */ void (*func)(unsigned long); unsigned long data; }; l void tasklet_init(struct tasklet_struct *t, void (*func)(unsigned long), unsigned long data); l DECLARE_TASKLET(name, func, data); l DECLARE_TASKLET_DISABLED(name, func, data);
作队列 l struct workqueue_struct *create_workqueue(const char *name); l struct workqueue_struct *create_singlethread_workqueue(const char *name); l
- Slides: 38