2013-2-2 - simple-loader

本文详细阐述了如何利用NASM编译器将主引导扇区改造为一个加载器,从硬盘加载用户程序到内存,并分配CPU处理权。通过解析磁盘中的用户程序布局,实现从磁盘地址到内存地址的有效映射,最终成功将用户程序加载并运行。

目标:把主引导扇区改造成一个loader,从硬盘中将用户程序加载到内存中,之后将cpu处理权分配给用户程序。


1.NASM编译器使用汇编指令定义段:

SECTION 段名称

SEGMENT 段名称


2.intel 要求段在起始物理内存中的起始地址16字节对齐: align=16


3.db: 1个字节  dw: 2个字节 dw:4个字节


4.磁盘中的用户应用程序的格式:

 —程序总长度

      |

     入口点

      |

      段重定位表项数

      |

     段重定位表

--用户程序


5.loader的问题提出,为了实现loader的工作,需要解决如下三个问题:

1)如何找到磁盘中的用户程序位置?在哪里

2)找到磁盘中的具体位置后,加载到内存的什么位置?

3)具体如何加载?


6、通过编译器编译出来的执行文件中的汇编地址只是一个相对地址,只是段内的一个偏移地址。而程序中用户自定义的各个段地址也仅仅是段定义中下面那个代码的偏移地址。


具体工作流程(思路):

1)初始化:将引导扇区的段地址从偏移0x7c0开始。同时设定磁盘中的程序实际需要载入到的物理地址 。同时将该地址<<16,得到段地址,赋给ds,es

2)首次尝试通过给定的第一个扇区号去读取对应的磁盘程序(一个扇区 = 512bytes),因为根据用户程序的约定,第一个扇区中的程序必然包含了整个用户程序的描述信息(具体见上),通过读取第一个扇区,得到整个程序的长度。将磁盘上的数据加载到内存[DS:0x0000]处。

3)至于读取磁盘的扇区,具体的做法如下:

  3.1设置要读取的扇区数量,写入到0x1f2端口,设置al为要写入扇区的数量

  3.2设置起始LBA地址扇区号,由于28位扇区号太长放不下16位寄存器,所以分成4段,分别写入端口:0x1f3,0x1f4,0x1f5,0x1f6,注意0x1f6需要额外的设置其他标志位。

  3.3向端口0x1f7写入0x20的读取磁盘命令。

  3.4等待读写操作完成,0x1f7既是命令端口,也是状态端口。等待标志位被置位。

  3.5连续读取出磁盘中保存的数据,使用0x1f0端口,是一个16位端口。读取出的数据存放到DS制定的数据段,便宜地址由寄存器BX指定。

4)现在程序的前512字节已经读取了地址:[ds:0x0000]处,可以通过偏移读取到用户程序的长度,进而判断是否需要继续读取下面的扇区。如果占用多个扇区,那么走入一个循环,步长位512字节,重设ds段地址,调用读取磁盘接口,使所有的用户代码全部读取到制定内存上。

5)修改实际装载后的入口代码段基址,以及各个段的实际载入基址

考虑可再生能源出力不确定性的商业园区用户需求响应策略(Matlab代码实现)内容概要:本文围绕“考虑可再生能源出力不确定性的商业园区用户需求响应策略”展开,结合Matlab代码实现,研究在可再生能源(如风电、光伏)出力具有不确定性的背景下,商业园区如何制定有效的需求响应策略以优化能源调度和提升系统经济性。文中可能涉及不确定性建模(如场景生成与缩减)、优化模型构建(如随机规划、鲁棒优化)以及需求响应机制设计(如价格型、激励型),并通过Matlab仿真验证所提策略的有效性。此外,文档还列举了大量相关的电力系统、综合能源系统优化调度案例与代码资源,涵盖微电网调度、储能配置、负荷预测等多个方向,形成一个完整的科研支持体系。; 适合人群:具备一定电力系统、优化理论和Matlab编程基础的研究生、科研人员及从事能源系统规划与运行的工程技术人员。; 使用场景及目标:①学习如何建模可再生能源的不确定性并应用于需求响应优化;②掌握使用Matlab进行商业园区能源系统仿真与优化调度的方法;③复现论文结果或开展相关课题研究,提升科研效率与创新能力。; 阅读建议:建议结合文中提供的Matlab代码实例,逐步理解模型构建与求解过程,重点关注不确定性处理方法与需求响应机制的设计逻辑,同时可参考文档中列出的其他资源进行扩展学习与交叉验证。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值