najjalover
驱动牛犊
驱动牛犊
  • 注册日期2003-03-25
  • 最后登录2003-05-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2744回复:21

请问:如何在VC++6.0中锁定内存和给寄存器赋值

楼主#
更多 发布于:2003-04-17 21:02
我在编写PCI的驱动时用到了内存映射和内存锁定,我想请问如何能锁定内存使在系统自己换页时不要修改我的驱动占用的内存呢?有函数可以直接实现吗?另外,有给PCI卡的寄存器赋值的函数吗?
X_ray
驱动中牛
驱动中牛
  • 注册日期2003-02-03
  • 最后登录2004-07-24
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-04-18 03:18
如果你是用wdm方法,那么你说的那些工作都由系统完成。你不需要也不可以做这些工作。
najjalover
驱动牛犊
驱动牛犊
  • 注册日期2003-03-25
  • 最后登录2003-05-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-04-18 08:26
我做的是VxD的驱动
X_ray
驱动中牛
驱动中牛
  • 注册日期2003-02-03
  • 最后登录2004-07-24
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-04-18 12:50
我在编写PCI的驱动时用到了内存映射和内存锁定,我想请问如何能锁定内存使在系统自己换页时不要修改我的驱动占用的内存呢?有函数可以直接实现吗?
你向系统申请的内存系统不会再用它,除非你释放了。

另外,有给PCI卡的寄存器赋值的函数吗?
可以调用PCI-BIOS。通常只读不写,除非你的卡不是PnP的。
najjalover
驱动牛犊
驱动牛犊
  • 注册日期2003-03-25
  • 最后登录2003-05-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-04-19 08:07
谢谢您的帮助,系统在页面换入换出时候会对内存改动啊,否则WINDOWS就不能多线程工作了吧?
如果不能给寄存器赋值,那么怎么给PCI卡初始话呢?
X_ray
驱动中牛
驱动中牛
  • 注册日期2003-02-03
  • 最后登录2004-07-24
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-04-19 12:08
谢谢您的帮助,系统在页面换入换出时候会对内存改动啊,否则WINDOWS就不能多线程工作了吧?
如果不能给寄存器赋值,那么怎么给PCI卡初始话呢?


第1个问题OS考虑的问题,你只要用就可以了。
第2个问题是PnP管理器的问题,你也只管用。只有在非PnP卡时你才可以对寄存器赋值,否则你写了也会被PnP管理器改写。
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
6楼#
发布于:2003-04-19 14:28
我在编写PCI的驱动时用到了内存映射和内存锁定,我想请问如何能锁定内存使在系统自己换页时不要修改我的驱动占用的内存呢?有函数可以直接实现吗?另外,有给PCI卡的寄存器赋值的函数吗?

1、有个函数,LinePageLock,这样就一直在RAM了。
2、知道PCI卡的I/O base address,在98下可以直接write、read呀
najjalover
驱动牛犊
驱动牛犊
  • 注册日期2003-03-25
  • 最后登录2003-05-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2003-04-20 13:14
谢谢,我的问题基本解决了,非常感谢
najjalover
驱动牛犊
驱动牛犊
  • 注册日期2003-03-25
  • 最后登录2003-05-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2003-04-20 14:54
再请问下,LinePageLock是C++的函数吗?我的帮助文档里面怎么找不到呢?
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
9楼#
发布于:2003-04-21 17:04
再请问下,LinePageLock是C++的函数吗?我的帮助文档里面怎么找不到呢?

当然不是C++的函数。看看VToolsD的帮助吧。
najjalover
驱动牛犊
驱动牛犊
  • 注册日期2003-03-25
  • 最后登录2003-05-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2003-04-21 19:35
我看了VTOOLSD的帮助,可是还是没有呀。搜索不到
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
11楼#
发布于:2003-04-21 20:18
sorry,写错了,是linpagelock,不是line...
najjalover
驱动牛犊
驱动牛犊
  • 注册日期2003-03-25
  • 最后登录2003-05-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2003-04-22 08:10
找到了,呵呵,谢谢,不过似乎是一个structure不是函数,可以实现的吗?
najjalover
驱动牛犊
驱动牛犊
  • 注册日期2003-03-25
  • 最后登录2003-05-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2003-04-22 08:14
哦,是我看错了,呵呵。现在明白了,非常感谢
najjalover
驱动牛犊
驱动牛犊
  • 注册日期2003-03-25
  • 最后登录2003-05-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2003-04-22 08:26
还有个小问题,它在定义锁定的页面的数目时用的是DWORD定义的(比如说是DWORD nPAGE),我可以这样给它赋值吗?(nPAGE=100)
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
15楼#
发布于:2003-04-22 12:14
我都是有个函数封装一下。
lpMem为要lock的变量的地址。
DWORD MyPageLock(DWORD lpMem, DWORD cbSize)
{
    DWORD LinPageNum = 0,
          LinOffset  = 0,
          nPages     = 0;

    LinOffset  = (DWORD)lpMem & 0xfff;// page offset of memory to be mapped
    LinPageNum = (DWORD)lpMem >> 12;  // generate page number

    // Calculate # of pages to map globally
    nPages = (((DWORD)lpMem + cbSize) >> 12) - LinPageNum + 1;

    //check if the pages are valid
    if(PageCheckLinRange(LinPageNum,nPages,0) < nPages)
    {
       return 0;
    }
    //
    // Return global mapping of passed in pointer, as this new pointer
    // is how the memory must be accessed out of context.
    //
    return (LinPageLock(LinPageNum, nPages, PAGEMAPGLOBAL) + LinOffset);
}

再写个相应的UnLock函数。
najjalover
驱动牛犊
驱动牛犊
  • 注册日期2003-03-25
  • 最后登录2003-05-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2003-04-22 12:20
非常感谢,这次完全明白了。THANK YOU!
najjalover
驱动牛犊
驱动牛犊
  • 注册日期2003-03-25
  • 最后登录2003-05-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2003-04-22 19:51
知道PCI卡的I/O base address,在98下可以直接write、read呀

一个傻傻的问题:怎么在VC++里面实现呀?
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
18楼#
发布于:2003-04-22 20:35
ft
inp()啊什么的函数,直接读写IO地址
najjalover
驱动牛犊
驱动牛犊
  • 注册日期2003-03-25
  • 最后登录2003-05-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2003-04-23 09:59
有实现相同功能但是是读写内存地址的函数吗?
上一页
游客

返回顶部