1.编译内核
想要编译内核,首先需要先下载内核源代码。可以在官方网站下载源代码压缩包,然后放在Ubuntu的目录下,然后解压(解压的指令为:sudo tar -xvf xxxx.gz)。解压之后在当前目录下可以看到解压之后的文件夹。
编译步骤:
1.复制默认配置文件给 .config:在内核源代码中找到适合自己开发板版本的源代码。然后将默认的配置文件复制给.config。在.config文件中存放着关于需要编译文件的配置信息。
提示:因为Linux内核的功能是很多的,所有有很多的源文件,我们想要根据自己想要实现的功能对那部分功能的代码进行编译即可。所以可以选择需要编译的文件,但是因为整个Linux内核文件的数量是在是太多,我们无法一个一个文件去寻找我们所需要的文件,所以在makefile中关于关于目标文件的写法是:obj-$(CONFIG_TEST) + = test.o。正常的makefile中是没有这个$(CONFIG_TEST)的。这个就是.config中的配置信息了。在每一层目录下,都有一个Makefile和一个Kconfig.Makefile中存放这该目录下所有文件的这个 obj-$(CONFIG_TEST),而Kconfig就是用来保存这个CONFIG_TEST的。CONFIG_TEST的值为y/n,则表示这个文件是否需要被编译。简单的说就是,makefile中保存所有文件,而文件是否需要被编译则是由Kconfig中的值来决定的。而最终的所有文件的编译与否,都是保存在.config这个文件中的。
2.通过make menuconfig这个可视化程序来配置哪些文件是需要编译的。退出的时候会保存这配置信息到.config中。
提示:make menuconfig又被称为内核活地图。若是我们想要修改某个功能,但是不知道这个功能的文件存放在哪个地方,可以在这个里面进行查找,然后就能找到这个文件所在的位置。需要注意的是,若是添加或删除某个Kconfig中的配置信息之后,一定要记得make menuconfig进行保存。还有就是,这个make menuconfig只能在内核的最高目录之下打开。
3.编译内核:make uImage。
整个编译的过程是:先生成image映像文件,这个文件是可以直接执行的内核程序。然后是将image文件压缩生成zimage文件。这个是image的压缩文件,这个文件的组成是一段解压程序+压缩后的image文件。最后是将zimage文件加上64字节的头信息后生成uImage文件。我们使用的是带头信息的uImage文件。
在项目中首次编译的时候,会报错。这个错误是:define(xxxxx)类似这个样子的话。需要在kernel timeconst.pl中去将这一行的内容注释掉。
在每次将内核编译完成之后,都需要将这个uImage文件复制到 tftpboot文件夹之下。不然开发板每次同构Ubuntu获得的内核程序都是未修改的。
当将uImage放到tftpboot之后,开发板在运行uboot程序时使用 tftp 0x30008000 uImage将这个内核程序下载到内存上之后,bootm 0x30008000之后会出错,无法正确运行kernel。会出现undefined instruction的错误提示。出现这个问题是因为我们编译之后的uImage程序是包含64字节头信息的内核程序,而我们执行bootm 0x30008000的时候,pc是指向uImage的头信息开始执行的,所以会出现undefined instruction。我们需要让pc从0x30008040开始执行。想要让程序从这里执行,需要在arch/arm/boot/Makefile中修改:
修改之后重新编译uImage.
2.将文件添加到Linux内核中
将自己的.c文件放在对应目录下,在该目录下的makefile中添加上该.c文件的obj.然后在Kconfig中添加对应的配置文件。然后在内核文件的最高目录下make menuconfig ,保存配置。然后再编译uImage。
3.相对跳转/绝对跳转。
地址相关代码
地址无关代码
加载地址;链接地址。