Windows 的这个 0x400000是有历史原因的
0x400000 就是 4 MB
当Windows 还是16位的Win 3.x的时候,Windows内核占用4MB的地址,不是说4MB内存而是4MB的地址空间
当Win 9x系列出现的时候,为了兼容早期的Win 3.x,就为Win 3.x保留了 最低位的 4MB地址空间,并且在Win 9x里 这 4MB里面还加载了一套 Win3.x的部分内核,比如 kernel.dll user.dll gdi.dll等
到了WinNT内核,为了兼容 Win9x,还是保留了这 4MB地址
所以windows上 任何exe的默认其实地址都是 从 0x400000开始,
这都是微软为了兼容付出的代价
现在模块的基址不再重要了,反正都支持动态地址空间配置,运行时操作系统会重新分配基址。
转载请注明:落伍老站长 » 书上说代码地址总是从0x400000开始,但是查看编译好的elf头起始地址是从0开始的,这是为什么?