IO范围和物理内存地址是如何对应的?

mati1111   2010-6-4 09:20 楼主
一块ISA的卡,IO范围是 0x2C0 -- 0x2C7
插在PC104的ISA槽里
系统是WinCE5.0
现在想在应用层用读写物理内存的方式操作IO
用VirtualAlloc和VirtualCopy这两个API把物理内存映射到虚拟内存
那这个IO范围对应的物理内存地址是多少?是怎么计算的?
敬请指点

回复评论 (17)

去MSDN上查这两个函数。
点赞  2010-6-4 09:26
这两个函数的帮助看了很多遍了
不是函数不会用,是不知道应该映射到什么物理地址
主板是Arm的,寄存器应该采用的是内存映射方式
那到底映射到哪块内存了?怎么算的?
点赞  2010-6-4 09:39
看内存映射表,算一下就知道了,名字记不太清了,map什么的文件。
点赞  2010-6-4 09:55
能说的详细点么,哪个文件,大概怎么算?
这块我比较陌生,拜托了
点赞  2010-6-4 10:01
类似oemaddrtab_cfg.inc这样的头文件,里面好似类似于
ALIGN
g_oalAddressTable

        DCD     0x80000000, 0xA0000000, 64      ; MAINSTONEII: SDRAM (64MB).
        DCD     0x84000000, 0x5C000000,  1      ; BULVERDE: Internal SRAM (64KB bank 0).
        DCD     0x84100000, 0x58000000,  1      ; BULVERDE: Internal memory PM registers.
        DCD     0x84200000, 0x4C000000,  1      ; BULVERDE: USB host controller.
        DCD     0x84300000, 0x48000000,  1      ; BULVERDE: Memory controller.
        DCD     0x84400000, 0x44000000,  1      ; BULVERDE: LCD controller.
        DCD     0x84500000, 0x40000000, 32      ; BULVERDE: Memory-mapped registers (peripherals).
        DCD     0x86500000, 0x3C000000, 64      ; BULVERDE: PCMCIA S1 common memory space.
        DCD     0x8A500000, 0x38000000, 64      ; BULVERDE: PCMCIA S1 attribute memory space.
        DCD     0x8E500000, 0x30000000, 32      ; BULVERDE: PCMCIA S1 I/O space.
        DCD     0x90500000, 0x2C000000, 64      ; BULVERDE: PCMCIA S0 common memory space.
        DCD     0x94500000, 0x28000000, 64      ; BULVERDE: PCMCIA S0 attribute memory space.
        DCD     0x98500000, 0x20000000, 32      ; BULVERDE: PCMCIA S0 I/O space.
        DCD     0x9A500000, 0xE0000000,  1      ; MAINSTONEII: Zero-bank (in reserved slot - no physical memory required).
        DCD     0x9A600000, 0x14000000,  1      ; MAINSTONEII: nCS5: eXpansion board header.
        DCD     0x9A700000, 0x10000000,  1      ; MAINSTONEII: nCS4: SMSC 91C111 Ethernet controller.
        DCD     0x9A800000, 0x0A000000,  1      ; MAINSTONEII: nCS2 (upper half): 2MB SRAM.
的定义。
我这个是粘的mianstone的,2c0对应的905
点赞  2010-6-4 10:23
呃,发现我在这块真的知识贫乏 :(
基本上看不懂,只好再问

类似这样的文件在哪里找?CE的哪个系统目录里?还是硬件的SDK里?
文件格式的每一块是什么意思?
DCD 0x90500000, 0x2C000000, 64 ; BULVERDE: PCMCIA S0 common memory space.
0x90500000这个是内存地址?
0x2C000000这个是什么?
64 这个是什么?
我要找的物理内存地址对应哪个值?
每次启动后映射到的地址不会变吧?
麻烦你再辛苦解答一下,谢谢!
点赞  2010-6-4 10:41
这个就是虚拟地址和物理地址的内存映射表,静态映射是不会变的,一般在BSP的inc文件夹下,实在不行,你在PB里面搜索一下关键字也能找到。
点赞  2010-6-4 11:00
好的,硬件在家里,回去找找看,非常感谢。
再问几个细的问题

1. 主板是买周立功的,系统都是做好了的,我没用PB,也没有BSP。那CE的Platform目录里会有这些Inc文件是么?

2. 你看看文件里的格式我理解的对不对
DCD 0x90500000, 0x2C000000, 64 ; BULVERDE: PCMCIA S0 common memory space.
0x90500000这个是物理内存地址?
0x2C000000这个是IO基地址?
64 这个是长度?
我要找的物理内存地址就是0x90500000?

3. 插在ISA上的板子是我老师自己做的,没有驱动,在Inc文件里应该不会出现吧?那应该找哪一项?
点赞  2010-6-4 11:19
引用: 引用 8 楼 dahua 的回复:
好的,硬件在家里,回去找找看,非常感谢。
再问几个细的问题

1. 主板是买周立功的,系统都是做好了的,我没用PB,也没有BSP。那CE的Platform目录里会有这些Inc文件是么?

2. 你看看文件里的格式我理解的对不对
DCD 0x90500000, 0x2C000000, 64 ; BULVERDE: PCMCIA S0 common memory space.
0x905……


0x90500000是虚拟地址起始地址(物理起始地址映射后的虚拟地址);
0x2C000000物理地址的起始地址;
64就是物理地址0x2C000000开始的64M内存大小
点赞  2010-6-4 11:28
BOOL VirtualCopy(
  LPVOID lpvDest,
  LPVOID lpvSrc,
  DWORD cbSize,
  DWORD fdwProtect
);
那我用VirtualCopy操作物理内存的话,第2个参数lpvSrc应该填哪个值?
点赞  2010-6-4 12:11
引用: 引用 10 楼 dahua 的回复:
BOOL VirtualCopy(
  LPVOID lpvDest,
  LPVOID lpvSrc,
  DWORD cbSize,
  DWORD fdwProtect
);
那我用VirtualCopy操作物理内存的话,第2个参数lpvSrc应该填哪个值?

(0x2C000000>>8),fdwProtect加上PAGE_PHYSICAL。
点赞  2010-6-4 12:54
大侠们这样指点了我一圈还是有点不清楚,再仔细描述下我的问题

主板是周立功的epc8000,ARM体系,有一个ISA槽,系统是WinCE5.0
我老师做了一个板子,插在ISA口,板子的IO范围是 0x2C0 -- 0x2C7
我现在想在用户层读写这个板子的IO,目前的想法是用VirtualCopy函数映射到某个物理内存地址进行操作
现在想知道物理内存地址应该是多少?如何找出来?

seu_dust大侠告诉我找inc文件,可是找哪个inc文件?
inc文件是跟着板子走的吗?我老师自己做的板子没有这个啊
还有如果找到这个映射表了,我是不是可以直接操作那个虚拟内存地址了?还用自己VirtualCopy吗?
点赞  2010-6-4 13:20
学习中。。。。
点赞  2010-6-4 13:25
上面几位大侠,帮人帮到底,再来指点一番吧
点赞  2010-6-4 17:31
找到那个映射表,就可以直接在应用中操作了,
是在找不到,也可以先VirtualCopy下,再打印出来就知道地址了,以后直接定义一个指针就可以操作了!
点赞  2010-6-6 21:02
你要看你芯片的datasheet或者bsp的OEMAddressTable
, ISA口对应的起始地址是多少,你说的0x2C0 -- 0x2C7应该是offset。要加baseaddr上去得到Paddr。
这就是你的物理地址,
首先virtualalloc一块虚拟内存(7个字节)Vaddr
然后调用virtualcopy(Vaddr,Paddr,flag)
你就可以直接用Vaddr来用物理地址了
点赞  2010-6-7 20:29
应该可以直接申请的吧,
ps:epc8000有bsp包吗?周立功的板子如何啊?
点赞  2010-6-8 00:13
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复