linux 0.11 源码学习(二)
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 源码学习(二)相关推荐
- linux 0.11 源码学习(十四)
文件系统综述 linux 文件系统是基于MINIX 1.0文件系统,这部分的代码量是整个内核里最大的,但代码结构对应着MINIX文件系统的构成,还是比较清晰易读的. MINIX文件系统 MINIX的文 ...
- linux 0.11源码下载,Linux-0.11-sourc
带中文注释的linux源码VER-0.11/ 带中文注释的linux源码VER-0.11/boot/ 带中文注释的linux源码VER-0.11/boot/bootsect.s 带中文注释的linux ...
- Linux 0.11 fork 函数(二)
Linux 0.11 系列文章 Linux 0.11启动过程分析(一) Linux 0.11 fork 函数(二) Linux0.11 缺页处理(三) Linux0.11 根文件系统挂载(四) Lin ...
- Golang源码学习(二)----Go源码学习基础
### 本文源码版本为 GO 1.17.8 Windows/amd64: ### 可能参与对比的版本:GO 1.16.2 Linux/amd64一.Golang的编译器究竟是如何工作的? (学习源码有 ...
- ROS源码学习 二、线程池
2021SC@SDUSC 目录 1.写在前面 2.ROS线程池概述 3.ROS线程池模型 4.ROS线程池源码详解 5.总结 1.写在前面 ROS作为一个操作系统,其职责是协调具有不同功能的node之 ...
- java集合类程序代码_java集合类源码学习二
我们查看Collection接口的hierarchy时候,可以看到AbstractCollection这样一个抽象类,它实现了Collection接口的部分方法,Collection集合系列的各个集合 ...
- 使用base标签后图片无法加载_Spring 源码学习(二)-默认标签解析
`Spring` 解析默认标签~ 从上一篇笔记可以看出,在容器注册 bean 信息的时候,做了很多解析操作,而 xml 文件中包含了很多标签.属性,例如 bean . import 标签, meta ...
- Box2d源码学习二内存管理之SOA的实现
本系列博客是由扭曲45原创,欢迎转载,转载时注明出处,http://blog.csdn.net/cg0206/article/details/8258166 SOA,全称small object al ...
- SocketServer源码学习(二)
SocketServer 中非常重要的两个基类就是:BaseServer 和 BaseRequestHandler 在SocketServer 中也提供了对TCP以及UDP的高级封装,这次我们主要通过 ...
最新文章
- HDU-2444 The Accomodation of Students
- CTF-IDA的常用操作(初学者)
- 智能路由器-OpenWRT 系列五 (NAS-SMB家庭共享)
- python绘制饼图双层_有趣!如何用Python-matplotlib绘制双层饼图及环形图?
- 山东大学 2020级数据库系统 实验四
- Pandas知识点-合并操作join
- 蓝桥杯练习题:保留100位小数的黄金分割数
- 【第4篇】Python爬虫实战-抓取B站弹幕视频
- 【Python3】py脚本打包成exe
- java怎么从后天往前台传参_Java后台解析前台的get中文请求
- 数据清洗有哪些方法?
- Android多媒体相关框架
- 通过网线连接两台主机
- Unity3D插件之FingerGestures:手势插件
- K3S执行命令提示You must be logged in to the server (Unauthorized)
- 老农斗杀巨型蜈蚣目击记
- python求因子个数_python怎么求因数
- python实现抢票github_面向回家编程!GitHub标星两万的”Python抢票教程”,我们先帮你跑了一遍...
- jQuery事件绑定和解绑
- uniapp 密码显示隐藏
热门文章
- leetcode —— 206. 反转链表
- 一张图学会Xmind创建思维导图【转载】
- 设计模式学习笔记——装饰(Decorator)模式
- 求C n m(从n个数中选m个数,有多少种组合?问题)暴力—递归——回归数学公式,三种方法,层层优化!
- php 判断苹果还是安卓,PHP简单判断iPhone、iPad、Android及PC设备的方法
- mysql 设置时区_MySQL实战干货 | 如何处理由时区设置引发的 SQL 执行“卡顿”?...
- echars x轴单位_如何让echarts中y轴的单位位于数值的右上角
- matlab画直方图下标,matlab画二维数据直方图/画二维概率分布
- tensorflow 显存 训练_Tensorflow与Keras自适应使用显存方式
- html选择树形菜单代码,jquery+css实现html选择树或树形菜单