linux0.11学习笔记(2)

简介:

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)


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








本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/4674394.html,如需转载请自行联系原作者


相关文章
|
3月前
|
缓存 网络协议 Linux
Linux C/C++ 开发(学习笔记十三):百万并发的服务器实现
Linux C/C++ 开发(学习笔记十三):百万并发的服务器实现
54 0
|
3月前
|
网络协议 Linux C++
Linux C/C++ 开发(学习笔记十二 ):TCP服务器(并发网络编程io多路复用epoll)
Linux C/C++ 开发(学习笔记十二 ):TCP服务器(并发网络编程io多路复用epoll)
56 0
|
3月前
|
网络协议 Linux C++
Linux C/C++ 开发(学习笔记十一 ):TCP服务器(并发网络网络编程 一请求一线程)
Linux C/C++ 开发(学习笔记十一 ):TCP服务器(并发网络网络编程 一请求一线程)
39 0
|
2月前
|
缓存 Unix Linux
Linux学习笔记
Linux学习笔记
254 0
|
3月前
|
缓存 监控 Linux
Linux 学习笔记十九:常见监控工具
Linux 学习笔记十九:常见监控工具
Linux 学习笔记十九:常见监控工具
|
3月前
|
安全 Linux 数据安全/隐私保护
Linux 学习笔记十八:SELinux 相关概念
Linux 学习笔记十八:SELinux 相关概念
|
3月前
|
Linux 开发工具 索引
Linux 学习笔记索引
Linux 学习笔记索引
|
3月前
|
小程序 Linux 数据安全/隐私保护
Linux学习笔记十六:日志管理
Linux学习笔记十六:日志管理
|
3月前
|
存储 Linux 数据库
Linux学习笔记十三: 数据备份与恢复
Linux学习笔记十三: 数据备份与恢复
|
3月前
|
监控 Linux
Linux学习笔记十二:Linux 工作管理
Linux学习笔记十二:Linux 工作管理
Linux学习笔记十二:Linux 工作管理