中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
作者:
标题: [求助]关于djgpp的保护模式? 上一主题 | 下一主题
forzhanghua
初级用户




积分 169
发帖 21
注册 2003-9-7
状态 离线
『楼 主』:  [求助]关于djgpp的保护模式?

我是一个djgpp的初级学习者,所有的介绍都突出它一次可以访问4G的空间,我觉得它的语法和c差不多,可是我以前在c下编程时分配内存是通过数组或是指针的,那么在djgpp里,应该怎么样来访问这么大的地址空间呢?
  我看出错后,dj报告有段地址和偏移量,这些东西是怎么设置的呢?
  请高手指点!谢谢[em26]

2003-9-26 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
ATLaS
初级用户




积分 169
发帖 29
注册 2003-7-9
状态 离线
『第 2 楼』:  

应该用sys/farptr.h中的_far*系列函数来访问内存。以下函数原型来自djgpp v2.0x的libc帮助文档。

#include

unsigned char _farpeekb(unsigned short selector, unsigned long offset);
unsigned short _farpeekw(unsigned short selector, unsigned long offset);
unsigned long _farpeekl(unsigned short selector, unsigned long offset);

void _farpokeb(unsigned short sel, unsigned long off, unsigned char val);
void _farpokew(unsigned short sel, unsigned long off, unsigned short val);
void _farpokel(unsigned short sel, unsigned long off, unsigned long val);

void _farsetsel(unsigned short selector);
unsigned short _fargetsel(void);

void _farnspokeb(unsigned long offset, unsigned char value);
void _farnspokew(unsigned long offset, unsigned short value);
void _farnspokel(unsigned long offset, unsigned long value);

unsigned char _farnspeekb(unsigned long offset);
unsigned short _farnspeekw(unsigned long offset);
unsigned long _farnspeekl(unsigned long offset);

假定你要访问的内存地址为:
unsigned long ulAddr = 0x0000a000;
用_farpokeb(_dos_ds, ulAddr, byte)来写一个byte,用_farpeekb()来读一个byte。_dos_ds是系统预定义值,直接用就行了。
如果要连续访问内存地址区间, 则可以:
unsigned int i, wLen = 0x1000;
_farsetsel(_dos_ds);
for (i = 0; i < wLen; i++) {
    printf("0x%02hX\t", _farnpeekb(ulAddr + i);
}

ps: 建议认真阅读djgpp faq,如果这样的问题你问在djpp的邮件列表里,他们只会回答你faq 10.2或者18.x。


[此贴子已经被作者于2003-9-26 22:20:30编辑过]




2003-9-26 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
lemonhall
高级用户

OS/2女孩


积分 639
发帖 183
注册 2003-6-14
状态 离线
『第 3 楼』:  

恩,你原来在C里的做法是怎么样的呢??

使用MALLOC和FREE函数来分配内存的吧?相信你是这样做的。

那么现在继续使用它们吧,它们将还是你的老朋友。

指针么,DJGPP没有抛弃C语言的指针概念哦。

但是要注意,这里是C语言的指针概念,而不是TC等实现的概念。
(当然,所有语言总是或多或少地依赖与实现的)

所以说,你还是可以使用“C语言的指针”

===================================================
那么什么是保护模式呢?

它其实是一种编程的进化,是又一次抽象(ABSTRACT)。

它将80386以上机器的内存调用机制做了一次抽象,让无数程序员从繁重的内存访问机制
(底层的枷锁中)解放了出来。

从而,恭喜你。你可以用抽象过的方法访问4G内存了,而不是使用繁复的内存分页访问技术
(事实上是不行的,因为在DOS7。1下也不过能使用2G,WINXP系列中4G可访问,
但是有一半是留给系统的)

====================================================

那么,你怎么访问这些内存呢。很简单:

使用MALLOC函数,分配一个2G的内存块给一个指针吧。
(当然,你的机器不会有那么大的内存的,所以,请先试试20M这类在以前看来不可想象
的大数字)

请注意:这里的指针和你以前使用的指针,有一个区别了。

那就是,没有远近之分。(FAR MALLOC和FAR FREE这类的东西再也不需要了)
这样,你的这个指针就可以直接映射到你的内存上去,而不需要在乎什么640K,1M
这类的枷锁了。

还等什么,去尝试一下吧!
[但是,请注意,DPMI规范不只实现了这个内容,还有重要的虚拟内存,也就是说,
你可以通过MALLOC访问虚拟内存(硬盘??呵呵),具体在这里就不说了。
还有一点需要注意,事实上CWSDPMI R5版本实现的内存访问大小还没有达到2G,
也就是说,你应该可以访问到256M但是,实际上你并不能访问到那么多,可能会小
一些吧。]
===============================================

另外,还有一个技术细节,就是:

通过MALLOC函数分配完成后,请不要试图使用 MEM等类似的函数去查看内存的剩余量
,尽管你分配了20M或更多,但是实际上它们并没有被初始化(其实不是这样的,只是
我这样讲,大家都好理解),只有当你真正写入20M内容后,它们才真正地被分配使用了。

通俗地讲,使用MALLOC调用大内存后,再使用MEM这类函数查看内存分配情况将不会看到
任何变化。这和以前使用TC时可是大不一样了(真不知道他们是怎么想的,晕)

[本文将作为DJGPP的指南推出]
完成于2003/09/26




REM              喜欢DOS,因为它的简单
REM            喜欢OS/2,因为它不再矫饰
REM            喜欢BASIC,因为它并不幼稚
REM             喜欢GNU,因为它杂乱无章
2003-9-28 00:00
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (313813)  编辑帖子  回复  引用回复
lemonhall
高级用户

OS/2女孩


积分 639
发帖 183
注册 2003-6-14
状态 离线
『第 4 楼』:  

ATLaS
看得出来,你对DJGPP等编程是有功底的,有没有兴趣加入我的小组。

参与DJGPP的中文化工作,我们现在正在编写中文化的DJGPP FAQ和
DJGPP的用户指南(一个是翻译,一个是完全重写)

有兴趣的话,回个帖子哦。




REM              喜欢DOS,因为它的简单
REM            喜欢OS/2,因为它不再矫饰
REM            喜欢BASIC,因为它并不幼稚
REM             喜欢GNU,因为它杂乱无章
2003-9-28 00:00
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (313813)  编辑帖子  回复  引用回复
ATLaS
初级用户




积分 169
发帖 29
注册 2003-7-9
状态 离线
『第 5 楼』:  

to lemonhall:
呵呵,可以啊!前段时间的确研究了一下djgpp,本来有个project打算在djgpp下做,但因为多线程的问题,加上进度要求,还是改回watcom c了。不过对djgpp的兴趣一直比较大。
有什么具体的工作我可以帮忙的吗(因为工作的缘故,可能进度会慢些,呵呵)?


2003-9-29 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
lemonhall
高级用户

OS/2女孩


积分 639
发帖 183
注册 2003-6-14
状态 离线
『第 6 楼』:  

具体工作就是写一个DJGPP的使用指南,你对内存和保护模式比较熟悉,所以你能负责那部分的编写么?
写个初稿看看吧.发到我信箱里
lemonhall@vip.sina.com

我做的网站,换地址啦:  http://lemonhall.533.net/ 去看看,最近没什么更新.



REM              喜欢DOS,因为它的简单
REM            喜欢OS/2,因为它不再矫饰
REM            喜欢BASIC,因为它并不幼稚
REM             喜欢GNU,因为它杂乱无章
2003-9-29 00:00
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (313813)  编辑帖子  回复  引用回复
ATLaS
初级用户




积分 169
发帖 29
注册 2003-7-9
状态 离线
『第 7 楼』:  

这些部分在faq中的解释还算比较清楚吧?那我试试看用一些小例子来说明djgpp下和borland c/watcom c下的不同?可以包括外部中断部分,如何?不过拜托不要催我进度,工作上的活儿也很多。

我的email是atlas_wang@hotmail.com。

2003-9-29 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
lemonhall
高级用户

OS/2女孩


积分 639
发帖 183
注册 2003-6-14
状态 离线
『第 8 楼』:  

对,就是用小文章来说明。 需要和FAQ里有所不同,谢谢啦



REM              喜欢DOS,因为它的简单
REM            喜欢OS/2,因为它不再矫饰
REM            喜欢BASIC,因为它并不幼稚
REM             喜欢GNU,因为它杂乱无章
2003-9-30 00:00
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (313813)  编辑帖子  回复  引用回复

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


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



论坛跳转: