注册入口和引导加载

今天对两个词有了新的理解。

在电脑运行时,一般首先运行BIOS,进行基本的硬件检测后告诉系统引导程序bootloader在哪里,然后再由bootloader来将指定位置的操作系统由硬盘加载到内存,将PC跳转到相应位置开始执行。

在游戏程序设计中,在主函数开始运行时,通常会调用一个register函数,注册可能用到的各种类,然后等到具体使用的时候再实例化。这是因为首先我们要确保后面用到的东西,在系统里有入口。这个过程其实同样是注册入口,实例化的时候就好比引导加载。

laravel框架中也是,ServiceProvider也分为两个部分,register和boot,register 负责进行向容器注册“脚本”,但要注意注册部分不要有对未知事物的依赖,如果有,就要移步至 boot 部分。

其实这样分开的一个重要目的就是:注册入口阶段保证后面引导加载(即初始化阶段)所加载及依赖的东西,程序能找到它的调用地址,即确保CPU可以找到它应该跳转的PC值。因为作为底层框架或服务提供者,你不知道后面会具体碰到什么业务逻辑,会用到哪些实例,到那个时候发现依赖的东西没有,那系统就只能崩溃了。

所以首先,明确所有在冯诺依曼计算机上跑得东西都要包括注册入口和引导记载,这个原因是,冯诺依曼体系结构将程序当做数据处理(像数据一样存储程序),所以你首先要让计算机知道某个程序段对应的数据存放在哪个地方——这就是“注册入口”。找到入口以后,就需要把程序从内存读到CPU的寄存器中,或者把程序从硬盘拷到内存里,或者在运行时从堆中new出一块空间,又或者在函数调用中在栈上开辟一个空间——这些都算“引导加载”吧

当然注册和引导的方式方法有很多种,所以才会有各种硬件架构,各种设计模式,各种框架,都是为了更好更容易,让人更方便地完成这两个部分。比如DSP常采用的哈佛总线结构将指令存储和数据存储分开加速存取(程序和数据各自都有自己的数据总线和地址总线),比如设计模式中的工厂模式,facade模式等。比如laravel框架的核心服务提供(参考https://www.insp.top/article/learn-laravel-container)等等

最好,以下三者的关系要理清:
1.对于CPU的指令和数据
2.编译器编出来的包含css段,data段,可执行文件
3.程序在内存中的静态存储区,代码区,栈区,堆区

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值