makefile文件:

makefile 文件是make 实用简介。make 程序是用Makefile最后一次改变的数据文件和代码文件(last-modification time)确定哪些文件需要更新。对于每一个需要更新的文件时,它会根据Makefile 中的信息发出对应的命令。在Makefile 文件里。开头为'#'的行是凝视行。

文件开头部分的'='赋值语句定义了一些參数或命令的缩写。在引用定义的标识符时。需在前面加上$符号并用括号括住标识符。前一行最后的'\'符号表示下一行是续行。

all 表示创建Makefile
所知的最顶层的目标。dep: 该目标或规则用于各文件之间的依赖关系。

创建的这些依赖关系是为了给make 用来确定是否须要要 重建一个目标对象的。

简单的makefile 文件含有一些规则,这些规则具有例如以下的形式:

目标(target)... : 先决条件(prerequisites)...

命令(command)

...

...

当中'目标'对象一般是程序生成的一个文件的名称;比如是一个可运行文件或目标文件。目标也能够是所要採取活动的名字,比方'清除'('clean')。'先决条件'是一个或多个文件名称,是用作产生目标的输入条件。

通常一个目标依赖几个文件。

而'命令'是make 须要运行的操作。一个规则能够有多个命令,每个命令自成一行。

请注意,你须要在每个命令行之前键入一个制表符。自己主动变量的值是基于目标对象及其先决条件而在命令运行前设置的。

比如,’$^’的值表示规则的全部先决条件,包含它们所处文件夹的名称。’$<’的值表示规则中的第一个先决条件。’$@’表示目标对象

.c.s: # make 老式的隐式后缀规则。该行指示make 利用以下的命令将全部的 .c 文件编译生成.s 汇编程序。':'表示以下是该规则的命令。

$*.s(或$@)# 是自己主动目标变量。$<代表第一个先决条件,这里即是符合条件 *.c 的文件。

(cd kernel/math; make)计入子文件夹运行make命令

内核的编译过程:对boot/中的bootsect.s、setup.s 使用8086 汇编器进行编译,分别生成各自的运行模块。再对源码中的其他全部程序使用GNU 的编译器gcc/gas 进行编译,并连接成模块system。

再用build 工具将这三块组合成一个内核映象文件image.

as86 和ld86 是由Bruce Evans 编写的Intel 8086 汇编编译程序和连接程序。

它全然是一个8086的汇编编译器,但却能够为386 处理器编制32 位的代码。Linux 使用它不过为了创建16 位的启动扇区(bootsector)代码和setup 二进制运行代码。

该编译器的语法与GNU 的汇编编译器的语法是不兼容的,但近似于Intel 的汇编语言语法(如操作数的次序相反等)。

Linux 操作系统启动部分的主要运行流程:

PC 的电源打开后,80x86 结构的CPU 将自己主动进入实模式。并从地址0xFFFF0 開始自己主动运行程序代码。这个地址一般是ROM-BIOS 中的地址。

PC 机的BIOS 将运行某些系统的检測。并在物理地址0 处開始初始化中断向量。此后。它将可启动设备的第一个扇区(磁盘引导扇区,512 字节)读入内存绝对地址0x7C00 处。并跳转到这个地方。启动设备

一般是软驱或是硬盘

Linux 的最最前面部分是用8086 汇编语言编写的(boot/bootsect.s),它将由BIOS 读入到内存绝对地址0x7C00(31KB)处,当它被运行时就会把自己移到绝对地址90000(576KB)处,并把启动设备中后2kB 字节代码(boot/setup.s)读入到内存0x90200 处。而内核的其他部分(system 模块)则被读入到从地址0x10000 開始处。由于当时system 模块的长度不会超过0x80000 字节大小(即512KB),所以它不会覆盖在0x90000 处開始的bootsect
和setup 模块。随后将system 模块移动到内存起始处,这样system模块中代码的地址也即等于实际的物理地址。便于对内核代码和数据的操作。然后将整个系统从地址0x10000 移至0x0000 处,进入保护模式并跳转至系统的余下部分(在0x0000 处)。

此时全部32 位执行方式的设置启动被完毕: IDT、GDT 以及LDT 被载入。处理器和协处理器也已确认。分页工作也设置好了。终于调用init/main.c 中的main()程序。上述操作的源码是在boot/head.S 中间。

(42)

版权声明:本文博客原创文章,博客,未经同意,不得转载。

linux0.11学习笔记(2)的更多相关文章

  1. linux0.11学习笔记(1)

    公布软件包包括内容: bootimage.Z - 具有美国键盘代码的压缩启动映像文件: rootimage.Z - 以1200kB 压缩的根文件系统映像文件: linux-0.11.tar.Z- 内核 ...

  2. C++11 学习笔记 std::function和bind绑定器

    C++11 学习笔记 std::function和bind绑定器 一.std::function C++中的可调用对象虽然具有比较统一操作形式(除了类成员指针之外,都是后面加括号进行调用),但定义方法 ...

  3. Linux0.11学习

    Linux 0.11虽然不是什么“珠穆朗玛峰”,但它肯定还是“华山”或“泰山”.虽然有路但你还是需要最基本的努力和花费一定的代价才能“攀登”上去.1. PC兼容机硬件工作原理(比如8259A,8253 ...

  4. C++11学习笔记

    C++11 1.long long新类型 2.列表初始化 int t=0; int t={0}; int t(0); int t{0}; 注意:如果我们使用列表初始化有丢失信息的风险,则编译器报错 l ...

  5. C++11学习笔记(5) —— override and final (转)

    原文转自 http://blog.csdn.net/fire_lord/article/details/8540592 1.简介 C++为我们提供了继承和虚函数的重写特性. 在派生类中,重写虚函数不强 ...

  6. 802.11学习笔记1-WIFI参数含义

    研究下wifi参数的含义 #The word of "Default" must not be removed Default CountryRegion= CountryRegi ...

  7. Linux就该这么学11学习笔记

    参考链接:https://i.cnblogs.com/EditPosts.aspx?opt=1 文件传输协议 一般来讲,人们将计算机联网的首要目的就是获取资料,而文件传输是一种非常重要的获取资料的方式 ...

  8. 【DirectX 11学习笔记】世界矩阵的理解-运动合成

    最近在看龙书,写一下自己的学习理解,主要是物体运动的合成. 物体于局部坐标系内构建,每个物体拥有自己的局部坐标系以及相应的顶点矩阵A,并通过世界矩阵变换到唯一的世界坐标系. 物体在某时刻发生了位移和旋 ...

  9. C++11学习笔记之三lamda表达式,std::function, std::bind

    //lamda //first lamda [] {}; // second lamda []() //or no need () when paramater is null { std::cout ...

随机推荐

  1. 飘逸的python - 保持命名空间的整洁

    API的设计是一个艺术活.往往需要其简单.易懂.整洁.不累赘. 很多时候,我们在底层封装一个方法给高层用,而其它的方法只是为了辅助这个方法的. 也就是说我们只需要暴露这个方法就行,不用关心这个方法是怎 ...

  2. 手势(Gesture)的增加和识别

    Android除了提供手势检测之外,还允许把用户手势添加到指定文件中,以备以后使用,当用户再次画出该手势时,系统可识别该手势.Android使用GestureLibrary代表手势库,提供Gestur ...

  3. codeforces #256 A. Rewards

    A. Rewards time limit per test 1 second memory limit per test 256 megabytes input standard input out ...

  4. 为什么android你用的越多,速度较慢的手机

    依据第三方的调研数据显示,有 77% 的 Android 手机用户承认自己曾遭遇过手机变慢的影响,百度搜索"Android+ 卡慢",也有超过 460 万条结果. 在业内.Andr ...

  5. 排列组合相关算法 python

    获取指定长度得全部序列 通过事件来表述这个序列,即n重伯努利实验(二项分布)的全部可能结果.比如时间a表示为: a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], 假设每次实验为从 ...

  6. Java NIO内存映射---上G大文件处理(转)

    林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 摘要:本文主要讲了java中内存映射的原理及过程,与传统IO进行了对比,最后,用实例说明了结果 ...

  7. cocos2d之Box2D详细说明 鼠标联合实现

    cocos2d之Box2D具体解释 鼠标关节实现 DionysosLai2014-5-7 我们常常要移动物理世界中的某个物体,例如说石头.木块等.假设我们直接改变这些物体的位置,让这些物体尾随我们手指 ...

  8. 使用 Cordova+Visual Studio 创建跨平台移动应用(3)

    1 背景 本章节是关于Telerik AppBuilder for Visual Studio的. 目前(2014.12)为Telerik公司Telerik Platform的一部分,Telerik ...

  9. 一道看似简单的sql需求(转)

    听说这题难住大批高手,你也来试下吧.ps:博问里的博友提出的. 原始数据 select * from t_jeff t  简单排序后数据 select * from t_jeff t order by ...

  10. Sails.js中文文档

    Sails.js中文文档   http://sailsdoc.swift.ren/ Sails.js是一个Web框架,可以于轻松构建自定义,企业级Node.js Apps.它在设计上类似于像Ruby ...