1. #
  2. # if you want the ram-disk device, define this to be the
  3. # size in blocks.
  4. # 如果要使用 RAM 就定义块的大小(注释掉了),这是一个编译时参数,如果定义了在下面会用到。
  5. RAMDISK = #-DRAMDISK=512
  6. AS86 =as86 -0 -a #8006汇编的编译器和连接器。后面参数分别是:
  7. LD86 =ld86 -0 # -0 生成8086目标程序, -a 生成与gas 和 gld部分兼容的代码。
  8. AS =gas #GNU 汇编器和连接器。
  9. LD =gld
  10. LDFLAGS =-s -x -M # gld 参数,-s 输出文件中省略所有符号信息, -x 删除所有局部符号, -m 在标准输出设备上打印连接映像
  11. #连接映像是指由连接程序程序产生的一种内存地址映像,列出了程序段装到内存中的位置信息。具体指:
  12. #1.目标文件及符号信息映射到内存中的位置
  13. #2.公告符号如何放置
  14. #3.连接中包含的所有文件及其引用的符号
  15. # gcc GNU编译器,引用定义的符号时,需要在前面加上$符号,并用括号把定义的标识符括起来。
  16. CC =gcc $(RAMDISK)
  17. # -Wall 打印所有警告信息, -O 对代码进行优化 "-f标志" 指定与机器无关的编译标志
  18. # 1. -fstrength-reduce 用于优化循环语句
  19. # 2. -fomit-frame-pointer 指明对无需帧指针(Frame pointer)的函数不要把帧指针保留在寄存器中,可以避免对帧指针的操作和维护。
  20. # 3. -fcombine-regs 指明编译器在组合编译阶段把复制一个寄存器到另一个寄存器的指令组合在一起。
  21. # 4. -mstring-insns linus 在学习gcc时为gcc增加的选项,用于 gcc-1.40 在复制结构等操作时使用386cpu的字符串指令,可以去掉。
  22. CFLAGS =-Wall -O -fstrength-reduce -fomit-frame-pointer \
  23. -fcombine-regs -mstring-insns
  24. # -nostdinc -Iinclude 不要搜索标准头文件目录中的文件,即不用 /usr/include/目录下的头文件,
  25. # 而是使用 "-I" 选项指定的目录或者是在当前目录里搜索头文件。
  26. CPP =cpp -nostdinc -Iinclude
  27. #
  28. # ROOT_DEV specifies the default root-device when making the image.
  29. # This can be either FLOPPY, /dev/xxxx or empty, in which case the
  30. # default of /dev/hd6 is used by 'build'.
  31. #
  32. # ROOT_DEV 指定在创建内核映像文件时所使用的默认根文件系统所在的设备,可以是软盘、
  33. # /dev/xxx 或者空, 空着时使用默认值 /dev/hd6
  34. #
  35. ROOT_DEV=/dev/hd6
  36. # kernel目录, mm目录,和fs目录所产生的目标代码文件,为了方便引用,用ARCHIVES(归档文件)标识符标书
  37. ARCHIVES=kernel/kernel.o mm/mm.o fs/fs.o
  38. # 块和字符设备库文件。 '.a'表示该文件是个归档文件,即包含许多可执行二进制代码
  39. #子程序集合的库文件,通常由 GNU的 ar程序生成, ar 是GNU的二进制文件处理程序,用于创建、修改以及从归档文件中抽取文件。
  40. DRIVERS =kernel/blk_drv/blk_drv.a kernel/chr_drv/chr_drv.a
  41. MATH =kernel/math/math.a # 数学运算库文件
  42. LIBS =lib/lib.a # 由 lib/目录中文件所编译生成的库文件。
  43. #1. make 老式的隐式后缀规则,指示make利用下面的命令将所欲的'.c'文件编译生成'.s'汇编程序。
  44. #2. 使用 include/ 目录下的头文件,
  45. #3. -S 表示只进行编译,产生与各个C文件对应的汇编文件。默认情况下编译产生的文件名是源文件去掉'.c'后再加上'.s'后缀。
  46. #4. -o 后面是输出的文件的格式,其中'$*.s'(或'$@')是自动目标变量。
  47. #5. '$<' 代表第一个先决条件,这里即符合条件的'*.c' 文件
  48. #下面有三个规则:
  49. #1.若目标文件是'.s'文件,源文件是'.c'文件,则使用第一个规则。
  50. #2.若目标文件是'.o'文件,源文件是'.s'文件,则使用第二个规则。
  51. #3.若目标文件是'.o'文件,源文件是'.c'文件,则使用第三个规则。
  52. .c.s:
  53. $(CC) $(CFLAGS) \
  54. -nostdinc -Iinclude -S -o $*.s $<
  55. .s.o:
  56. $(AS) -c -o $*.o $<
  57. .c.o:
  58. $(CC) $(CFLAGS) \
  59. -nostdinc -Iinclude -c -o $*.o $<
  60. # all 表示makefile所知的最顶层目标,这里是Image文件,这里是引导启动盘映像文件bootimage。
  61. all: Image
  62. # 冒号后面的文件是生成 Image 文件依赖的4个文件,下一行是生成Image的执行命令
  63. Image: boot/bootsect boot/setup tools/system tools/build
  64. tools/build boot/bootsect boot/setup tools/system $(ROOT_DEV) > Image #生成Image文件的命令
  65. sync #使用同步命令迫使缓冲块数据立即写盘并更新超级块。
  66. # disk 目标文件由 Image产生。dd命令:复制一个文件,根据选项进行转换的格式化。
  67. # bs= 表示第一次读/写的字节数。 if= 表示输入的文件。 of= 表示输出到文件。
  68. disk: Image
  69. dd bs=8192 if=Image of=/dev/PS0 #使用dd命令把Image文件写入/dev/PS0(第一个软盘驱动器)
  70. # 编译生成 tools/build 文件
  71. tools/build: tools/build.c
  72. $(CC) $(CFLAGS) \
  73. -o tools/build tools/build.c
  74. # 利用上面给出的 .s.o 规则生成 head.o文件
  75. boot/head.o: boot/head.s
  76. # 编译生成 tools/system文件
  77. tools/system: boot/head.o init/main.o \
  78. $(ARCHIVES) $(DRIVERS) $(MATH) $(LIBS)
  79. $(LD) $(LDFLAGS) boot/head.o init/main.o \
  80. $(ARCHIVES) \
  81. $(DRIVERS) \
  82. $(MATH) \
  83. $(LIBS) \
  84. -o tools/system > System.map
  85. # 生成数学协处理文件,math.a,进入 kernel/math 目录,运行该目录下的makefile。下面的几条命令类似这样。
  86. kernel/math/math.a:
  87. (cd kernel/math; make)
  88. #生成块设备库文件 blk_drv.a,其中含有可重定位目标文件。
  89. kernel/blk_drv/blk_drv.a:
  90. (cd kernel/blk_drv; make)
  91. #生成字符设备函数文件 chr_drv.a
  92. kernel/chr_drv/chr_drv.a:
  93. (cd kernel/chr_drv; make)
  94. #生成内核目标模块 kernel.o
  95. kernel/kernel.o:
  96. (cd kernel; make)
  97. #生成内存管理模块 mm.o
  98. mm/mm.o:
  99. (cd mm; make)
  100. #生成文件系统目标模块fs.o
  101. fs/fs.o:
  102. (cd fs; make)
  103. #生成库函数liba.a
  104. lib/lib.a:
  105. (cd lib; make)
  106. boot/setup: boot/setup.s #这里三行使用8086汇编器和连接器对
  107. $(AS86) -o boot/setup.o boot/setup.s #setup.s 文件进行编译生成setup文件
  108. $(LD86) -s -o boot/setup boot/setup.o # -s 表示去除目标文件中的符号信息
  109. # 同上,生成 bootsect 磁盘引导块
  110. boot/bootsect: boot/bootsect.s
  111. $(AS86) -o boot/bootsect.o boot/bootsect.s
  112. $(LD86) -s -o boot/bootsect boot/bootsect.o
  113. # 在bootsect.s文本程序开始处添加一行有关system模块文件长度信息,在把system模块
  114. # 加载到内存期间用于指明系统模块的长度。方法是是利用命令获取 system模块的大小,并保存
  115. # 在tmp.s 文件中。cut命令用于剪切字符串,tr用于去掉行尾的回车符。(实际长度+15)/16 用于
  116. # 获得"节"表示的长度信息, 1节 = 16 字节。 这是旧版本(0.01-0.10)在使用,新版本已经不用
  117. # 新版本直接在文件中指明了 system的大小。
  118. tmp.s: boot/bootsect.s tools/system
  119. (echo -n "SYSSIZE = (";ls -l tools/system | grep system \
  120. | cut -c25-31 | tr '\012' ' '; echo "+ 15 ) / 16") > tmp.s
  121. cat boot/bootsect.s >> tmp.s
  122. # 执行 make clean 时执以下命令,删除编译链接生成的文件
  123. # rm 是文件删除命令, -f 表示忽略不存在的文件,并且不显示删除信息。
  124. clean:
  125. rm -f Image System.map tmp_make core boot/bootsect boot/setup
  126. rm -f init/*.o tools/system tools/build boot/*.o
  127. (cd mm;make clean) #进入 mm/目录,执行该目录下的makefile文件中的clean规则,下面类似。
  128. (cd fs;make clean)
  129. (cd kernel;make clean)
  130. (cd lib;make clean)
  131. #该规则先执行上面的clean规则,然后对 linux/目录进行压缩,生成 backup.Z 压缩文件。
  132. # cd.. 退到Linux的上一级目录,tar cf - linux 表示对tar 目录 进行压缩。
  133. # |compress 表示将压缩文件通过管道操作传递给压缩程序 compres ,并将程序的输出存成 backup.Z文件。
  134. backup: clean
  135. (cd .. ; tar cf - linux | compress - > backup.Z)
  136. sync #使用同步命令迫使缓冲块数据立即写盘并更新超级块。
  137. # 该目标或规则用于产生各个文件之间的依赖关系,创建这些依赖关系是为了让make 目录用来确定是否需要重建一个目标对象。
  138. # 如某个头文件被改动后,make就能通过生成的依赖关系,重新编译与该头文件相关的所有*.c文件。
  139. # 处理过程如下:
  140. # 使用sed字符串编辑程序对makefile进行处理,输出为makefile中删除了'### Dependencies'后面的所有行,
  141. # 并生成一个临时文件 tmp_make,然后对指定目录(init/)的每一C文件执行gcc预处理操作。
  142. # -M 告诉预处理程序cpp输出描述目标文件相关性的规则,并且这些规则符合make语法,对每一个源文件,预处理程序
  143. # 会输出一个规则,其结果形式就是相应源文件的目标文件加上其依赖关系,即该源文件中包含的所有头文件列表。
  144. # 然后把预处理结果都添加到临时文件 tmp_make 中,最后再把这个临时文件复制成新的Makefile文件。
  145. # "$$i" 实际上是'$($i)'
  146. dep:
  147. sed '/\#\#\# Dependencies/q' < Makefile > tmp_make
  148. (for i in init/*.c;do echo -n "init/";$(CPP) -M $$i;done) >> tmp_make
  149. cp tmp_make Makefile
  150. (cd fs; make dep) #对fs目录下的makefile也做同样处理,下面类似。
  151. (cd kernel; make dep)
  152. (cd mm; make dep)
  153. # main.o 的依赖文件
  154. ### Dependencies:
  155. init/main.o : init/main.c include/unistd.h include/sys/stat.h \
  156. include/sys/types.h include/sys/times.h include/sys/utsname.h \
  157. include/utime.h include/time.h include/linux/tty.h include/termios.h \
  158. include/linux/sched.h include/linux/head.h include/linux/fs.h \
  159. include/linux/mm.h include/signal.h include/asm/system.h include/asm/io.h \
  160. include/stddef.h include/stdarg.h include/fcntl.h

Linux内核0.11 makefile文件说明的更多相关文章

  1. Linux内核0.11 setup文件说明

    一.总体功能介绍 这是关于Linux-kernel-0.11中boot文件夹下setup.s源文件的实现功能的总结说明. setup.s是一个操作系统加载程序,它的主要功能是利用BIOS中断读取机器系 ...

  2. Linux内核0.11 bootsect文件说明

    一.总体功能介绍 这是关于Linux-kernel-0.11中boot文件夹下bootsect.s源文件的说明,其中涉及到了一些基础知识可以参考这两篇文章. 操作系统启动过程 软盘相关知识和通过BIO ...

  3. Linux内核0.11体系结构 ——《Linux内核完全注释》笔记打卡

    0 总体介绍 一个完整的操作系统主要由4部分组成:硬件.操作系统内核.操作系统服务和用户应用程序,如图0.1所示.操作系统内核程序主要用于对硬件资源的抽象和访问调度. 图0.1 操作系统组成部分 内核 ...

  4. Linux内核0.11代码阅读(转)

    最近决定开始阅读Linux 0.11的源代码. 学习Linux操作系统的核心概念最好的方法莫过于阅读源代码.而Linux当前最新的源代码包已经有70MB左右,代码十分庞大,要想深入阅读十分困难.而Li ...

  5. 在windows下解压缩Linux内核源代码出现重复文件原因

    在windows下解压缩Linux内核源代码出现重复文件原因 2009年06月30日 13:35 来源:ChinaUnix博客 作者:embededgood 编辑:周荣茂     原因一.因为在Lin ...

  6. Linux内核访问用户空间文件:get_fs()/set_fs()的使用

    测试环境:Ubuntu 14.04+Kernel 4.4.0-31 关键词:KERNEL_DS.USER_DS.get_fs().set_fs().addr_limit.access_ok. 参考代码 ...

  7. linux内核驱动中对文件的读写 【转】

    本文转载自:http://blog.chinaunix.net/uid-13059007-id-5766941.html 有时候需要在Linux kernel--大多是在需要调试的驱动程序--中读写文 ...

  8. Linux mysql8.0.11安装

    准备:检查是否已安装过mysql,若有便删除(linux系统自带的) rpm -qa | grep mariadb rpm -e nodeps mariadb-libs-5.5.56-2.el7.x8 ...

  9. Linux内核3.11的socket busy poll机制避免睡眠切换

    Linux的网络协议栈很独立,上下通过两个接口分别和用户态以及设备相连.也能够看作是北向和南向接口...北向通过socket接口,南向通过qdisc接口(你能够觉得是上层的netdev queue,对 ...

随机推荐

  1. codeforces 914 D 线段树+数学

    题意 给出一个长度为\(n\)的数列\(a\),两种询问,第一种给出三个数\(l,r,x\),区间\([l,r]\)的\(gcd\)值是否和\(x\)相似,若最多改变区间\([l,r]\)中的一个数使 ...

  2. 洛谷 P1337 [JSOI2004]平衡点 / 吊打XXX

    洛谷 P1337 [JSOI2004]平衡点 / 吊打XXX 点击进入FakeHu的模拟退火博客 神仙模拟退火...去看fakehu的博客吧...懒得写了... 因为精度问题要在求得的最优解附近(大约 ...

  3. MySQL中类型后面的数字含义

    形式:类型(m) 1.整数型的数值类型已经限制了取值范围,有符号整型和无符号整型都有,而M值并不代表可以存储的数值字符长度,它代表的是数据在显示时显示的最小长度,当存储的字符长度超过M值时,没有任何的 ...

  4. JDBC连接数据库及其执行操作

    作者:Alvin 功能:数据库连接与实现增删改查 时间:2019年3月4日08点33分 参考文章:https://www.2cto.com/database/201805/743741.html 一. ...

  5. python模块-datetime模块

    上面一篇已经讲了time模块,再来学习datetime模块. datetime主要有datetime.timedelta.time.date这4个子模块. a.datetime常用的函数(dateti ...

  6. nginx 配置 ssl 双向证书

    CA 根证书制作 # 创建 CA 私钥 openssl genrsa -out ca.key 2048 #制作 CA 根证书(公钥) openssl req -new -x509 -days 3650 ...

  7. How to create a custom action type with a custom control (BarCheckItem), associated with it

    https://www.devexpress.com/Support/Center/Example/Details/E1977/how-to-create-a-custom-action-type-w ...

  8. buglly热更新集成遇到的那些坑

    首先说明使用热修复的意义,那就是你的apk包发出去了,万一发生了紧急异常需要修复,怎么办?这时候再发包上市场审核,也是有点慢了吧?而且错误发生在apk中,无法通过后台接口修复,这时候你就需要一个强大的 ...

  9. c语言数字图像处理(六):二维离散傅里叶变换

    基础知识 复数表示 C = R + jI 极坐标:C = |C|(cosθ + jsinθ) 欧拉公式:C = |C|ejθ 有关更多的时域与复频域的知识可以学习复变函数与积分变换,本篇文章只给出DF ...

  10. Python中remove,pop,del的区别

    先上题:写出最终打印的结果 a = [1, 2, 3, 4] for x in a: a.remove(x) print(a) print("=" * 20) b = [1, 2, ...