假设电脑内存为8g,
系统本身运行占多少?
系统如何为每个进程分配内存?
进程占用的内存地址是连续的?还是分段的?还是随机的?
如何得知指定进程占用的所有内存地址,或地址段?有什么思路或工具?
看你什么操作系统,如果是windows(32bit),那么采用的是页式内存,物理内存被分为4kb的页面,在一个页面内是连续的,页面和页面不连续。
请注意内存和内存地址是不同的概念。显存、dma控制器、bios、pci控制器等都会使用内存地址,而不仅仅是内存。
操作系统内核使用2GB以上高地址,进程使用0~2GB的低地址。
内存的分配兼顾连续性和使用效率。这个很好理解,如果追求连续性,那么如果要分配一个比较大的空间,那么那些碎片内存就不能用。浪费了很多空间。如果追求使用效率,那么将内存分配在碎片里,那么读写不连续的内存,性能会差一些。
系统本身运行占多少,这个要看“系统”的定义是什么,从操作系统的角度看,只有内核才是“系统”,那些shell(windows上叫做explorer.exe)和用户进程,本质上和应用软件是一样的,只是它们是微软开发的预装的软件而已。
而事实上,内核也是分层的,那些外围设备的驱动程序,也是内核态运行的,但是它们显然也不算操作系统最核心的东西。
真正的内核可以很小,windows系统来说,10MB差不多了。内核态的程序,有上百MB或者更多,操作系统内置的各种进程,那么就有几百MB,所以整个系统占用1GB左右的空间。
如果你希望调试内核,那么需要使用专门的带有调试符号的windows系统,以及远程调试工具。