当前位置: 技术问答>linux和unix
驱动原理问题,大家指教,初学。
来源: 互联网 发布时间:2016-04-11
本文导语: 我们写的驱动是作为一个进程在执行?具体我们的驱动是以什么方式运行的?如何产生的,因为我们写的驱动中没有main函数,怎么去运行? 本人初学,大家指教。谢谢 | 驱动其实只是一堆...
我们写的驱动是作为一个进程在执行?具体我们的驱动是以什么方式运行的?如何产生的,因为我们写的驱动中没有main函数,怎么去运行?
本人初学,大家指教。谢谢
本人初学,大家指教。谢谢
|
驱动其实只是一堆函数而已,用户进程使用设备时,通过系统调用进入内核空间,然后找到对应的驱动函数,完成对应的操作。
|
代码是一个静态的,而进程是一个动态的!
假设你的驱动叫A,分别了写a_open, a_read, a_write a_close这些函数,并把它以模块的方式加进内核中,此时,它是内核中的一部分,这里中是静态的特性
假设置有一个应用程序如下
main()
{
int fd = open("your_devie", O_RDWR); //1
read(fd, buf, len); //1
}
当这个程序运行中,执行语句1,那么它会进入内核(因为open是一个系统调用),内核会主调用驱动的open(a_open)函数,因为驱动向内核注册了这个函数,这样你写的a_open函数就是成了该进程的一部分了,接着是a_read函数。
可能与此同时,另一个进程写了该设备,那么它也会相应执行你的a_open函数,那么你的驱动代码又成了另一个进程的一部分…………
如果a_read被多个进程使用产生数据竞争时,请使用保护机制,因为你写的驱动不能保证有多少个用户同时使用,除非你限制不能同时有两个或以上的进程打开!
假设你的驱动叫A,分别了写a_open, a_read, a_write a_close这些函数,并把它以模块的方式加进内核中,此时,它是内核中的一部分,这里中是静态的特性
假设置有一个应用程序如下
main()
{
int fd = open("your_devie", O_RDWR); //1
read(fd, buf, len); //1
}
当这个程序运行中,执行语句1,那么它会进入内核(因为open是一个系统调用),内核会主调用驱动的open(a_open)函数,因为驱动向内核注册了这个函数,这样你写的a_open函数就是成了该进程的一部分了,接着是a_read函数。
可能与此同时,另一个进程写了该设备,那么它也会相应执行你的a_open函数,那么你的驱动代码又成了另一个进程的一部分…………
如果a_read被多个进程使用产生数据竞争时,请使用保护机制,因为你写的驱动不能保证有多少个用户同时使用,除非你限制不能同时有两个或以上的进程打开!
|
可以将init_module看作用户空间的main, 即程序入口
内核应该可以看着是一个大的进程,注册后,你的驱动就是这个进程的一部分,可以在驱动里使用kernel_thread()来创建内核线程
内核应该可以看着是一个大的进程,注册后,你的驱动就是这个进程的一部分,可以在驱动里使用kernel_thread()来创建内核线程