给树莓派增加一个Linux系统调用

Lab 4: Add a system call to raspberry Pi

@ZJU.ES@FM

参考和感谢:

http://aguegu.net/?p=1544

http://www.neohe.tk/raspberrypi-add-linux-syscall/


1.下载编译工具、Kernel源文件、固件 Firmware

$ mkdir rpi
$ cd rpi
$ git clone git://github.com/raspberrypi/firmware.git PRiFirmware
$ git clone git://github.com/raspberrypi/linux.git RpiLinux
$ git clone git://github.com/raspberrypi/tools.git RpiTools

下载需要不少时间,需要网络稳定些

2.获取当前Kernel的.config文件,并进行自定义的配置

config.gz的路径是rpi下的/proc/config.gz,复制到新内核源码的根目录(即RpiLinux),执行:

sudo zcat config.gz > .config
make ARCH=arm CROSS_COMPILE=../RpiTools/arm-bcm2708/arm-bcm2708hardfp-linux-gnueabi/bin/arm-bcm2708hardfp-linux-gnueabi- oldconfig
一路回车即可完成配置。注:如果之前已经进行过编译,需要执行make mrproper进行清理,再执行以上两步。


3.增加新的系统调用

在arch/arm/kernel/目录下新建mysyscall.c文件,输入以下内容


在linux/arch/arm/kernel/calls.S中添加新的系统调用,这里我替换的是原本为sys_ni_syscall的0×900000+223号系统调用,这是因为223号是3.6.6内核默认未使用的。如下图所示。

修改arch/arm/kernel/目录下的Makefile文件,在obj-y后面添加mysyscall.o,如下图。

4.编译内核

$ make ARCH=arm CROSS_COMPILE=../RpiTools/arm-bcm2708/arm-bcm2708hardfp-linux-gnueabi/bin/arm-bcm2708hardfp-linux-gnueabi- -k -j2

这里使用两个线程编译节省时间。



arch/arm/boot/zImage 就是我们所编译获得的文件。zImage 是 Compressed kernel image 文件,要转换为 kernel.img 还需要进一步处理。
$ cd ../RpiTools/mkimage/
$ ./imagetool-uncompressed.py ../../RpiLinux/arch/arm/boot/zImage





5.编译新lib

$ cd ../..
$ mkdir modules
$ cd RpiLinux/
$ make modules_install ARCH=arm CROSS_COMPILE=../RpiTools/arm-bcm2708/arm-bcm2708hardfp-linux-gnueabi/bin/arm-bcm2708hardfp-linux-gnueabi- INSTALL_MOD_PATH=../modules



6.备份 firmware


挂载rpi的sd卡后可以发现有了sdx,它的两个分区为sdx1,sdx2,对应分别对应RPi的“/boot”和“/”
将/boot下的*.elf *.bin备份收好了
编译/boot/config.txt,在首行加入kernel=kernel_new.img这样系统就会引导到我们要拷入的kernel_new.img

7.升级内核、lib和firmware

将RpiTools/mkimage/kernel.img重命名为kernel_new.img,复制到sd卡/boot下
将RPiFirameware/boot下的bootcode.bin fixup.dat fixup_cd.dat start.elf复制到sd卡/boot下
将PRiFirmware/hardfp/opt下的vc复制到sd卡/opt下
将rpi下modules下的lib复制到sd卡/下

8.重启树莓派



9.编写测试程序调用新的系统调用:

#include <stdio.h>
#define sys_hello() {__asm__ __volatile__ ("swi 0x900000+223\n\t");} while(0)
int main(void) {
	sys_hello();
	printf("Type \"dmesg | tail\" to see the result.\n");

	return 0;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值