接上节,程序头可以自定义,只要我们按照自己定义的格式去解析就行。也许我光这么一说,很多同学还是不能彻底明白如何自定义文件头,因为大多数同学都是用高级语言来写程序,即使用了偏底层的c语言,不同平台的c编译器也会根据系统平台自动添加文件头,不给咱们亲手体验自定义程序头的机会。汇编语言非常 灵活,所以用它来构建任意文件格式则是非常方便的。书看到这里,我估计您已经发现我是个非常体贴的人,哈哈,所以给大家呈上以下代码来演示自定义文件头,请见以下的汇编程序代码:

[work@localhost book]$ cat -n header.S 1header: 2 program_length dd program_end-program_start 3 start_addr dd program_start 4;;;;;;; 以上是文件头,以下是文件体 ;;;;;;; 5body: 6program_start: 7 mov ax, 0x1234 8 jmp $ 9program_end: 10[work@localhost book]$

以上测试代码header.S,经编译后生成的文件是header.bin,编译命令是nams –o header.bin header.S,所以header.bin依然是纯二进制文件。但此纯二进制文件的程序入口并不是文件开头,这和咱们的loader.bin很像,mbr是跳到loader.bin的中间某部分去执行。假设header.S是被调用的程序,调用方知道header.S的前8字节是程序头,在这8字节中,前4字节用来标明程序尺寸大小,后4字节用来指明程序的入口地址,也就是该程序的第一条指令地址。从8字节后到文件结束为文件体。在调用方程序已经了解此文件格式后,它可以这样做:

  1. 将header.bin前8字节的内容读到内存,前4字节是程序体长度,后4字节是程序的入口地址。
  2. 将header.bin开头偏移8字节的地方做为起始,将header.bin文件尾,即开头偏移(8+程序体长度)个字节的地方做为终止。
  3. 将起始至终止之间的程序体复制到入口地址
  4. 转到入口地址处执行

您看,被调用方header.bin被设计成这样文件格式,调用方就可以自由处理啦。为了验证文件格式,大家看下header.bin生成的二进制文件真实内容,前8字节用了两个下划线分别区分了两个程序头属性,即program_length是0x00000005,start_addr是0x00000008。顺序是反着的,小端字节序。B83412是mov ax,0x1234指令,EBFE则对应的是jmp $。

当然这仅仅是用来演示,目的是起到抛砖引玉的作用,说了这些是为了引出后面咱们要介绍的文件格式。

自己设计的文件头自己当然认识,但这毕竟不通用,我们需要选择一种流行的文件格式,咱们是在linux下用c语言编程,其编译器gcc生成的是elf文件格式,咱们在下一节展开elf可执行文件格式的内容。

本内容摘自《操作系统真象还原》

【再续】

操作系统真象还原_一步步编写操作系统 43 二进制程序的加载方式3相关推荐

  1. 一步步编写操作系统 48 二进制程序的加载方式

    接上节,程序头可以自定义,只要我们按照自己定义的格式去解析就行.也许我光这么一说,很多同学还是不能彻底明白如何自定义文件头,因为大多数同学都是用高级语言来写程序,即使用了偏底层的c语言,不同平台的c编 ...

  2. ftp无法连接虚拟机_一步步编写操作系统4 安装x86虚拟机 bochs

    本节内容摘自<操作系统真象还原>,请大家支持正版 Bochs下载安装 在完成了linux发行版的安装后,现在到了安装bochs的环节,这是我们的操作系统最终的宿主机. 由于我的工作是运维, ...

  3. 《操作系统真象还原》第二章 ---- 编写MBR主引导记录 初尝编写的快乐 雏形已显!

    文章目录 专栏博客链接 前引 相关术语 理清操作系统启动程序运行流程(部分) 编写MBR引导内容 编译并检验mbr.bin Linux dd 磁盘操作指令与参数 模拟操作试一试 结束语 专栏博客链接 ...

  4. 《操作系统真象还原》第二章 编写MBR主引导记录,让我们开始掌权

    配合视频学习效果更好!https://www.bilibili.com/video/BV15o4y157Wm/?vd_source=701807c4f8684b13e922d0a8b116af31 仓 ...

  5. 操作系统真象还原_第零章_解惑

    第零章 解惑 1.操作系统是什么? 类比一 古代部落害怕手下的人滥用武器伤害他人,所以制造武器是要向部落申请.而人们只有申请的资格,申请结果有部落决定. 设计操作系统的人害怕使用者滥用硬件(例如把操作 ...

  6. 《操作系统真象还原》第二章 ---- 编写MBR主引导记录 初尝编写的快乐

    书接上回安装bochs后出现No bootable device 这回我们要自己写一个MBR. 首先我们再linux系统里面需要下载一个编译器,nasm 在命令行窗口输入sudo apt-get in ...

  7. 《操作系统真象还原》从零开始自制操作系统 全流程记录

    文章目录 前引 章节博客链接 实现源码链接 前引 这本<操作系统真象还原>里面一共有十五个章节 大约760页 这些系列博客也是我在做完哈工大操作系统Lab之后 觉得还是有些朦朦胧胧 毅然决 ...

  8. 《操作系统真象还原》第二章

    <操作系统真象还原>第二章 编写MBR主引导记录 载入内存 过程: (1)程序被加载器(软件或硬件)加载到内存某个区域. (2)CPU的cs:ip寄存器被指向这个程序的起始地址. 从按下主 ...

  9. 《操作系统真象还原》第十四章 ---- 实现文件系统 任务繁多 饭得一口口吃路得一步步走啊(上一)

    文章目录 专栏博客链接 相关查阅博客链接 本书中错误勘误 部分缩写熟知 闲聊时刻 实现文件系统的原理 inode构建原理 目录构建原理 超级块构建思路 创建文件系统 编写完的super_block.h ...

  10. 《操作系统真象还原》第十三章 ---- 编写硬盘驱动软件 行百里者半九十终成时喜悦溢于言表

    文章目录 专栏博客链接 相关查阅博客链接 本书中错误勘误 部分缩写熟知 闲聊时刻 提前需要准备编写的函数 实现printk 实现sprintf函数 创建从盘 创建从盘的步骤 修改后的bochsrc.d ...

最新文章

  1. R语言ggplot2可视化移除图例中的a字符实战
  2. raid0、1、5、10创建
  3. win7访问windows server 2003服务器出现未知的用户名或者错误的密码(转载)
  4. 数据挖掘 —— 探索性数据分析
  5. js动态给按钮赋id_如何给SHOPIFY店铺添加“立即购买”动态结账按钮
  6. JSP根据状态动态改变数据表格按钮
  7. HowNet介绍及使用
  8. 计算机教学研修心得英语,英语研修心得体会
  9. 高通平台开机LOGO的修改与兼容
  10. foxmail新建文件夹失败或者新建文件夹不显示的问题
  11. 笔记--左耳朵耗子叔的成长经历
  12. android qq毛玻璃,如何快速做出毛玻璃背景?有了这个网格渐变神器,1分钟搞定...
  13. Linux 下检测是否插入U盘
  14. python进程和线程大全
  15. GPT格式的磁盘扩容
  16. oracle 日期的常用写法
  17. iphonex时间显示蓝色_一文了解显示技术的发展简史
  18. Mac IDEA配置阿里云国内镜像
  19. c语言数列求和中有乘法,C语言数列求和(使用while循环)
  20. 拜日式精准引导词_在家练瑜伽,常用英文单词了解一下?(三)

热门文章

  1. servlet request返回上下文路径的方法
  2. centos下安装Anaconda
  3. SQL Server 远程连接出错~~~无法访问服务器
  4. 【转】常用 blas 函数
  5. 关于自定义函数的创建和调用
  6. PHP mcrypt可逆加密算法分析
  7. RK30SDK开发板驱动分析(一):platform device 的概念与注册
  8. 2010工作代码总结之三(repostioryItemGridLookUpEdit下拉框)
  9. 3.数据结构 --- 栈和队列
  10. 23.PHP的哈希表实现