一、实验目的
探索RPI的内核
二、实验内容
修改RPi上的Linux源码,增加一个带参数的系统调用。
三、主要仪器设备
1. RPI 1个(配有电源线、组装塑料外壳、以及一根装用的串口线)
2. 8G大小的SD卡 1张
3. 操作系统为Windows7的笔记本电脑1台
四、操作方法和实验步骤
1. 下载并解压缩linux源代码到ubuntu桌面
具体的下载地址为:
https://github.com/raspberrypi/linux/archive/rpi-3.6.y.zip
下图为解压缩后的桌面部分截图
二、 编写自己的系统调用
进入linux-rpi-3.6.y/arch/arm/kernel,建立testcall.c文件
内容如下
修改makefile(在obj-y后面添加testcall.o)如下
修改calls.h
三. 安装交叉编译器
用以下命令安装所需软件:
apt-get install gcc-arm-linux-gnueabi make ncurses-dev
查看编译器路径:
设置环境变量
若要进行配置则用以下命令进入如下图所示界面:
make ARCH=arm CROSS_COMPILE=${CCPREFIX} menuconfig
四、编译内核
用以下命令来编译内核,编译完后如下图所示
make ARCH=arm CROSS_COMPILE=${CCPREFIX} -j4
用以下命令编译模块,如下图所示
make ARCH=arm CROSS_COMPILE=${CCPREFIX} modules
查看/arch/arm/boot路径下生成的Image
五、 树莓派配置新生成内核
用scp将上面生成的img文件拷贝到树莓派/boot目录,并改名为testkernel.img
并且在config.txt后加上kernel=testkernel.img,文件如下
…… Core_freq=250 Sdram_freq=400 Over_voltage=0 Kernel=testkernel.img |
把编译好的模块替换原来的lib
第一步先创建一个临时文件存放模块
设置一个环境变量方便安装
在linux-rpi-3.6.y目录下执行如下命令
此时查看树莓派lib文件夹下将发现一条
Drwxr-xr-x 4 root root 4096 4月26 22:11 modules |
修改时间就是刚才
六、测试系统调用
编写测试代码mytest.c如下
#define sys_testcall(){__asm__ __volatile__ ("swi 0x900000+223\n\t");}while(0)
#include <stdio.h>
Void main(){ sys_testcall(); } |
编译代码
gcc mytest.c -o mytest
用dmesg查看内核日志,显示如下
…… 12.815243] bcm2835 ALSA chip created! …… 27.224751] PPP generic driver version 2.4.2 …… 782.722509] my hello syscall! |
本次实验首先让我回顾复习了操作系统实验课上关于内核编译的一些问题,其次就是在树莓派板上将这些知识充分的利用发挥,受益匪浅!