阅读:2307回复:19
怎样写内存?
有人愿意告诉我怎么在驱动程序中写D0000段的内存空间么?
我用在98下的指针方式去写,结果系统垮了。 |
|
沙发#
发布于:2002-07-10 15:41
如此简单的问题竟然没人回答?因为没有分么?困惑。
|
|
板凳#
发布于:2002-07-10 15:47
可以随便改吗?
内存好象是分段的,有的是系统控制的,有的是用户使用的。 一般用户使用要申请的,如果就直接改,系统当然要崩溃。 解决问题的方法好象有问题。 不知道对不对。 |
|
|
地板#
发布于:2002-07-10 15:48
D0000段是什么意思?
98也是Flat模式,所有的段都是0~4G,我不懂D0000段是什么意思 |
|
|
地下室#
发布于:2002-07-10 15:51
啊?自己做了一个ISA卡,占用系统0xD0000段内存(这是很早就有的概念啊),跟计算机软件通信。在98下面可以
char* p=0xd0000; p[0] = 1; 来访问,但在2000下就不能了,只好写驱动,但驱动程序中这么访问到职喜同崩溃,怎么回事? |
|
5楼#
发布于:2002-07-10 17:58
啊?自己做了一个ISA卡,占用系统0xD0000段内存(这是很早就有的概念啊),跟计算机软件通信。在98下面可以 faint。还要多看书呀。 |
|
6楼#
发布于:2002-07-10 19:18
[quote]啊?自己做了一个ISA卡,占用系统0xD0000段内存(这是很早就有的概念啊),跟计算机软件通信。在98下面可以 faint。还要多看书呀。 [/quote] |
|
7楼#
发布于:2002-07-10 19:20
[quote]啊?自己做了一个ISA卡,占用系统0xD0000段内存(这是很早就有的概念啊),跟计算机软件通信。在98下面可以 faint。还要多看书呀。 [/quote] 是啊,查了不少资料,但没有找到合适的。你有没有合适的代码呢? |
|
8楼#
发布于:2002-07-12 18:01
你说你在98下能访问D000呀,那就怪了呀,原则上是不可以的
|
|
9楼#
发布于:2002-07-13 17:53
98下面,对于isa板卡,好像是可直接访问其板上内存的!记得有文章提到过,98中isa卡的内存好像是映射到d0000的,通过设置段选因子,可以直接访问,但是在2000和nt下,是不可以直接访问的,你只需要做个简单的kmd驱动程序就可以了,不对的请各位大佬指教
|
|
|
10楼#
发布于:2002-07-14 12:12
98下面,对于isa板卡,好像是可直接访问其板上内存的!记得有文章提到过,98中isa卡的内存好像是映射到d0000的,通过设置段选因子,可以直接访问,但是在2000和nt下,是不可以直接访问的,你只需要做个简单的kmd驱动程序就可以了,不对的请各位大佬指教 谁能告诉我ISA、pci卡的内存或端口都映射到哪些内存中了?这固定吗? |
|
|
11楼#
发布于:2002-07-14 20:53
98下直接写就行了char* p=0xd0000; *p = 1;
但是NT/2000下必须用驱动,当然绕开系统进入ring0也许可以,但不是很规范。 所以希望能开发NT/2000下的驱动,但是在2000/NT下的驱动程序里面访问d0000地址还必须先映射到逻辑地址上来。本人不知道怎么映射,希望 知道的朋友能给个提示。 |
|
12楼#
发布于:2002-07-14 23:17
针对这样的问题强烈推荐driver studio或windriver非常容易
|
|
13楼#
发布于:2002-07-15 09:58
MmMapIoSpace
|
|
14楼#
发布于:2002-07-15 15:27
MmMapIoSpace 如何调用呢? PHYSICAL_ADDRESS PhyAdd; PhyAdd.LowPart = 0xd0000; PhyAdd.HighPart = 0; NTSTATUS ret; char* pAdd = (char*)MmMapIoSpace(PhyAdd,2048,MmNonCached ); DebugPrint(\"MmMapIoSpace return: %x\",pAdd); if(pAdd != NULL) { pAdd[0xd03f6] = 1; pAdd[0xd03f7] = 1; pAdd[0xd03f8] = 3; DebugPrint(\"Sucess in write\"); } else DebugPrint(\"Fail in write\"); 会Down机。 |
|
15楼#
发布于:2002-07-15 15:45
啊?自己做了一个ISA卡,占用系统0xD0000段内存(这是很早就有的概念啊),跟计算机软件通信。在98下面可以 居然可以这样访问硬件。假如与更换插槽会有变化吗?假如双卡呢(可能可以通过对ISA硬件跳线来解决)? NT下这么使用不崩溃才怪。 估计你的ISA设备是不支持PnP了吧。那就自己查找资源,建立Driver吧 |
|
16楼#
发布于:2002-07-15 18:02
简单代码如下:
如下: ULONG SpaceType = 0; //Memory space INTERFACE_TYPE InterfaceType = Isa;//isa bus ULONG BusNumber = 0; PHYSICAL_ADDRESS PhyAdd; PhyAdd.Lowpart = 0xd0000; PhyAdd.Hipart = 0; PHYSICAL_ADDRESS TranslatedAddr; ULONG NumberOfBytes = 2048; //length PVOID MappedAddr; if(HalTranslateBusAddress(InterfaceType , BusNumber, PhyAdd, &SpaceType, &TranslatedAddr)) { if(SpaceType == 0) {//mem space MappedAddr = MmMapIoSpace(TranslatedAddr, NumberOfBytes, FALSE); if(MappedAddr != NULL) { //I/O your memory like this readvalue = READ_REGISTER_UCHAR((PUCHAR)MappedAddr + 0x3f6); //Read WRITE_REGISTER_UCHAR(((PUCHAR)MappedAddr + 0x3f6), writtenvalue); //Write } }else { //Io Space } } 这个问题ddk的例子讲得太多了,你为什么不查看一下!!! |
|
17楼#
发布于:2002-07-16 11:37
to dazzy:
我要能查到还到这里来? 你贴的代码我基本上靠自己写出来了,但HalTranslateBusAddress没有办法编译通过。总是说没有定义(包含了ntddk.h也没有办法通过) 实际上,不用HalTranslateBusAddress程序也能跑。我不需要向系统申请资源,我们的卡也不需要同时跑两块,不过卡上作了跳线,需要的时候可以用(因为做卡的同志根本没打算做pnp卡),更换插槽也没问题。卡就像一块并联在先上的电话一样。 开始我贴的代码里面有个小bug才会引起崩溃,修改一下就可以了。 |
|
18楼#
发布于:2002-07-16 14:59
可以好好的用?
稀奇。 :D |
|
19楼#
发布于:2002-07-16 17:10
不用希奇,我要搞的东西本来就简单,一个小小的技术问题而已,只是自己水平不够才弄了这么久。
但确实是管用。不死机,也不会有内存泄漏(根本就没什么内存申请的地方)。 |
|