degyhy123
驱动小牛
驱动小牛
  • 注册日期2002-11-12
  • 最后登录2014-02-09
  • 粉丝0
  • 关注0
  • 积分15分
  • 威望71点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
阅读:1767回复:17

关于多个设备用一个dll的问题

楼主#
更多 发布于:2004-09-16 08:23
各位老大,我的多个设备要加载同一个dll文件,我想问一下我的这个文件是被加载一次,然后不同的设备用不同的函数还是5个设备就加载5次这个dll文件,还有,如果加载一次的话,我在文件中定义的静态全局变量是不是可以被多个设备使用
wxl_50685330
论坛版主
论坛版主
  • 注册日期2002-11-19
  • 最后登录2018-09-25
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望521点
  • 贡献值0点
  • 好评度419点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-09-16 13:04
DLL只被加载一次,不同的进程调用loadlibrary时把它映射到自己的地址空间,dll中的所有数据都会被共享
根据地的兄弟们,团结就是力量
leo_cyl
驱动牛犊
驱动牛犊
  • 注册日期2001-08-20
  • 最后登录2009-11-02
  • 粉丝0
  • 关注0
  • 积分22分
  • 威望13点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-09-16 13:21
"dll中的所有数据都会被共享"应该不是吧?
dll中有share属性的数据段才会被共享吧。
wxl_50685330
论坛版主
论坛版主
  • 注册日期2002-11-19
  • 最后登录2018-09-25
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望521点
  • 贡献值0点
  • 好评度419点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-09-16 13:31
:)我的错
根据地的兄弟们,团结就是力量
wxl_50685330
论坛版主
论坛版主
  • 注册日期2002-11-19
  • 最后登录2018-09-25
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望521点
  • 贡献值0点
  • 好评度419点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-09-16 13:39
哎呀呀,刚才说全会被共享是凭想象哈:),试了一下,好像函数可以共享,但是每个load这个库的进程会建立自己的数据块,leo_cyl兄弟,怎么指定一个数据的属性为share?在源代码中给什么修饰关键字?还是编译的时候给参数?
根据地的兄弟们,团结就是力量
linwn
驱动牛犊
驱动牛犊
  • 注册日期2002-11-10
  • 最后登录2015-01-27
  • 粉丝0
  • 关注0
  • 积分97分
  • 威望30点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-09-16 13:48
关注中
wxl_50685330
论坛版主
论坛版主
  • 注册日期2002-11-19
  • 最后登录2018-09-25
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望521点
  • 贡献值0点
  • 好评度419点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-09-16 14:01
刚才试了,静态变量好像也是分离的,每个进程都是自己的,但测试是在2k平台做的。
根据地的兄弟们,团结就是力量
wxl_50685330
论坛版主
论坛版主
  • 注册日期2002-11-19
  • 最后登录2018-09-25
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望521点
  • 贡献值0点
  • 好评度419点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2004-09-16 14:10
对了,degyhy123兄弟,你的设备如果是同一个进程(device.exe)启动的,那么它们在同一个进程地址空间,那么可以共享,但如果还有display和touch或键盘等的驱动,是由gwes.exe起来的话就不行了。
根据地的兄弟们,团结就是力量
leo_cyl
驱动牛犊
驱动牛犊
  • 注册日期2001-08-20
  • 最后登录2009-11-02
  • 粉丝0
  • 关注0
  • 积分22分
  • 威望13点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2004-09-16 14:11
好久没用过了。如果有说错的地方别见怪。
在source code 里,用
#pragma data_seg("seg_name")
int i;
。。。

指定一个数据段。
然后在dll的def文件中指定该数据段为shared
具体参考help吧
wxl_50685330
论坛版主
论坛版主
  • 注册日期2002-11-19
  • 最后登录2018-09-25
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望521点
  • 贡献值0点
  • 好评度419点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2004-09-16 15:03
*.def里面写
SECTIONS
Seg_name  READ WRITE SHARED

*.c里面写
#pragma data_seg("seg_name")

对不起大家,我认罪:)))
根据地的兄弟们,团结就是力量
wxl_50685330
论坛版主
论坛版主
  • 注册日期2002-11-19
  • 最后登录2018-09-25
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望521点
  • 贡献值0点
  • 好评度419点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2004-09-16 15:05
#pragma data_seg("seg_name")
   variables Lists
#pragma data_seg()
根据地的兄弟们,团结就是力量
degyhy123
驱动小牛
驱动小牛
  • 注册日期2002-11-12
  • 最后登录2014-02-09
  • 粉丝0
  • 关注0
  • 积分15分
  • 威望71点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2004-09-17 07:50
各位老大,我的dll是由一个device。exe加载的话,是不是不用加share的那个东西呢
wwei_wang
驱动大牛
驱动大牛
  • 注册日期2002-06-07
  • 最后登录2006-06-23
  • 粉丝0
  • 关注0
  • 积分77分
  • 威望9点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2004-09-17 09:21
严重关注中 :P
Come on, let us drive the world.
leo_cyl
驱动牛犊
驱动牛犊
  • 注册日期2001-08-20
  • 最后登录2009-11-02
  • 粉丝0
  • 关注0
  • 积分22分
  • 威望13点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2004-09-17 09:44
除非有特别需要,一般来说,一个架构设计良好的驱动程序很少在多个dll中共享数据段。可以用其他比较安全的方法实现,如进程/线程间通讯。
degyhy123
驱动小牛
驱动小牛
  • 注册日期2002-11-12
  • 最后登录2014-02-09
  • 粉丝0
  • 关注0
  • 积分15分
  • 威望71点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2004-09-17 10:01
是这样的,我的设备是一个pci桥片带多个can和串口的控制器,所以只有这样写了
wxl_50685330
论坛版主
论坛版主
  • 注册日期2002-11-19
  • 最后登录2018-09-25
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望521点
  • 贡献值0点
  • 好评度419点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2004-09-17 12:59
由于你的设备不是被不同的进程启动的,这些数据只有一个,不会出问题。但是你可以把这些设备使用的数据区分开阿。

你写一个总的驱动,对上呈现出一个设备,并把桥挂接的各个设备使用的数据区分离开,上层使用这个设备的时候给出标示,驱动内部区分是操作哪个设备,就类似于一个pci设备的多个功能。
根据地的兄弟们,团结就是力量
degyhy123
驱动小牛
驱动小牛
  • 注册日期2002-11-12
  • 最后登录2014-02-09
  • 粉丝0
  • 关注0
  • 积分15分
  • 威望71点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2004-09-17 16:35
老大可以说的清楚一些吗,我还不是很明白??
wxl_50685330
论坛版主
论坛版主
  • 注册日期2002-11-19
  • 最后登录2018-09-25
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望521点
  • 贡献值0点
  • 好评度419点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2004-09-17 19:48
在驱动初始化的时候,开辟一块缓冲区,并分配给每个设备一块(你可以把设备收到的数据放这里面,上层就直接对这些缓冲区操作),上层在对设备进行操作时,通过给出不同的ioctl来告诉下面操作的是哪个设备(也就是操作哪个缓冲区),驱动中就根据事先定义好的ioctl来动作,当然,你也可以定义一个Ioctl,传下来的消息里面再给出标示,让驱动区分是操作哪个设备。ISR里面根据不同的设备把数据放到相应的缓冲区里面。

大概就这样,兄弟再结合具体情况看看吧
根据地的兄弟们,团结就是力量
游客

返回顶部