为何VirtualBox虚拟机中磁盘文件的内存地址每次运行都不同?
问题解析
你完全搞混了两个概念:你打印的不是磁盘文件的存储地址,而是进程栈上局部变量的内存地址,这和ASLR的作用直接相关,和磁盘上的文件没有任何关系。
具体拆解:
- ASLR的作用对象:ASLR是用来随机化进程虚拟内存空间的布局,包括栈、堆、动态链接库的加载地址。每次启动程序时,进程的栈基地址都会被随机调整,所以栈上的局部变量地址自然会每次都变——这就是你看到两次运行地址不一样的原因。
- 你代码里的错误认知:
&off_fd0取的是offsets函数里定义的off_fd0变量的地址,这个变量是运行时存在当前进程栈内存里的临时变量,和readme.txt在磁盘/dev/sda2上的存储位置没有关联。你用lseek获取的是文件内的逻辑偏移量(比如文件末尾相对于开头的位置),也不是磁盘存储地址。 - 代码里的小笔误:
perror("opne")拼写错误,应该是perror("open");printf里的file3是打错了,对应参数是file2的偏移量。
补充:如果想查看文件在磁盘上的实际存储位置
Linux下普通文件的磁盘块位置需要通过文件系统工具查看,比如用debugfs(需root权限),或者用ls -i查看inode号后,结合文件系统的inode映射信息查找,但这和你当前的代码逻辑完全无关。
内容的提问来源于stack exchange,提问作者Mheboobkhan
相关产品推荐
相关产品推荐

