计算机内核学习

本文深入探讨计算机内核的学习,重点解析文件结构和内核的编译流程。首先介绍了内核的文件组织,包括Makefile中的关键指令,如realclean、everything和clean。接着详细说明了如何构建最终的a.img,该文件包含boot.bin、loader.bin和kernel.bin。编译过程中,asm文件依赖.nasm头文件,c文件依赖.h头文件,使用nasm和gcc进行编译,并通过-I指定头文件路径。
摘要由CSDN通过智能技术生成

1. 文件结构

前言:
内核的文件树如下所示:
在这里插入图片描述
编译文件如下:

# All Phony Targets
.PHONY : everything final image clean realclean disasm all buildimg

# Default starting position
everything : $(TINIXBOOT) $(TINIXKERNEL)

all : realclean everything

final : all clean

image : final buildimg

clean :
	rm -f $(OBJS)

realclean :
	rm -f $(OBJS) $(TINIXBOOT) $(TINIXKERNEL)

disasm :
	$(DASM) $(DASMFLAGS) $(TINIXKERNEL) > $(DASMOUTPUT)

# Write "boot.bin" & "loader.bin" into floppy image "TINIX.IMG"
# We assume that "TINIX.IMG" exists in current folder
buildimg :
	dd if=boot/boot.bin of=TINIX.img bs=512 count=1 conv=notrunc
	mount TINIX.IMG /mnt/floppy -o loop
	cp -f boot/loader.bin /mnt/floppy/
	cp -f kernel.bin /mnt/floppy
	umount  /mnt/floppy

boot/boot.bin : boot/boot.asm boot/include/load.inc boot/include/fat12hdr.inc
	$(ASM) $(ASMBFLAGS) -o $@ $<

boot/loader.bin : boot/loader.asm boot/include/load.inc boot/include/fat12hdr.inc boot/include/pm.inc
	$(ASM) $(ASMBFLAGS) -o $@ $<

$(TINIXKERNEL) : $(OBJS)
	$(LD) $(LDFLAGS) -o $(TINIXKERNEL) $(OBJS)

kernel/kernel.o : kernel/kernel.asm include/sconst.inc
	$(ASM) $(ASMKFLAGS) -o $@ $<

kernel/start.o: kernel/start.c include/type.h include/const.h include/protect.h include/string.h include/proc.h include/proto.h \
			include/global.h
	$(CC) $(CFLAGS) -o $@ $<
  • Makefile 里面主要有:
  1. image: realclean everything clean buildimg
  2. realclean: 清空。 rm 中间产物 OBJS + 最后的三个产物
  3. everything: 产生最后的三个产物 boot.bin loader.bin kernel.bin
  4. clean:清空中间产物 OBJS
  5. buildimg:
    1. 建立一个 img 把 boot.bin 写到 img 的前 512 字节
    2. 用 mount 指令挂载 img
    3. 把 loader.bin kernel.bin 加载到挂载 img 所在目录中
    4. 用 unmount 指令解挂载 img
  • 这样形成的 a.img(1.44M fat12 格式)
    前 512 字节包含了 boot.bin ;数据区中有 loader.bin 以及 kernel.bin 文件

  • 详细说一下 everything 中三个最后产物到底如何形成的。
    首先我们要明确

    1. asm 利用的头文件是.inc
    2. c 利用的头文件是.h
    3. asm 的文件编译都需要 nasm
    4. c 文件的编译都需要 gcc
  • 对于 nasm 以及 gcc 后面都对应的-I 然后一个目录,另外两个参数是源文件和目标文件,
    中间的目录代表我们编译所需要的头文件从哪里取出。

2.内核内容

译 者 序 当着手翻译这本书时,我不由得回想起开始接触Linux的那段日子。 几年前,我们拿到Linux内核代码开始研究时,可以说茫然无措。其规模之大,叫“覆压三百余里,隔 离天日”似乎不为过;其关系错综复杂,叫“廊腰缦回,檐牙高啄,各抱地势,勾心斗角”也不言过其实; 阿房宫在规模和结构上给人的震撼,可能与Linux有异曲同工之妙。“楚人一炬,可怜焦土”,可能正是因 为它的结构和规模,阿房宫在中国两千多年盛极的封建历史中终于没有再现,只能叫后人扼腕叹息;但是, Linux却实实在在的矗立在我们面前,当我们徘徊在这宏伟宫殿之前时,或许,我们也需要火炬——不是用 来毁灭,而是为了照亮勇者脚下的征途。 Linus Torvalds在我们面前展现的Linux魔法卷轴,让我们的视野进入一个自由而开放的新世界。自由 意味着自我价值的实现,开放代表着团结协作的理想,这对于从没把握过核心操作系统的中国人来说,无 疑点燃起了心中的梦想。于是,许多人毫不犹豫地走进来了,希望深入到那散发自由光彩、由众人团结协力 搭造起的殿堂。但是很快,不少人退缩了。面对这样一个汪洋大海,有的人迷惑了,出海的航道在哪里?有 的人倒下了,漫漫征途何时是尽头?我常常想,如果那时他们手中就有这本书的话… Daniel P.Bovet和Marco Cesati携手,为我们打造了这本鸿篇巨著,自此我们有了火把,有了航海图, 于是我们就有了彼岸,有了航道,也有了补给码头。不是吗,中断虽繁,但第四、六两章切中肯綮地剖析, 肯定能让你神清气爽;内存管理虽难,但多达三章细致入微的说理,一定会让你茅斯顿开。而内容的组织更 是别具匠心,每章开始部分一般性原理的描述,打破知识的局限,将每个部分的全景展现在你面前。而针对 每个知识点,落到实处的独到分析,又会使你沉迷于知识的融会贯通之中。第三版对Linux2.6的全面描述, 会使你为2.4与2.6之间的沟壑而感叹,但请放心,你曾从Linux旧版本获取的点滴依然是你前进的基石。总 之,你面对的不再是赤裸裸的代码,而是真正能雅俗共赏的艺术。 对整个Linux社区来说,这绝不是微末的贡献而已,连Andre Morton都已经指出:“内核学习曲线 变得越来越长,也越来越陡峭。系统规模不断扩大,复杂程度不断提高。长此以往,虽然现在这一拨内核开 发者对内核的掌握越发炉火纯青,但却会造成新手无法跟上内核发展步伐,出现青黄不接的断层”。而这本 书的目的,无疑于此吻合。按照这本书指明的道路,我们可以躲过暗礁,绕过险滩,穿过逆流,勇往直前。 这也是为什么这本书总在Linux书籍排行榜中稳居前列的原因之一。 不过,除非行动,否则地图再好,也不会让人向自己的目标迈进半步。所以,在读书的同时,你还一定 要亲身实践:理解内核某部分的捷径就是对它做些修改,这样你才能越过代码本身看到内核深层机理。 Linux是一个全新的世界,世界意味着博大精深,而新或许代表对旧的割舍和扬弃,加在一起,就是要 我们在割舍和扬弃的同时还要积累知识到博大精深的地步,这容易做到吗?是的,这不容易做到。Gerald M. Weinberg在《Becoming a Technical Leader: An Organic Problem-Solving Approach》一书中总结成长为高 原-低谷模式:“成长是跳跃式的,要经过量的积累,在积累的过程中,往往要伴随着扬弃,所以常常会跌 入低谷”。面对Linux这个需要长期孜孜以求的学习对象,无疑这种震荡会加重我们的疑虑,降低我们的信 心,消磨我们的意志,使我们轻易的认为达到了自己的成长上限。 根据我们的经验,这需要系统思考来改变心智模式,最好有一个学习型组织来提供帮助:团队是学习 的最佳单位。(可以参看彼得.圣吉的《第五项修炼》,这本书值得有心改变自己,并进而改善周围世界的人一 读再读)所以,我们希望结合这本《深入理解Linux内核》,创造这样的一个氛围,一种环境。为此在 www.KernelTravel.net 建立了中文网站“内核之旅”,不但有一些有价值的资料,而且我们会把这些资料按 照学习路径组织起来,让它们真正伴随内核学习者前进。 阅读本书,需要一份耐心,更需要一份执着。当你闯过一道道难关,阅读到本书的最后一章时,会有“ 蓦然回首,那人却在灯火阑珊处”的感觉!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值