ice_sword
驱动牛犊
驱动牛犊
  • 注册日期2003-12-14
  • 最后登录2003-12-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2145回复:5

请问:关于应用层函数与内核模块中的数据传输

楼主#
更多 发布于:2003-12-16 23:16
各位大虾:
    如果我在模块中export一个函数,应用层可以直接调用吗?
    如果不行?该用何种方法呢?能够给个例子?
    如果可以,能否也给个例子呢?一定给分!
wangqins
驱动小牛
驱动小牛
  • 注册日期2002-04-28
  • 最后登录2007-08-30
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-12-19 23:52
一般来说内核与应用的数据传递可以通过系统调用和驱动程序完成。如果你有源代码你可以在entry.c中加入你的系统调用,并建立相关的运行时库。直接写个驱动也可以。可以参见Linux驱动程序第二版进行学习。可以用驱动程序实现。内核与应用的数据传递可以用copy_from or to fs进行。具体函数名你可以参见Linux驱动程序第二版)。

实际上方法还是挺多的,不过我没有具体例子,好久没有写应用层的程序了。

祝你顺利。
ice_sword
驱动牛犊
驱动牛犊
  • 注册日期2003-12-14
  • 最后登录2003-12-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-12-20 10:10
其实是用系统调用感觉还可以,就是还要编译内核,比较麻烦,不知道那个ioctl可不可以?就是找不到一个例程
lehua
驱动牛犊
驱动牛犊
  • 注册日期2002-12-05
  • 最后登录2004-08-10
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-12-24 10:09
呵呵,从用户态是不可能直接调用核心态的代码的,只能通过软中断进入内核的入口x86好像是int指令吧,arm是swi,然后系统根据调用号来执行相应的系统调用。

在Linux下,内核模块一般通过设备文件来与用户态程序交互,最简单的是写一个字符设备驱动,实现其read,write,ioctl等方法。然后在用户态程序中打开其相应的设备文件,用普通的文件读写或ioctl操作就可以了。具体的操作过程看ldd的例子就可以。

还有一种方法是可以不用实现设备文件接口,而是直接利用proc文件系统来进行读写操作,这比较适合少量的控制,和输出。利用proc文件系统优点是可以在shell中用echo/cat命令进行操作。具体你也需要参考ldd(Linux设备驱动开发)

有问题继续问,我感觉这地方气氛还是不错的:)


各位大虾:
    如果我在模块中export一个函数,应用层可以直接调用吗?
    如果不行?该用何种方法呢?能够给个例子?
    如果可以,能否也给个例子呢?一定给分!
Hello, World!
ice_sword
驱动牛犊
驱动牛犊
  • 注册日期2003-12-14
  • 最后登录2003-12-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-12-26 15:04
呵呵,从用户态是不可能直接调用核心态的代码的,只能通过软中断进入内核的入口x86好像是int指令吧,arm是swi,然后系统根据调用号来执行相应的系统调用。

在Linux下,内核模块一般通过设备文件来与用户态程序交互,最简单的是写一个字符设备驱动,实现其read,write,ioctl等方法。然后在用户态程序中打开其相应的设备文件,用普通的文件读写或ioctl操作就可以了。具体的操作过程看ldd的例子就可以。

还有一种方法是可以不用实现设备文件接口,而是直接利用proc文件系统来进行读写操作,这比较适合少量的控制,和输出。利用proc文件系统优点是可以在shell中用echo/cat命令进行操作。具体你也需要参考ldd(Linux设备驱动开发)

有问题继续问,我感觉这地方气氛还是不错的:)


[quote]各位大虾:
    如果我在模块中export一个函数,应用层可以直接调用吗?
    如果不行?该用何种方法呢?能够给个例子?
    如果可以,能否也给个例子呢?一定给分!
[/quote]

通过字符设备进行控制前几天我已经搞定了,这里非常感谢,不过在应用程序里自动在dev下添加设备节点什么的,要用到execv族的函数。据说很麻烦,当你在应用程序中运行另一个程序,会造成当前应用程序的不可执行。不知大哥有何见解?
其实我想通过用socket中的原始套接字来实现,因为我就是为了通过应用层发指令修改处理网络数据包的一些表的。他的内在机制好像与字符设备驱动差不多,不过没有好的例子!
wangqins
驱动小牛
驱动小牛
  • 注册日期2002-04-28
  • 最后登录2007-08-30
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-12-27 00:30
exec实际上是替换当前进程的正文段,你可以fork之后再调用exec。exec不难的。我建议你看看link and load 这本书,你从google上查,查不到向我要,我的E-Mail sailing.w@263.net
游客

返回顶部