在把Linux内核源代码生成Image之前,需要把执行文件头结构信息剔除出来。这个过程对理解Linux内核具有很大的帮助。同时,由于是对可执行文件进行直接读写操作,想写DUL工具的童鞋可以在这里学习到基本的二进制文件读写方法。

首先,我们看一下minix可执行文件的格式(Linux和minix很基情)。

struct exec {unsigned char a_magic[2];unsigned char a_flags;unsigned char a_cpu;unsigned char a_hdrlen;unsigned char a_unused;unsigned short a_version;long a_text;long a_data;long a_bss;long a_entry;long a_total;long a_syms;long a_trsize;long a_drsize;long a_tbase;long a_dbase;
};

下面来具体看下读写代码:linux/tools/build.c line 60-117

        char buf[1024];......for (i=0;i<sizeof buf; i++) buf[i]=0;                      //buf初始化if ((id=open(argv[1],O_RDONLY,0))<0)                       //处理boot二进制文件die("Unable to open 'boot'");if (read(id,buf,MINIX_HEADER) != MINIX_HEADER)             //读入MINIX_HEADER长度的内容die("Unable to read header of 'boot'");if (((long *) buf)[0]!=0x04100301)                         //其中的0x0301表示minix头部的a_magic魔数;0x10表示a_flag可执行;0x04 - a_cpudie("Non-Minix header of 'boot'");if (((long *) buf)[1]!=MINIX_HEADER)                       //a_hdrlen是否正确die("Non-Minix header of 'boot'");if (((long *) buf)[3]!=0)                                  //数据段长是否为0die("Illegal data segment in 'boot'");if (((long *) buf)[4]!=0)                                  //a_bss是否为0die("Illegal bss in 'boot'");if (((long *) buf)[5] != 0)                                //a_entry是否为0?哈哈,汇编的入口哦《Linux内核源代码分析——Linux内核入口》中的答案die("Non-Minix header of 'boot'");if (((long *) buf)[7] != 0)                                die("Illegal symbol table in 'boot'");i=read(id,buf,sizeof buf);fprintf(stderr,"Boot sector %d bytes.\n",i);if (i != 512)die("Boot block must be exactly 512 bytes");if ((*(unsigned short *)(buf+510)) != 0xAA55)die("Boot block hasn't got boot flag (0xAA55)");buf[508] = (char) minor_root;buf[509] = (char) major_root;  i=write(1,buf,512);                                         //剔除文件头之后,把执行代码写入标准输出if (i!=512)die("Write call failed");close (id);                                                 //处理boot二进制文件结束......

所以,读写二进制文件的关键在于对Unix基本的api的熟悉。可以通过《Unix环境高级编程》得到这些基础知识。

Linux内核源代码分析——可执行文件header处理(二进制文件读写范例,写DUL工具入门指引)...相关推荐

  1. linux内核源代码分析----内核基础设施之klist

    概述 klist是list的线程安全版本,他提供了整个链表的自旋锁,查找链表节点,对链表节点的插入和删除操作都要获得这个自旋锁.klist的节点数据结构是klist_node,klist_node引入 ...

  2. Linux内核源代码分析-目录

    第一部分 Linux 内核源代码 arch/i386/kernel/entry.S 2 arch/i386/kernel/init_task.c 8 arch/i386/kernel/irq.c 8 ...

  3. Linux内核源代码分析——fork()原理多进程网络模型

    今晚和一位500强的leader喝喝小酒吃吃烤鱼,生活乐无边.这位兄弟伙才毕业2年,已经做到管理层了,机遇和能力不可谓不好.喝酒之余,聊到Linux内核的两个问题--fork().exec()的原理. ...

  4. Linux内核源代码分析——Linux内核的入口

    Jack:hi,淫龙,在Linux内核的源代码里,有几段汇编代码,那几段代码是负责Linux内核引导的. 我:是的.早期的Linux内核引导代码只有bootsect.s.setup.s.head.s这 ...

  5. Linux内核源代码分析经验

      Linux的最大的好处之一就是它的源码公开.同时,公开的核心源码也吸引着无数的电脑爱好者和程序员:他们把解读和分析Linux的核心源码作为自己的 最大兴趣,把修改Linux源码和改造Linux系统 ...

  6. Linux内核源代码分析-第三章 内核体系结构概述-1

    第3章 内核体系结构概述 本章从较高层次上对内核进行说明.从顺序上来说,本章首先介绍内核设计目标,接下来 介绍内核体系结构,最后介绍内核源程序目录结构. 3.1 内核设计目标 Linux 的内核展现出 ...

  7. Linux内核源代码分析——中断(一鞭一条痕)(下)

    写在代码前: Jack:上次你说的8个问题.我都想过了.不过不是特别清楚. 我:那我从头介绍一下吧. Jack:好.你开始吧. 中断在几乎所有的CPU里都分为三类:中断(interrupt).异常(e ...

  8. Linux 内核源代码分析 chap 2 存储管理 (5)

    物理页面分配 linux 内核 2.4 中有 2 个版本号的物理页面分配函数 alloc_pages(). 一个在 mm/numa.c 中, 还有一个在 mm/page_alloc.c 中, 依据条件 ...

  9. Linux内核源代码分析-第三章 内核体系结构概述-3

    3.5 设计和实现的关系 接下来的部分将介绍一些内核设计和实现之间的关系.本部分最重要的内容是对于内核源 程序目录结构的概述,这一点随后就会提到.本章最后以实现中体系结构无关代码和体系 结构相关代码的 ...

最新文章

  1. 【Android 应用开发】Android资源文件 - 使用资源存储字符串 颜色 尺寸 整型 布尔值 数组
  2. 帝国cms用php输出点击数量,帝国CMS信息增加随机点击数的修改方法(最新教程)
  3. 【CyberSecurityLearning 6】IIS之WEB服务器和FTP服务器
  4. 在一颗度为4的树T中,若有20个度为4的结点,10个度为3的结点,1个度为2的结点,10个度为1的结点,则树T的叶结点个数是( )
  5. Bootstrap组件_进度条
  6. 我的世界java版和基岩版对比_我的世界:基岩版比Java多出的七个特性,都听过的非老mc莫属了!...
  7. vue 父组件与子组件之间的传值(普通传值)
  8. leetcode 454. 四数相加 II(哈希表)
  9. matlabapp窗口图像_如何在一个matlab窗口上合并两个图像?
  10. spring yml 配置事务_application.yml与bootstrap.yml的区别
  11. 扇贝有道180902每日一句
  12. weblogic12C安装
  13. 最最简单的一个爬虫代码
  14. report machine实现报表分栏
  15. 一键清除系统垃圾 bat文件
  16. 王琪你计算机学院,计算机学院成功举办第四届青春飞扬大赛
  17. 中间状态+三方预约下单接口测试项目
  18. 引子——漂在中关村 1
  19. 3D电影、游戏里的角色是怎么制作的?
  20. ps4手柄驱动linux,Arduino和单片机区别,及Arduino入门教程

热门文章

  1. 常用WebServices返回数据的4种方法比较 (转)
  2. [RHEL5企业级Linux服务攻略]--第1季 Linux服务器的搭建与测试
  3. 西安计算机二级12月,2017年12月计算机二级MS Office习题答案(一)
  4. html5长按 排序,H5 长按 拖拽排序的实现
  5. php mysql交互实例_php基于session实现数据库交互的类实例
  6. 有linux服务器用来干什么用的,linux集群能干什么
  7. Java打卡Day4-算术运算符
  8. java dom4j 写xml文件_Java实现——Dom4j读写XML文件
  9. 同样学软件测试,为什么有些人一面试就拿一堆大厂offer?
  10. 工作了五年才明白的道理,这些原来我一开始就做错了