- 论坛徽章:
- 0
|
谢谢 eexplorer
>So where is your wakeup code? process被设为TASK_INTERRUPTIBLE后,除非
>1. 别的process给你发signal,kernel会把你唤醒
>2. 在条件满足时,去wake_up_process,把process的state设为TASK_RUNNING,kernel才会调度你
>而且,一般在driver中,我们都使用wait_queue来实现
我现在将set_current_state(TASK_INTERRUPTIBLE);这句去掉就可以了,也就是说该进程调度之后立即成为可以执行的进程,也就是就绪的。这样也就没有等待设备是否已经就绪。
如果不去掉进程就没有就绪。可加入wait_queue中等待,但是这样需要在某处wake_up,进程已经调度出去了,需要等其他进程唤醒。前提是设备可以被多个进程同时访问,否则只能在中断中唤醒了。
>每个设备都会执行一次driver的probe()函数,在你的probe()函数中并不需要去管理这些设备,这是kernel相应的subsystem的事。
>f.e 假如你有两块一模一样的网卡,在你的probe()中只负责分配net_device并初始化它,然后向kernel的network subsystem注册这个设备。network subsystem会管理这些network device,比如第一块为eth0,第二块为eth1等等。。。
可能你们比较熟悉net_device,我是想些成char_device的。
我看的一些代码alloc_chrdev_region()或register_chrdev_region()都是注册一个主设备号的某个次设备号范围,也就是一次性把主次设备号都保留了,这应该是可以实现多设备的。
不知道cdev_add()怎么回事也是一次加一个主次设备号范围,还需要主次设备号。
最郁闷的是现在没有多个设备,不能试验。
我想到了另一个问题,就是驱动加载后自动在设备文件系统/dev显示设备名的问题。
据说在2.4中有devfs这种东西,在2.6中有udev。
我现在是2.6内核,用mknod 创建的设备文件,加载驱动后在/sys中也能看到的设备的信息。不能自动显示设备名可能是因为应用层没有udev这种工具。我试着在2.6中也用devfs但是仍然没有显示设备名。 |
|