阅读:1204回复:1
驱动程序与系统调用
问题一:驱动程序与系统调用是怎样的关系?比如如果我们加载了一个字符设备驱动程序,然后
在应用程序中通过open和close等函数对其打开操作,这时候是通过系统调用中的open和close 来操作的吗?那系统调用又如何对应到struct file_operations中的那些具体的函数指针呢?另外在 file_operations有些函数指针的名字在系统调用中是没有的,这些函数又是如何被调用的? 问题二:在内核中也可以进行系统调用吗?在1号进程中有如下语句(init->main.c->init): if (open("/dev/console", O_RDWR, 0) < 0) printk("Warning: unable to open an initial console.\n"); (void) dup(0); (void) dup(0); 看来在内核中是可以进行系统调用的。但不是说系统调用是用户空间到内核空间的入口吗? 在内核中直接进行系统调用应该如何来理解呢? 问题三:这个问题与我目前的工作有关。我在”TTY、CONSOLE与串口“一贴中已经有所提及。 我最近的任务是把一个以前作的模块(用单片机控制,通过串口与上层通信)挂在系统的 串口上,用我们自己定义的一套通信协议来控制该模块的动作。现在系统里的串口在LINUX下已经是可用的(我们的CPU有四个串口,串口0作控制台,其他三个都用来挂接模块),所以在应用程序里完成上述的任务是可以的,但出于某些考虑,领导希望能作成单独的驱动程序模块。(另外一个原因是我们用的三线串口,但又要用DTR线,所以用一根GPIO线来模拟DTR,这个在应用程序中没法作吧)。我在考虑能否自己注册一个单独的字符设备驱动程序,然后在其操作函数中又去打开串口,比如: register_chrdev(xxx,xxx,struct file_operations * my_fops) ..... struct file_operations my_fops={ open: my_open, .... }; my_open(struct inode *inode,struct file * filp) { ... fd=open("dev/ttyS2"); //主要是不知道在驱动程序中作类似这样的操作是否可行 ... } 换言之,这样可以对原来的串口驱动不作任何改动,而只是在其上再加一层“封装”,把它 “改装”成另外一个驱动程序,不知这个思路是否可行? 刚接触LINUX,以上问题可能比较浅显,还望大侠指教。多谢! |
|
沙发#
发布于:2004-03-02 11:38
另外,刚才在linuxforum论坛看到很多人讨论在内核中调用
应用程序的问题(跟我前述的问题有关,所以我很关注), 似乎大家众口一词,搞的我也很茫然。希望大侠们指教。 |
|