#
# Makefile for linux.
# If you don't have '-mstring-insns' in your gcc (and nobody but me has :-)
# remove them from the CFLAGS defines.
##
#8086汇编编译器和连接器. -0生成8086目标程序;-a生成与gas和gld部分兼容的代码
#
AS86 =as -0 -a
CC86 =cc -0
LD86 =ld -0#
#GNU汇编编译器和连接器
#
AS =gas
LD =gld#
#GNU连接器gld运行时用到的选项
#-s 输出文件中省略所有的符号信息
#-x 删除所有的局部符号
#-M 在标准输出设备(显示器)上打印连接映象(link map).
#连接映象:由连接程序产生的一种内存地址映象,其中列出了程序装入到内存中的位置信息,具体有如下信息:
#目标文件及符号信息映射到内存中的位置
#公共符号如何放置
#连接中包含的所有文件成员及其引用的符号
#
LDFLAGS =-s -x -M#
#gcc是GNU C程序编译器,对于UNIX类的脚本程序而言,
#在引用定义的标识符时,需在前面加上$符号并用括号括住标识符
#
CC =gcc#
#GCC的选项.
#-Wall 打印所有的警告信息
#-O 对代码进行优化
#-fstrength-reduce 优化循环语句
#
CFLAGS =-Wall -O -fstrength-reduce -fomit-frame-pointer -fcombine-regs#
#CPP是gcc的预处理程序
#-nostdinc -Iinclude 不要搜索标准的头文件目录中的文件,
#而是使用-I选项指定的目录或者是在当前的目录里搜索头文件
#
CPP =gcc -E -nostdinc -Iinclude#
# kernel目录,mm目录,fs目录所产生的目标代码文件。
# 为了方便引用,在这里将它们用ARCHIVES(归档文件)标识符表示
#
ARCHIVES=kernel/kernel.o mm/mm.o fs/fs.o#
# 由lib/目录中生成的通用库文件
#
LIBS =lib/lib.a#
# make隐式后缀规则
# 指示make利用下面的命令将所有的.c文件编译生成.s汇编程序
# ':'表示下面是该规则的命令
# 规则:指使gcc采用前面CFLAGS所指定的选项以及仅使用include/目录中的头文件,
# 在适当的编译后不进行汇编就停止(-S),从而产生与输入的各个C文件对应的汇编语言形式的代码文件。
# 默认情况下所产生的汇编程序文件是原C文件名去掉.c而加上.s后缀。
# -o表示其后是输出文件的形式。
# 其中$*.s(或$@)是自动目标变量,$<代表第一个先决条件,这里即是符合条件*.c的文件。
#
.c.s:
$(CC) $(CFLAGS) \
-nostdinc -Iinclude -S -o $*.s $<#
# 将所有.s汇编程序文件编译成.o目标文件。下一条是实现该操作的具体命令
# 使用gas编译器将汇编程序编译成.o目标文件。-c表示只编译或汇编,但不进行连接操作
#
.s.o:
$(AS) -c -o $*.o $<#
# 使用gcc将c语言编译成目标文件但不连接
#
.c.o:
$(CC) $(CFLAGS) \
-nostdinc -Iinclude -c -o $*.o $<#
# all表示创建Makefile所知的最顶层目标。这里即是image文件
#
all: Image#
# 第一行说明:目标文件(Image文件)是由分号后面的3个元素产生
# 下面两行是执行的命令
# 第一行表示使用tools目录下的build工具程序将boot,system文件组装成内核映象文件Image
# 第二行的sysn同步命令是迫使缓冲块数据立即写盘并更新超级块
#
Image: boot/boot tools/system tools/build
tools/build boot/boot tools/system > Image
sync#chmem -- 修改系统内存数据
tools/build: tools/build.c
$(CC) $(CFLAGS) \
-o tools/build tools/build.c
chmem +65000 tools/build#
# 利用上面的.s.o规则生成head.o文件
#
boot/head.o: boot/head.s#
# 最后的>System.map表示gld需要将连接映象重定向存放在System.map文件中
#
tools/system: boot/head.o init/main.o \
$(ARCHIVES) $(LIBS)
$(LD) $(LDFLAGS) boot/head.o init/main.o \
$(ARCHIVES) \
$(LIBS) \
-o tools/system > System.map#
# 内核目标模块kernel.o
#
kernel/kernel.o:
(cd kernel; make)#
# 内核管理模块mm.o
#
mm/mm.o:
(cd mm; make)#
# 文件系统目标模块fs.o
#
fs/fs.o:
(cd fs; make)#
# 库函数lib.a
#
lib/lib.a:
(cd lib; make)#
# 在boot.s程序开口添加一行有关system文件长度信息
# 首先生成含有 "SYSSIZE = 文件实际长度"一行信息的tmp.s文件,然后将boot.s文件添加在其后。
# 取得system长度的方法是:
# 利用ls命令对system文件进行长列表显示
# 用grep命令取得列表上文件字节数字段信息,并定向保存在tmp.s临时文件中
# cut命令用于剪切字符串
# tr用于去除行尾的回车符
# (实际长度 + 15)/16用于获得'节'表示的长度信息,1节=16字节
# 用8086汇编和连接器对setup.s文件进行编译生成setup文件
# -s表示要取出目标文件中的符号信息
#
boot/boot: boot/boot.s tools/system
(echo -n "SYSSIZE = (";ls -l tools/system | grep system \
| cut -c25-31 | tr '\012' ' '; echo "+ 15 ) / 16") > tmp.s
cat boot/boot.s >> tmp.s
$(AS86) -o boot/boot.o tmp.s
rm -f tmp.s
$(LD86) -s -o boot/boot boot/boot.o#
# 当执行"make clean"时,就会执行以下命令,去除所有编译连接生成的文件
# "rm"是文件删除命令,选项-f含义是忽略不存在的文件,并且不显示删除信息
# (cd mm;make clean)表示进入mm/目录,执行该目录Makefile文件中的clean规则
#
clean:
rm -f Image System.map tmp_make boot/boot core
rm -f init/*.o boot/*.o tools/system tools/build
(cd mm;make clean)
(cd fs;make clean)
(cd kernel;make clean)
(cd lib;make clean)#
# 该规则首先执行上面的clean规则,然后对linux/目录进行压缩,生成backup.Z压缩文件。
# "cd .."表示退到linux/的上一级(父)目录
# "tar cf - linux"表示对linux/目录执行tar归档程序,-cf表示需要创建新的归档文件
# "| compress -"表示将tar程序的执行通过管道操作('|')传递给压缩程序compress,并将压缩程序的输
#出存成backup.Z文件
# sysn同步命令迫使缓冲块数据立即写盘并更新超级块
#
backup: clean
(cd .. ; tar cf - linux | compress16 - > backup.Z)
sync#
# 该规则用于各文件的依赖关系。创建这些依赖关系是为了给make用来确定是否需要重建一个目标对象
# 比如当某个文件头被改动过后,make就通过生成的依赖关系,重新编译与该头文件有关的所有*.c文件。
# 具体方法如下:
# 使用字符串编辑程序sed对Makefile文件(这里即是自己)进行处理,
# 输出为删除Makefile文件中"### Dependencies"行后面的所有行,并生成tmp_make临时文件
# 然后对init/目录下的每一个C文件(其实只有一个C文件main.c)执行gcc预处理操作
# -M标志告诉预处理程序输出描述每个目标文件相关性的规则,并且这些规则符合make语法
# 对于每一个源文件,预处理程序输出一个make规则,其结果形式是相应源程序文件的目标文件名加上其依赖关系--该源文件中包含的所有头文件列表
# "$$i"实际上是$($i)的意思,"$i"是前面shell变量的值
# 然后把预处理结果都加到临时文件tmp_make中,然后将该临时文件复制成新的makefile文件
#
dep:
sed '/\#\#\# Dependencies/q' < Makefile > tmp_make
(for i in init/*.c;do echo -n "init/";$(CPP) -M $$i;done) >> tmp_make
cp tmp_make Makefile
(cd fs; make dep)
(cd kernel; make dep)
(cd mm; make dep)### Dependencies:
init/main.o : init/main.c include/unistd.h include/sys/stat.h \
include/sys/types.h include/sys/times.h include/sys/utsname.h \
include/utime.h include/time.h include/linux/tty.h include/termios.h \
include/linux/sched.h include/linux/head.h include/linux/fs.h \
include/linux/mm.h include/asm/system.h include/asm/io.h include/stddef.h \
include/stdarg.h include/fcntl.h

转自:http://blog.chinaunix.net/uid-26435987-id-3374592.html

Linux0.01内核根目录Makefile注释相关推荐

  1. VirtualBox虚拟机安装RedHat7.3编译Linux0.01内核

    引子 由于需要编译linux0.01内核,而目前的linux版本太高需要降低gcc版本等等,需要做不少调整非常不方便. 所以,直接安装RedHat7.3,这样就好编译linux0.01的内核了. 但是 ...

  2. 珍贵的linux0.01内核

    我最开始接触linux内核是2.4.16版本,然后就一直跟踪到了2.6.27版本,今天是2008年11月5号,一年前我好奇地想知道最开始的 linux内核是个什么样子,然后如何一步一步变成今天的这个样 ...

  3. linux1.0内核下载,《Linux 0.01 内核分析与操作系统设计》(Linxu 0.01Source)

    中文名: Linux_0_01_内核分析与操作系统设计 英文名: Linxu 0.01Source 发行时间: 2003年 地区: 大陆 对白语言: 普通话 简介: 清华 卢军<Linux0.0 ...

  4. Linux0.1源码分析,《Linux 0.01内核分析与操作系统设计——创造你自己的操作系统》...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 readme 本光盘为<Linux 0.0.1内核分析与操作系统设计--创造你自己的操作系统>一书的配套光盘,读者可自由取其源文件做学习,研究 ...

  5. linux0.11多任务管理程序阅读注释笔记

    [ 1] linux0.11引导程序阅读注释. [ 2] linux0.11由实模式进入保护模式程序阅读注释 . [ 3] linux0.11护模式初始化程序阅读注释. [ 4] linux0.11主 ...

  6. linux 0.01内核分析与操作系统设计 pdf,《Linux 0.01内核分析与操作系统设计——创造你自己的操作系统》...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 readme 本光盘为<Linux 0.0.1内核分析与操作系统设计--创造你自己的操作系统>一书的配套光盘,读者可自由取其源文件做学习,研究 ...

  7. Linux内核defconfig在哪,Linux内核根目录中的配置文件.config中包含了许多宏定义,...

    满意答案 大大bigone 推荐于 2017.11.22 采纳率:52%    等级:9 已帮助:813人 一.Linux内核的配置系统由三个部分组成,分别是: 1.Makefile:分布在 Linu ...

  8. Linux内核中makefile有什么作用?深入解析makefile工作过程和原理

    Table of Contents Makefile 中的变量 常用的变量有以下几类: 1) 版本信息 2) CPU 体系结构:ARCH 3) 路径信息:TOPDIR, SUBDIRS 4) 内核组成 ...

  9. Linux0.11内核源码解析-setup.s

    学习资料: Linux内核完全注释 操作系统真像还原 极客时间-Linux内核源码趣读 Linux0.11内核源码 ->setup程序将system模块从0x10000~0x8ffff整块向下移 ...

最新文章

  1. 详解:XenServer丢失存储库SR解决方法
  2. 在Linux环境下使用OpenSSL对消息和文件进行加密(转载)
  3. innerHTML outerHTML innerText
  4. java设计模式6--适配器模式(Adapter )
  5. IntelliJ IDEA添加过滤文件或目录(转)
  6. 《Man Vs wild》 Notes-法国阿尔卑斯山
  7. scrapy 让指定的spider执行指定的pipeline
  8. Lesson 05 for Plotting in R for Biologists
  9. ElementUI:路由界面刷新后导航栏仍显示default-active不跟随路由变化
  10. ISUP信令REL原因值
  11. matlab mcl,wsn定位蒙特卡洛方法mcl的matlab
  12. tcl/tk sample.dll cannot be unloaded under a trusted interpreter
  13. C++的get()函数与getline()函数使用详解
  14. linux系统安装teamview,在Ubuntu 18.04系统上安装TeamViewer的两种方法
  15. MySQL学习笔记一
  16. select 1 from和exists
  17. Windows安装Mysql并配置(安装版)
  18. Java处理除数为零的情况
  19. 解决win10 VC++6.0 应用程序无法正常运行 0xc0000142
  20. 孙素丹老师 银行数字化场景营销专家

热门文章

  1. 远程管理linux系统工具,远程管理Linux系统工具的设计与实现Linux013
  2. linux多用户怎么表示,Linux如何建立多用户
  3. asp.net webform 复制窗体代码_逆向分析流氓软件自我复制以及防御思路
  4. OpenCV-Python绑定如何工作及如何扩展新模块到Python
  5. Computer Vision Tasks
  6. RS485通信如何设计EMC电路?
  7. torch量化训练后导出onnx模型并运行
  8. keras 的 example 文件 mnist_swwae.py 解析
  9. ikbc机械键盘打字出现重复_抖音开啤酒小姐姐同款面具,ikbc白无垢樱花机械键盘开箱体验...
  10. 运行ORB-SLAM笔记_编译篇(一)