嵌入式LAB 6:Linux内核编译

时间:2021-11-20 12:43:37

前期工作准备

Mac OS X + Ubuntu14.04虚拟机
安装交叉编译工具
适合树莓派的Linux内核

器材准备

树莓派
外接显示屏

实验步骤

1、寻找、下载Linux实验板卡所用的Linux内核源码

从github上,把内核源代码克隆下来。地址如下:
https://github.com/raspberrypi/linux.git
为了达到一致的效果,我选用了和教程一样的3.18版本。

嵌入式LAB 6:Linux内核编译

2、在内核中加入新的系统调用,具体功能没有要求,能输出调试信息即可

添加系统调用
嵌入式LAB 6:Linux内核编译

系统调用实际上是调用内核某个函数的过程。所以,为了告诉操作系统什么时候该用什么函数,需要在内核中进行一些修改。首先,你需要在内核中有一个这样的可执行的函数。在arch/arm/kernel中新建一个sys_mysyscall.c文件,只包含一个函数,其作用为在运行后输出一条内核日志。

修改Makefile中的obj-y字段,将sys_mysyscall.o加入目标文件中。即将该函数纳入系统的编译进程。
嵌入式LAB 6:Linux内核编译

而后,你需要让操作系统知道这个函数是处理某个系统调用的函数。此时,需要修改系统的中断向量表。此时需要修改arch/arm/kernel/calls.S文件。
嵌入式LAB 6:Linux内核编译

在include/uapi/asm-generic/unistd.h头文件中将223号调用与某个宏进行关联,在syscall()中注册一个位置,方便调用。接下来就可以开始编译了。

3、修改内核代码配置,编译内核

嵌入式LAB 6:Linux内核编译

首先是config文件,可以使用现在树莓派上使用的config文件进行编译,树莓派上的配置文件是/proc/config.gz,使用zcat命令可以直接查看。而按照官方教程,源码包内有相关配置可以直接拿来使用。这里我直接通过命令进行配置.config文件,就不直接从树莓派上下载下来了。

嵌入式LAB 6:Linux内核编译

下面可以开始编译了。编译方式如上图所示。编译期间出过几次错误,不过都能够顺利地解决。

4、将编译好的内核装载到板卡启动。

编译完成之后就是安装,如果烧录了树莓派官方给出的SDcard镜像,那么现在你的SD卡分区长这样。SDcard使用读卡器接入电脑。SDCard有两个分区,一个是boot区,格式是fat32,大小仅有数十兆。一个是ext4区,需要挂在到磁盘上。学长的博客上有很多教程。我们只需要写一个脚本就好。

嵌入式LAB 6:Linux内核编译

做好之后,我们就可以把内核移植到树莓派上,并开机了。
嵌入式LAB 6:Linux内核编译

5、编写C代码,用两种方法做系统调用,测试:

嵌入式LAB 6:Linux内核编译

嵌入式LAB 6:Linux内核编译

用上述两种方式进行系统调用,结果如下图所示:

嵌入式LAB 6:Linux内核编译

6、编写内核模块,在模块加载和卸载时能通过内核打印函数输出提示信息

嵌入式LAB 6:Linux内核编译