内核函数(宏)总结

来源:互联网 发布:赚零用钱的软件 编辑:程序博客网 时间:2024/05/16 08:35

从2.6.32 移植到 2.6.18内核 上碰到的一个问题

 

当我们判断某个 红黑树节点 或者  list_node 没有被 加到红黑树(或者list)上时,我们会用

RB_EMPTY_NODE

list_empty_careful

if(!RB_EMPTY_NODE) {...}  表示若该节点没有被加到红黑树,就如何处理。

但是在2.6.32内核中,该函数的语义变了。 

if(RB_EMPTY_NODE) {...}  表示若该节点没有被加到红黑树,就如何处理。

 

1

preempt_count   获得当前进程上下文的spin_lock或者读写锁的数目。

 

默认编译选项出来的linux内核是非抢占式的,该模式下preempt_count一直为0,但是当你把内核编译成抢占式的话,该值会发生变化。

 

2

nr_free_pages 获得系统当前空闲页的数目。

 

 

3

 

用wait_on_bit 代替spin_lock。

 

在spin_lock中,schedule(或者sleep)都会发生很严重的问题, 所以可以尝试使用wait_on_bit。以前使用信号量来控制并发,但是信号量内部也是使用自旋锁实现的,所以现在使用 wait_on_bit这个函数。

它底层是用wait_queue_head_t实现的

 

:__wait_on_bit会让进程休眠吗? http://www.linuxforum.net/forum/showflat.php?Board=linuxK&Number=616702

 

4

wait_event(true)

将当前进程同步到某个事件

 

5 signal_pending( current )

检查当前进程是否有信号处理,返回不为0表示有信号需要处理

 

等待队列操作(wait queue) http://makel2004.blog.163.com/blog/static/413507720081153113241/

 

 

 

6 改变块设备的大小,并写入磁盘

 

 

set_capacity(asdp->gd, asdp->size);

i_size_write(bdev->bd_inode, dev_size);

mark_inode_dirty_sync(bdev->bd_inode);

 

7 test_bit返回值

  test_bit(int nr, void* addr)

前提:一个数的第2位被置位

若nr使用常数的话,则test_bit返回1 (内部调用constant_test_bit)

若nr使用变量的话,则test_bit返回-1 (内部调用variable_test_bit)

 

8 schedule_timeout

 

使用它一般建议睡眠的时间为HZ/50。 其它值可能有问题。

使用方法见内核。 一般是先把current置为TASK_INTERRUPTIBLE(或者TASK_UNINTERRUPTIBLE)