当前位置: 首页 > news >正文

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,如需转载请自行联系原作者


相关文章:

  • C#基本数据类型 思维导图
  • android FM播放时拔出耳机后,FM APP出现拔出耳机,Fm停止的提示框,然后自动close...
  • 编写shell脚本的另一种方法
  • 《CLR via C#》 之运行时序列化(3)
  • 一些可能没用过的调试窗口
  • Uboot 运行时内存的分配 -- 转
  • Linux系统下4个扇区的解释
  • Kerberos简介
  • ArgoUML 的简单用法
  • 修改eclipse自动生成的comments中的author名字
  • 怎么配置zen coding,我用的是Adobe Dreamweaver CS5 这个有解决么?
  • 安装jdk、安装Tomcat
  • MongoDB学习笔记
  • 中小企业如何设计存储系统方案
  • 九位不同数字乘法等式的递归与非递归回溯算法(三)
  • 【RocksDB】TransactionDB源码分析
  • AHK 中 = 和 == 等比较运算符的用法
  • Angular 响应式表单之下拉框
  • AzureCon上微软宣布了哪些容器相关的重磅消息
  • Date型的使用
  • ES6 学习笔记(一)let,const和解构赋值
  • HTML5新特性总结
  • Java新版本的开发已正式进入轨道,版本号18.3
  • js正则,这点儿就够用了
  • JWT究竟是什么呢?
  • k8s如何管理Pod
  • PHP CLI应用的调试原理
  • puppeteer stop redirect 的正确姿势及 net::ERR_FAILED 的解决
  • react-native 安卓真机环境搭建
  • scala基础语法(二)
  • Web标准制定过程
  • 关于 Linux 进程的 UID、EUID、GID 和 EGID
  • 欢迎参加第二届中国游戏开发者大会
  • 回顾 Swift 多平台移植进度 #2
  • 微服务核心架构梳理
  • 微服务入门【系列视频课程】
  • 优秀架构师必须掌握的架构思维
  • 远离DoS攻击 Windows Server 2016发布DNS政策
  • ​香农与信息论三大定律
  • # Pytorch 中可以直接调用的Loss Functions总结:
  • # 学号 2017-2018-20172309 《程序设计与数据结构》实验三报告
  • #{} 和 ${}区别
  • (4)事件处理——(7)简单事件(Simple events)
  • (NO.00004)iOS实现打砖块游戏(十二):伸缩自如,我是如意金箍棒(上)!
  • (八)c52学习之旅-中断实验
  • (附源码)spring boot智能服药提醒app 毕业设计 102151
  • (附源码)springboot美食分享系统 毕业设计 612231
  • (附源码)springboot优课在线教学系统 毕业设计 081251
  • (未解决)macOS matplotlib 中文是方框
  • (原)Matlab的svmtrain和svmclassify
  • (转)C#调用WebService 基础
  • .NET LINQ 通常分 Syntax Query 和Syntax Method
  • .NET Standard / dotnet-core / net472 —— .NET 究竟应该如何大小写?
  • .net 无限分类
  • .NET多线程执行函数