linux 0.11的运行

linux 0.11版本的编译和运行可以基于bochs,个人参考的是赵博的文章,主要是三块工作:

  • 制作linux镜像,按要求修改makefile后,可以直接在redhat上编译,生成image:
  • 制作linux根文件镜像rootimage(即启动时存在的bin、home等目录);
  • 设置bochs配置参数,将image和rootimage分别作为软盘A和软盘B;

linux 0.11的makefile

对于linux启动首先要理解的是linux内核镜像的组成,image由三部分组成:bootsect、setup和system,其中system是真正的内核代码。由makefile可知:

all:    Image //最终生成的镜像文件
Image: boot/bootsect boot/setup tools/system tools/buildobjcopy -O binary -R .note -R .comment tools/system tools/kerneltools/build boot/bootsect boot/setup tools/kernel $(ROOT_DEV) > Image //由build程序组成image,ROOT_DEV是根文件参数rm tools/kernel -fsync

tools/system:    boot/head.o init/main.o \ //systtem部分目标文件$(ARCHIVES) $(DRIVERS) $(MATH) $(LIBS)$(LD) $(LDFLAGS) boot/head.o init/main.o \  //注意是GNU的编译和链接器$(ARCHIVES) \ //内核、文件系统、内存管理的目标文件$(DRIVERS) \ /驱动部分目标文件$(MATH) \ /数学运算库目标文件$(LIBS) \ /内核库函数目标文件-o tools/system 

//下面两个是X86的编译和连接器boot/setup: boot/setup.s    $(AS86) -o boot/setup.o boot/setup.s$(LD86) -s -o boot/setup boot/setup.oboot/bootsect:    boot/bootsect.s$(AS86) -o boot/bootsect.o boot/bootsect.s$(LD86) -s -o boot/bootsect boot/bootsect.o

linux 0.11的build.c

上述makefile中很重要的一个文件是build.c,它将bootsect、setup、system和根文件作为参数,最终生成image。build.c在tools文件夹中,主要就是main函数执行功能如下:

  • 判断入参以及根文件,获取文件的主设备号和从设备号,写入image文件的508、509;默认写入0x021D即1.44 MB B驱动器;
  • 判断bootsect文件正确性,并写入stdout;
  • 判断setup正确性,(长度是否大于4个扇区(4*512),是则错误否则填0),并写入stdout;
  • 判断system正确性,并写入stdout;
  • 最终stdout会在makefile中重定向到image文件(> image);

由上可知在image中头512字节是bootsect代码,因此当该image文件被加载入软盘启动时正好属于BIOS默认的引导扇区,也就是启动设备的第一个扇区,这也就是linux 0.11进入引导程序前的全部工作了:)

转载于:https://www.cnblogs.com/Fredric-2013/archive/2013/05/01/3053786.html

linux 0.11 源码学习(二)相关推荐

  1. linux 0.11 源码学习(十四)

    文件系统综述 linux 文件系统是基于MINIX 1.0文件系统,这部分的代码量是整个内核里最大的,但代码结构对应着MINIX文件系统的构成,还是比较清晰易读的. MINIX文件系统 MINIX的文 ...

  2. linux 0.11源码下载,Linux-0.11-sourc

    带中文注释的linux源码VER-0.11/ 带中文注释的linux源码VER-0.11/boot/ 带中文注释的linux源码VER-0.11/boot/bootsect.s 带中文注释的linux ...

  3. Linux 0.11 fork 函数(二)

    Linux 0.11 系列文章 Linux 0.11启动过程分析(一) Linux 0.11 fork 函数(二) Linux0.11 缺页处理(三) Linux0.11 根文件系统挂载(四) Lin ...

  4. Golang源码学习(二)----Go源码学习基础

    ### 本文源码版本为 GO 1.17.8 Windows/amd64: ### 可能参与对比的版本:GO 1.16.2 Linux/amd64一.Golang的编译器究竟是如何工作的? (学习源码有 ...

  5. ROS源码学习 二、线程池

    2021SC@SDUSC 目录 1.写在前面 2.ROS线程池概述 3.ROS线程池模型 4.ROS线程池源码详解 5.总结 1.写在前面 ROS作为一个操作系统,其职责是协调具有不同功能的node之 ...

  6. java集合类程序代码_java集合类源码学习二

    我们查看Collection接口的hierarchy时候,可以看到AbstractCollection这样一个抽象类,它实现了Collection接口的部分方法,Collection集合系列的各个集合 ...

  7. 使用base标签后图片无法加载_Spring 源码学习(二)-默认标签解析

    `Spring` 解析默认标签~ 从上一篇笔记可以看出,在容器注册 bean 信息的时候,做了很多解析操作,而 xml 文件中包含了很多标签.属性,例如 bean . import 标签, meta ...

  8. Box2d源码学习二内存管理之SOA的实现

    本系列博客是由扭曲45原创,欢迎转载,转载时注明出处,http://blog.csdn.net/cg0206/article/details/8258166 SOA,全称small object al ...

  9. SocketServer源码学习(二)

    SocketServer 中非常重要的两个基类就是:BaseServer 和 BaseRequestHandler 在SocketServer 中也提供了对TCP以及UDP的高级封装,这次我们主要通过 ...

最新文章

  1. HDU-2444 The Accomodation of Students
  2. CTF-IDA的常用操作(初学者)
  3. 智能路由器-OpenWRT 系列五 (NAS-SMB家庭共享)
  4. python绘制饼图双层_有趣!如何用Python-matplotlib绘制双层饼图及环形图?
  5. 山东大学 2020级数据库系统 实验四
  6. Pandas知识点-合并操作join
  7. 蓝桥杯练习题:保留100位小数的黄金分割数
  8. 【第4篇】Python爬虫实战-抓取B站弹幕视频
  9. 【Python3】py脚本打包成exe
  10. java怎么从后天往前台传参_Java后台解析前台的get中文请求
  11. 数据清洗有哪些方法?
  12. Android多媒体相关框架
  13. 通过网线连接两台主机
  14. Unity3D插件之FingerGestures:手势插件
  15. K3S执行命令提示You must be logged in to the server (Unauthorized)
  16. 老农斗杀巨型蜈蚣目击记
  17. python求因子个数_python怎么求因数
  18. python实现抢票github_面向回家编程!GitHub标星两万的”Python抢票教程”,我们先帮你跑了一遍...
  19. jQuery事件绑定和解绑
  20. uniapp 密码显示隐藏

热门文章

  1. leetcode —— 206. 反转链表
  2. 一张图学会Xmind创建思维导图【转载】
  3. 设计模式学习笔记——装饰(Decorator)模式
  4. 求C n m(从n个数中选m个数,有多少种组合?问题)暴力—递归——回归数学公式,三种方法,层层优化!
  5. php 判断苹果还是安卓,PHP简单判断iPhone、iPad、Android及PC设备的方法
  6. mysql 设置时区_MySQL实战干货 | 如何处理由时区设置引发的 SQL 执行“卡顿”?...
  7. echars x轴单位_如何让echarts中y轴的单位位于数值的右上角
  8. matlab画直方图下标,matlab画二维数据直方图/画二维概率分布
  9. tensorflow 显存 训练_Tensorflow与Keras自适应使用显存方式
  10. html选择树形菜单代码,jquery+css实现html选择树或树形菜单