不知道大家在运行自己写的程序时,有没有发现一个问题:就是物理机器明明只有8G内存,但是我们运行的程序却可以申请到16G的内存?或者说机器上运行的多个进程,占用的总内存已经远超物理内存了,却还能正常工作。其实,这都要归功于CPU和操作系统设计的虚拟内存的机制。
物理地址通常应用在“简单”的嵌入式微控制器中,内存管理较简单,但现代计算机,包括其他智能设备如笔记本电脑、智能手机等,需要较复杂的内存管理机制,因此虚拟地址必不可少,它是计算机科学中最伟大的ideas之一。
当执行应用程序时,在Linux下输入可执行文件的相对路径或绝对路径就可以运行该程序,譬如./app或/home/dt/app,还可根据应用程序是否接受传参在执行命令时在后面添加传入的参数信息,譬如./app arg1 arg2或/home/dt/app arg1 arg2。
接下来就是完成 flash 和 ddr 初始化,为后面从 flash 加载 bin 文件,在 DDR 中运行程序提供基本环境,一般情况下都是从flash为0的位置,将flash中的bootloader 镜像文件加载到 RAM 或 DDR 中,该引导程序最终将uboot从flash 复制到 DDR 中,然后交接给 uboot 进行下一步处理。
“虚拟内存是现代计算机、操作系统的基石,但为什么虚拟内存在编程中,毫无存在感?为什么也有人:虚拟内存就是一个骗子?”人人都听说过虚拟内存,人人似乎都没有用过虚拟内存。为什么说虚拟内存是现代操作系统过的基石?没有虚拟内存的世界,会是什么样子?为什么苹果最近才打开SWAP功能?
在20世纪60年代及70年代早期,计算机内存十分昂贵,而随着计算机的发展,计算机应用程序越来越大,系统内存无法满足应用程序的需求,虚拟内存技术应运而生,它可使内存耗量大的软件运行在实际内存容量小的计算机上,在此基础上,后续又引入一些安全及可靠性相关的特性,使得虚拟内存技术更加得到
通过 sendfile 系统调用,数据可以直接在内核空间内部进行 I/O 传输,从而省去了数据在用户空间和内核空间之间的来回拷贝,sendfile 调用中 I/O 数据对用户空间是完全不可见的,整个拷贝过程会发生 2 次上下文切换,1 次 CPU 拷贝和 2 次 DMA 拷贝。