Ⅰ x86的应用程序内存访问时是编译时固定一个地址还是运行时根据状况再计算(我是指物理内存地址),谢谢。
编译时给定的是相对地址,运行时根据内存的实际情况给定基址。[给定基址就是系统为正在运行的程序分配内存]
放栈上的变量啊,堆里的动态内存啊都是每次运行有可能放在不同的地方。
但是,一些运行环境数据(库函数)是会实现加载到指定内存的(这个是放在指定内存的)
——————————————————————
还有不要把虚拟内存和上面的混淆了,MMU是实现虚拟地址————>物理地址的转换
这个就算硬件不支持虚拟内存,程序数据每次运行都很可能放在不同的内存中
Ⅱ 如何查看正在运行的软件的内存地址呢
IceSword是一斩断黑手的利刃(所以取这土名,有点搞e,呵呵)。它适用于Windows 2000/XP/2003/Vista操作系统,用于查探系统中的幕后黑手(木马后门)并作出处理,当然使用它需要用户有一些操作系统的知识。
在对软件做讲解之前,首先说明第一注意事项 :
此程序运行时不要激活内核调试器(如softice),否则系统可能即刻崩溃。
另外使用前请保存好您的数据,以防万一未知的Bug带来损失。
IceSword目前只为使用32位的x86兼容CPU的系统设计,另外运行IceSword需要管理员权限。
如果您使用过老版本,请一定注意,使用新版本前要重新启动系统,不要交替使用二者。
IceSword内部功能是十分强大的。可能您也用过很多类似功能的软件,比如一些进程工具、端口工具,但是现在的系统级后门功能越来越强,一般都可轻而易举地隐藏进程、端口、注册表、文件信息,一般的工具根本无法发现这些“幕后黑手”。IceSword使用大量新颖的内核技术,使得这些后门躲无所躲。
如何退出IceSword:
直接关闭,若你要防止进程被结束时,需要以命令行形式输入:IceSword.exe /c,此时需要Ctrl+Alt+D才能关闭(使用三键前先按一下任意键)。
如果最小化到托盘时托盘图标又消失了:此时可以使用Ctrl+Alt+S将IceSword主界面唤出。因为偷懒没有重绘图标,将就用吧^_^。
您无须为此软件付费,但如果您使用时发现了什么Bug,请mail to me:[email protected] ,十分感谢。
更新说明:
1.20:(1)恢复了插件功能,并提供一个文件注册表的小插件,详见FileReg.chm;(2)对核心部分作了些许改动,界面部分仅文件菜单有一点变化。
1.20(SubVer 111E3):添加对32位版本Vista(NtBuildNumber:6000)的支持。
1.22:(1)增加普通文件、ADS、注册表、模块的搜索功能;(2)隐藏签名项;(3)添加模块的HOOK扫描;(4)核心功能的加强。
更新时间:2007-08-27
作者说明:原本打算让英文版积累点bug,过几天出中文版的。没想到近来折腾这、折腾那,出差刚回来没几天,又有一堆事往头上砸,有没搞错。中途收到一些bug反映,但是基本都不是可重现的bug或根本不是bug。确认的一个bug是ADS转储只能存到已存在的文件中,很faint。因为目前不能在这上面花间,所以除了上面那个bug其它不作什么修改了!
http://www.crsky.com/soft/6947.html
工程师戴 收集
Ⅲ 程序运行时的内存问题
以程序的具体执行过程为例来给你讲解,但愿你能理解:
1.程序被打开时,即程序开始运行时,会首先向操作系统请求独占内存空间(一段在程序整个执行过程中都不释放的空间),操作系统会应答请求并分配一段逻辑上连续(其实是将零散的内存空间映射为一段连续的空间)的内存空间给该程序,此时程序得到该段空间的逻辑地址信息,根据地址将程序代码段和数据段装入内存,此时程序载入完成。
2.程序运行中,当某一过程任务需要更大内存空间时,会再次向操作系统发出请求,操作系统会根据请求再次分配内存空间给该程序,当这一过程任务执行完毕后,该内存空间被释放。同时由于操作系统的存储保护,程序在运行过程中只能访问自己所申请的内存空间,不能访问其他程序的内存空间。
3.当程序执行完毕或关闭程序后,该程序所占的所有内存空间都被释放。
当你再次打开程序后,重复上面的过程。
下面对你的问题进行针对性回答:
1.当程序运行时,会调入内存,不同时间运行,程序放在内存的位置也可能不同:每运行一次程序,程序都会重新向操作系统申请内存空间,这时操作系统会分配一段全新的内存空间给程序,故不同时间运行程序,程序在内存中的位置是不同的。
2.使用内存中数据的位置也可能不同:当程序申请内存空间后,操作系统会将所申请的内存空间的地址传给程序,尽管数据的位置不同,但程序知道数据的地址,故程序依然可以根据地址来找到所需要的数据。
Ⅳ 程序运行时内存地址的问题
地址分配是从大到小依次分配的,而不是说随机分配的,就算是动态的,只要地址没被其他程序占用,地址就会相同了。
Ⅳ c++里面怎么样根据内存地址访问这个地址的值
int main() {
int *i = new int(5);
int *p;
printf("i = %p\n", i);
scanf("%x", &p);
printf("p=%d\n", *p);
return 1;
}
如果我写 int *p = i; 你不放心的话,就自己用scanf输入吧,这样就放心了吧
你弄两个程序分别运行这样运行肯定不行,一个是进程结束后该进程的所有内存都被系统回收了,另外一个是每个不同的进程都拥有自己独立的地址空间(虚拟地址空间),就好像(不考虑跨行取现业务的情况下)你拿着农行的卡到建行取钱建行不会给你钱,你跟建行说你卡号是什么什么建行会跟你说没有这个账号,道理是一样的
Ⅵ c语言程序运行时 内存问题
以程序的具体执行过程为例来给你讲解,但愿你能理解:
1.程序被打开时,即程序开始运行时,会首先向操作系统请求独占内存空间(一段在程序整个执行过程中都不释放的空间),操作系统会应答请求并分配一段逻辑上连续(其实是将零散的内存空间映射为一段连续的空间)的内存空间给该程序,此时程序得到该段空间的逻辑地址信息,根据地址将程序代码段和数据段装入内存,此时程序载入完成。
2.程序运行中,当某一过程任务需要更大内存空间时,会再次向操作系统发出请求,操作系统会根据请求再次分配内存空间给该程序,当这一过程任务执行完毕后,该内存空间被释放。同时由于操作系统的存储保护,程序在运行过程中只能访问自己所申请的内存空间,不能访问其他程序的内存空间。
3.当程序执行完毕或关闭程序后,该程序所占的所有内存空间都被释放。
当你再次打开程序后,重复上面的过程。
下面对你的问题进行针对性回答:
1.当程序运行时,会调入内存,不同时间运行,程序放在内存的位置也可能不同:每运行一次程序,程序都会重新向操作系统申请内存空间,这时操作系统会分配一段全新的内存空间给程序,故不同时间运行程序,程序在内存中的位置是不同的。
2.使用内存中数据的位置也可能不同:当程序申请内存空间后,操作系统会将所申请的内存空间的地址传给程序,尽管数据的位置不同,但程序知道数据的地址,故程序依然可以根据地址来找到所需要的数据。
Ⅶ C语言,这个程序在运行的过程中,为什么说内存不能读取
数组越界了
也就是说你在对数组的操作过程中,由于疏忽
导致了数组的下标超过了你定义的大小
比如你定义了int
a[5]
这个数组
可是你在写代码的时候不小心超过了这个5,比如出现了a[6]
这个时候当然不能访问这段内存
Ⅷ 程序运行时装入内存的地址是ip地址吗
程序运行时,由于内存的管理方式是以页为单位的,而且程序使用的地址都是虚拟地址,当程序要使用内存时,操作系统再把虚拟地址映射到真实的物理内存的地址上。和IP地址没关系。
Ⅸ 1、CPU能直接访问储存在内存中的数据吗 2、CPU能直接访问储存在外存中的数据吗
CPU能直接访问储存在内存中的数据,不能直接访问储存在外存中的数据。
相关介绍:
计算机的内存可以分为随机存取存储器(RAM)和只读储存器(ROM)。两者的区别在于,随机存取存储器能够与CPU直接的进行数据的交换,也可以将其称为主存。
对于RAM可以随时的进行读写,而且这个过程的速度很快,因此由于主存所具有的这个优点也往往将其作为操作系统或其他正在运行中的程序的临时数据存储媒介。
(9)程序运行时可以访问内存地址吗扩展阅读
中央处理器强大的数据处理功有效提升了计算机的工作效率,在数据加工操作时,并不仅仅只是一项简单的操作,中央处理器的操作是建立在计算机使用人员下达的指令任务基础上,在执行指令任务过程中,实现用户输入的控制指令与CPU的相对应。
随着我国信息技术的快速发展,计算机在人们生活、工作 以及企业办公自动化中得到广泛应用,其作为一种主控设备,为促进电子商务网络的发展起着促进作用,使 CPU 控制性能的升级进程得到很大提高。指令控制、实际控制、操作控制等就是计算机 CPU 技术应用作用表现。