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. 黄聪:Microsoft Enterprise Library 5.0 系列教程(六) Security Application Block

    原文:黄聪:Microsoft Enterprise Library 5.0 系列教程(六) Security Application Block 开发人员经常编写需要安全功能的应用程序.这些应用程序 ...

  2. 递归算法的数据结构和算法 C++和PHP达到

    递归算法:它是一种间接的方法调用本身,直接或. 实施过程:按功能或子程序完成.在函数编写代码或子程序直接或间接拥有被称为.你可以完成递归. (相同类型的问题,子问题到最小问题有已知条件,然后来求解,然 ...

  3. javascript和css浏览器兼容性总结

    一些浏览器的兼容性做一个总结的问题以下: 为什么会出现这样的现象是?主要表现为Firefox这样的良好支持的浏览器W3C标准,这是现在CSS支持最好的浏览器,和ie它比较早出现,在w3c支持一直没有做 ...

  4. [置顶] android系统如何在静音模式下关闭camera拍照声音(2)

    之前写过一篇“android系统如何在静音模式下关闭camera拍照声音”的博客,今天来写他的续篇,继续探讨这个问题. 公司新需求,要求在camera应用中添加一个开关,可以进行拍照声音的关闭和开启. ...

  5. HDOJ 5147 Sequence II 树阵

    树阵: 每个号码的前面维修比其数数少,和大量的这后一种数比他的数字 再枚举每一个位置组合一下 Sequence II Time Limit: 5000/2500 MS (Java/Others)    ...

  6. lambda Join /Group by/ Contains

    1.Join Contains

  7. 在JAVA中使用LUA脚本记,javaj调用lua脚本的函数(转)

    最近在做一些奇怪的东西,需要Java应用能够接受用户提交的脚本并执行,网络部分我选择了NanoHTTPD提供基本的HTTP服务器支持,并在Java能承载的许多脚本语言中选择了很久,比如Rhino,Jy ...

  8. Perl中的单行凝视和多行凝视

    同其它大多数编程语言一样.Perl中的单行凝视也是#开头.比如: #print "Hello,World!"; 但多行凝视.不同的语言有不同的凝视方式,比方说: Java,C/C+ ...

  9. 阿里游戏大数据sesson2_RF&amp;GBRT(上)

    ----------一个小的游戏体验,对于不太熟悉Xlab RF和GBRT同学们都叫参考,不喜勿喷,大神绕道,米姆达. . .. .---------- 6月初的时候LR 做到4.9后一直上不去,看群 ...

  10. effective c++ 条款11 Handle assignment to self in operator=

    赋值给自己,听起来有些不可思议,但是却要引起重视,它很容易把自己隐藏起来. 例如 1 a[i]=a[j]; 如果 i, j的值一样? 2 *px=*py; 如果px py指向同一个object 3   ...