本文将实现一个简单的程序加载器,首先要先了解一下实模式下的内存空间分配,这是固定好的


要实现一个程序加载器,需要实现下面4个步骤

1.将用户程序从硬盘中读取到10000处(当然,放到10000-9FFFF任意位置都可以)
2.设置段地址(段的重定位,注意段地址最低位必须是0)
3.找到用户的程序的入口(从哪开始执行)
4.跳转到程序入口执行

关于NASM的vstart关键字

由于本文使用NASM实现,所以有必要了解vstart关键字,如果一个段声明了vstart子句,则段内所有的汇编地址,编译之后,都等于vstart+偏移量

vstart示例1:下面代码vstart=0,jmp指令所在的汇编地址是3

Segment code1 vstart=0
mov ax,0x001 ;这条指令占3个字节
jmp bx

下图中最上面的绿色位置(vstart=0处)表示第1个开始计数的位置,这个位置=0,所以到jmp指令,正好是3

vstart示例2:下面代码vstart=2,mov指令所在的汇编地址是5

Segment code1 vstart=2
mov ax,0x001 ;这条指令占3个字节
jmp bx

下图中最上面的绿色位置(vstart=2处)表示第1个开始计数的位置,这个位置=0,所以到jmp指令,正好是5

日记:关于这个vstart,可以理解成将起始位置向上拓展延伸

关于标号

标号是相对于当前段的偏移量(字节数),而不是相对于程序的偏移量,不管NASM还是MASM,都是这样的

加载器的代码实现(未完成)

segment code vstart=0x7c00;设置空栈
xor ax,ax
mov ss,ax
mov sp,ax;设置用户程序的段地址
mov eax,[cs:app_address]
shr eax,4
mov ds,ax
mov es,ax;设置用户程序要加载到0x10000位置
app_address dd 0x10000;设置55AA
times 510-($-$$) db 00
dw 0xAA55

由于需要了解用户程序的程序头,所以待用户程序头文章完成之后再回来写本章实现代码

计算机系统-程序加载器相关推荐

  1. 【OS学习笔记】十 实模式:实现一个程序加载器-程序加载器如何将用户程序加载到内存并执行

    上一篇文章学习了以下内容: 用一种不同的分段方法,从另一个不同的的角度理解处理器的分段内存访问机制 使用循环和条件转移指令来优化主引导扇区代码 点击链接查看上一篇文章:点击链接查看 对于主引导扇区部分 ...

  2. 操作系统的 (program)loader(程序加载器)

    在计算机科学中,加载器(也叫程序加载器)属于操作系统的一部分,用于加载程序(programs)和库(libraries).加载器是执行程序和代码必不可少的组件,正是它负责将程序送入内存,为程序的运行提 ...

  3. contiki学习笔记(六)contiki程序加载器和多线程库

    六.contiki程序加载器 contiki程序加载器是一个用于加载和启动程序的抽象接口. Data Structures struct dsc//DSC程序描述结构. ModulesThe Cont ...

  4. linux程序加载器,Linux 动态连接加载器 ld-linux用法

    Linux 动态连接加载器 ld-linux用法 文章作者:网友投稿 发布时间:2009-12-10 16:21:11 来源:网络 ld-linux有两种用法,间接调用和直接调用. 间接调用时,连接器 ...

  5. x86汇编从实模式到保护模式-程序加载器

    调试一天半,复刻成功!!! ;文件名:Program_Loader.asm ;文件说明:硬盘主引导扇区代码(加载程序) ;创建日期:2021-11-1;用户程序起始逻辑扇区号 ;段 ;Main: ;设 ...

  6. JVM学习笔记-03-类加载器及双亲委派机制

    JVM学习笔记-03-类加载器及双亲委派机制 文章目录 JVM学习笔记-03-类加载器及双亲委派机制 1. 类加载器 视频链接-最新JVM教程IDEA版[Java面试速补篇]-03-类加载器及双亲委派 ...

  7. python反编译luac_Lua程序逆向之为Luac编写IDA Pro文件加载器

    距离上一次讲Lua程序逆向已经有一段时间了,这一次我们书接上回,继续开启Lua程序逆向系列之旅. 在软件逆向工程实践中,为第三方文件编写文件格式分析器与指令反汇编器是一种常见的场景.这一篇的主要目的是 ...

  8. JS框架设计之加载器所在路径的探知一模块加载系统

    1.要加载一个模块,我们需要一个URL作为加载地址,一个script作为加载媒介,但用户在require是都用ID,我们需要一个将ID转换为URL的方法,思路很简单,强加个约定,URL的合成规则是为: ...

  9. iOS进阶之底层原理-应用程序加载(dyld加载流程、类与分类的加载)

    iOS应用程序的入口是main函数,那么main函数之前系统做了什么呢? 我们定义一个类方法load,打断点,查看栈进程,我们发现dyld做了很多事,接下来就来探究到底dyld做了什么. 什么是dyl ...

最新文章

  1. java考勤与工资管理系统
  2. wireshark抓包理解TCP的三次握手
  3. python能做软件开发吗-学习Python软件开发能做什么?
  4. 笔记:C++重载++前后区分
  5. Spring Cloud Eureka 高可用注册中心
  6. shell常用的命令
  7. 38. 数字在排序数组中出现的次数(C++版本)
  8. Go -- go语言指针
  9. 图解R树的原理及相关操作
  10. 数据存储: CheckBoxPreference
  11. 类别不平衡问题之SMOTE算法(Python imblearn极简实现)
  12. 完整安装PX4/PX4-Autopilot,无需科学上网。
  13. 分布式图数据库-JanusGraph简介
  14. 免费全景摄影制作教程 - 摄影基础知识
  15. Rust:FFI 编程中的 CStr 和 CString
  16. 麒麟信安加入中国首个桌面操作系统根社区openKylin, 共擎开源未来!
  17. 微信公众号(移动端网页)必备的调试神器
  18. 如何注册自己的企业邮箱?
  19. 云主机使用的范围有哪些?
  20. 量子统计:玻尔兹曼分布、玻色分布、费米分布

热门文章

  1. Farey Sequence(欧拉函数板子题)
  2. JDK8新特性(一)之Lambda表达式
  3. MultipartFile与File之间的相互转换
  4. IDEA中Maven项目中界面右边的Maven Projects窗口找不到不出来
  5. vue 调用webservice_调用webService的几种方式
  6. 如何把一个整数转化成数组_「leetcode891」给定一个整数数组 A,考虑 A 的所有非空子序列...
  7. arp协议的主要功能是_计算机网络之ARP协议
  8. java.lang.NoSuchMethodError: javax.servlet.ServletContext.getVirtualServerName()Ljava/lang/String
  9. 8个日志级别(OFF、FATAL、ERROR、WARN、INFO、DEBUG、TRACE、 ALL)
  10. java读文件指定行开始到文件的最后