hexf2002
驱动牛犊
驱动牛犊
  • 注册日期2004-02-12
  • 最后登录2005-04-29
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1204回复:1

驱动程序与系统调用

楼主#
更多 发布于:2004-03-02 11:28
问题一:驱动程序与系统调用是怎样的关系?比如如果我们加载了一个字符设备驱动程序,然后
在应用程序中通过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,以上问题可能比较浅显,还望大侠指教。多谢!
hexf2002
驱动牛犊
驱动牛犊
  • 注册日期2004-02-12
  • 最后登录2005-04-29
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-03-02 11:38
另外,刚才在linuxforum论坛看到很多人讨论在内核中调用
应用程序的问题(跟我前述的问题有关,所以我很关注),
似乎大家众口一词,搞的我也很茫然。希望大侠们指教。
游客

返回顶部