中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
作者:
标题: DJGPP访问4GB内存问题? 上一主题 | 下一主题
miawen
初级用户





积分 20
发帖 6
注册 2006-9-29
状态 离线
『楼 主』:  DJGPP访问4GB内存问题?

我现在要写一个程序,可以读写4GB的内存空间,用的是DJGPP的编译器!有高手能指教以下吗?

2006-10-4 09:35
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
miawen
初级用户





积分 20
发帖 6
注册 2006-9-29
状态 离线
『第 2 楼』:  

经过一天的研究,找到了解决方法,现在贴出来,其实该程序就是根据http://www.delorie.com/djgpp/dl/apps/ 里的Peritool的exsample.c改的。


#include <stdio.h>
#include <stdlib.h>
#include <dos.h>
#include <pc.h>
#include <dpmi.h>
#include <sys\farptr.h>
#include <go32.h>

#define u_int unsigned int
#define u_long unsigned long

u_int map(u_int addr, u_int size);

char mem_read(u_long pci_addr)
{
                u_int slctr;
                char pci_data;
                slctr=map(pci_addr,0xff);
                if (slctr == -1)
                                printf ("error selecting memory\n");
                else
              { pci_data=(u_int)_farpeekb(slctr,0);}
      
    return pci_data;
}   

char mem_write(u_long pci_addr,char pci_data)
{
                u_int slctr;
                slctr=map(pci_addr,0xff);
                if (slctr == -1)
                                printf ("error selecting memory\n");
                else
              _farpokeb(slctr,0,pci_data);
      
    return 0;
}  

u_int map(u_int addr, u_int size)
{
__dpmi_meminfo mi;
int selector;

/* addr &= (size - 1); */
mi.handle = 0;
mi.address = addr;
mi.size = size;
if (__dpmi_physical_address_mapping(&mi))
        {
        printf ("__dpmi_physical_address_mapping failed\n");
        return -1;
        }
selector = __dpmi_allocate_ldt_descriptors(1);
if (selector == -1)
        {
        printf ("__dpmi_allocate_ldt_descriptors failed\n");
        return -1;
        }
if(__dpmi_set_segment_base_address(selector,mi.address))
        {
        printf ("__dpmi_set_segment_base_address failed\n");
        return -1;
        }
if(__dpmi_set_segment_limit(selector,mi.size-1))
        {
        printf ("__dpmi_set_segment_limit failed\n");
        return -1;
        }
return selector;
}


int main()
{
                        u_long address;               
printf("please input the address:");
scanf("%x",&address);
printf("data before write=%x\n",mem_read(address));
mem_write(address,0x66);
printf("data after write=%x\n",mem_read(address));
}

2006-10-5 10:20
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: