made by Rk
本文由浙江大学《嵌入式系统》课程提供强力支持。
感谢翁恺老师 @翁恺BA5AG
/*************************************************************/
参见《为Ubuntu Linux 3.6.8添加系统调用》:http://blog.csdn.net/rk2900/article/details/8281335
以及《树莓派搭建交叉编译环境》:http://blog.csdn.net/rk2900/article/details/8738442
由于clone速度太慢…最终我下载了gzip包解压。mkdir kernel cd kernel git clone https://github.com/raspberrypi/linux.git git clone https://github.com/raspberrypi/firmware.git
sudo zcat /proc/config.gz > .config
scp [email protected]:/home/pi/kernel/linux/.config .
配置config
make ARCH=arm CROSS_COMPILE=/usr/bin/arm-linux-gnueabi- oldconfig
在linux/arch/arm/kernel/目录下新建mysyscall.c文件
#include <linux/kernel.h> void mysyscall(void) { printk("This is a new system call!haha!\n"); }
修改arch/arm/kernel/目录下的Makefile文件,在obj-y后面添加mysyscall.o
在顶层Linux目录下编译新内核:
make ARCH=arm CROSS_COMPILE=/usr/bin/arm-linux-gnueabi- -k
在linux的上层目录新建modules文件夹,进入linux内核代码所在文件夹,执行下面语句编译
make modules_install ARCH=arm CROSS_COMPILE=/usr/bin/arm-linux-gnueabi- INSTALL_MOD_PATH=../modules
mkdir firmware_old cd /boot/ cp *.elf *.bin ~/kernel/firmware_old/
linux/arch/arm/boot/Image ——》/boot/kernel_new.img modules/lib ——》 / cd firmware/boot bootcode.bin fixup.dat fixup_cd.dat start.elf ——》 /boot (这些文件若没有需要从文章首部的github/firmware下载)
修改树莓派的启动配置文件
sudo nano /boot/config.txt
输入命令查看内核版本
uname -a
可见内核版本已经升级为3.6.11
编写函数调用
#include <stdio.h> #define sys_call() {__asm__ __volatile__ ("swi 0x900000+223\n\t");} while(0) int main(void) { sys_call(); printf("Type \"dmesg | tail\" to see the result.\n"); return 0; }
输入dmesg | tail查看结果:
函数调用已经成功添加。