《Linux设备驱动开发详解》读书笔记(3)

第一章,    并发控制

Linux2.6.35之后取消了中断的嵌套。

读写乱序。可以通过barrier()来防止编译乱序,volatile防止读优化,DMB /DSB /ISB防止运行乱序。Linux中定义了mb(), rmb(),wmb()以及__iormb()/__iowmb()和readl()/writel()。保证对寄存器的访问不会乱。

中断屏蔽。Local_irq_enable()作用于CPU核,而enable_irq(x)工作在GIC中。

原子操作,针对整数。通过strex/ldrex实现(EX表示exclusive)。函数有atomic_set/add/inc()等。还有对bit的操作set_bit, clear_bit, test_and_set等。

自旋锁spin_lock_t,init(), lock(), unlock() 。可以加上irqsave()/restore()等。中断处理程序里面调用spin_lock_irqsave()其中irqsave()防止本CPU操作同一临界区,而spin_lock防止其他CPU的操作。读写自旋锁rwlock_t,read_lock()/unlock(), write_lock()/unlock()。一个写进程,多个都进程。读写不能同时进行。顺序锁seqlock_t。读写可同时进行,但是读要反复多次。写write_seqlock()/sequnlock(),读read_seqbegin()/retry()。RCU可以看做读写锁的高级版本,允许读写同时,但是开销大,需要回调函数。

信号量sem_init(), up(), down()等。可用于进程中。不再推荐,换用mutex。

互斥锁mutex_init, lock, unlock等。可用于进程中,占用资源较长时,推荐。

完成量completion, init(), wait_for_completion(), complete()。

第二章,    阻塞与非阻塞I/O

用户层。直接read()/write()。非阻塞,设置O_NONBLOCK。

设备层。

等待队列init_waitqueue_head(), add_wait_queue(), wait_event(), wake_up(),sleep_on()。所谓阻塞,就是将当前进程current添加到等待队列queue中,条件不满足,调用schedule()让出执行权。条件满足时,调用wake_up(),唤醒等待队列。一般两个queue,读等待队列r_wait,写等待队列w_wait。

用户层。调用select(),poll()或者epoll_wait()。

设备层。实现poll(),其中调用poll_wait(),将用户层传来的poll_table,添加到设备层等待队列(wait_queue_head)r_wait和w_wait。

第三章,    异步通知与异步I/O

用户层,signal()。

设备层。实现fasync()函数,支持F_SETFL(FASYNC)。资源可用时,调用kill_fasync()发出信号如SIGIO。 

用户层,glibc库, struct aiocb, aio_read()/_write()/_error()/_return()/_suspend()。或者用lio_listio()同时发去多个传输。基于多线程方式实现。无需内核帮助。

用户层使用libaio,调用io_setup(),io_set_callback(),io_submit()等。

设备层收到用户空间传过来的iocb结构,产生kiocb,执行file_ops中的aio_read(),aio_write(),aio_fsync()等。字符设备无需提供。块设备和网络设备在Linux核心代码解决。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值