注册入口和引导加载
2016-01-02 01:28
260 查看
今天对两个词有了新的理解。
在电脑运行时,一般首先运行BIOS,进行基本的硬件检测后告诉系统引导程序bootloader在哪里,然后再由bootloader来将指定位置的操作系统由硬盘加载到内存,将PC跳转到相应位置开始执行。
在游戏程序设计中,在主函数开始运行时,通常会调用一个register函数,注册可能用到的各种类,然后等到具体使用的时候再实例化。这是因为首先我们要确保后面用到的东西,在系统里有入口。这个过程其实同样是注册入口,实例化的时候就好比引导加载。
laravel框架中也是,ServiceProvider也分为两个部分,register和boot,register 负责进行向容器注册“脚本”,但要注意注册部分不要有对未知事物的依赖,如果有,就要移步至 boot 部分。
其实这样分开的一个重要目的就是:注册入口阶段保证后面引导加载(即初始化阶段)所加载及依赖的东西,程序能找到它的调用地址,即确保CPU可以找到它应该跳转的PC值。因为作为底层框架或服务提供者,你不知道后面会具体碰到什么业务逻辑,会用到哪些实例,到那个时候发现依赖的东西没有,那系统就只能崩溃了。
所以首先,明确所有在冯诺依曼计算机上跑得东西都要包括注册入口和引导记载,这个原因是,冯诺依曼体系结构将程序当做数据处理(像数据一样
当然注册和引导的方式方法有很多种,所以才会有各种硬件架构,各种设计模式,各种框架,都是为了更好更容易,让人更方便地完成这两个部分。比如DSP常采用的哈佛总线结构将指令存储和数据存储分开加速存取(程序和数据各自都有自己的数据总线和地址总线),比如设计模式中的工厂模式,facade模式等。比如laravel框架的核心服务提供(参考https://www.insp.top/article/learn-laravel-container)等等
最好,以下三者的关系要理清:
1.对于CPU的指令和数据
2.编译器编出来的包含css段,data段,可执行文件
3.程序在内存中的静态存储区,代码区,栈区,堆区
在电脑运行时,一般首先运行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.程序在内存中的静态存储区,代码区,栈区,堆区
相关文章推荐
- Win10管理员账户被禁用无法进入系统的解决方法
- JUnit4 中@AfterClass @BeforeClass @after @before的区别对比
- 求两个数之间的随机数,其它语言也是同理
- ARM Linux Oops使用小结
- include指令
- 大数据系列第一课:scala基础
- 使用github + Octopress 搭建免费博客 + 碰到问题的解决方法
- 2016,开始我的前端博客之旅吧!
- 第六届福建省大学生程序设计竞赛 Common Tangents
- delete释放new[]造成的泄漏
- 黑马程序员——Java---&&和||逻辑表达式
- 反射调用方法
- my-innodb-heavy-4G.cnf中文注释(主要配置文件注释)
- info.list
- perl-标量数据
- zzuoj 10413 && nyoj 1243 H.Radition Protection Wall 【几何 + 最短路】
- kali linux安装搜狗输入法
- ngx_lua配置及应用
- 杭电2054-A == B ?
- SDcard进行文件的读取