树老大 发表于 2013-5-26 12:10:48

树莓派上为内核添加系统调用(转载)

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
1、下载内核源代码<p>mkdir kernel
cd kernel
git clone https://github.com/raspberrypi/linux.git
git clone https://github.com/raspberrypi/firmware.git
</p>由于clone速度太慢…最终我下载了gzip包解压。

2、连接树莓派,获取config文件sudo zcat /proc/config.gz > .config<span style="background-color: rgb(255, 255, 255); ">scp pi@222.205.48.188:/home/pi/kernel/linux/.config</span>
make ARCH=arm CROSS_COMPILE=/usr/bin/arm-linux-gnueabi- oldconfig
3、增加系统调用在linux/arch/arm/kernel/目录下新建mysyscall.c文件#include <linux/kernel.h>
void mysyscall(void) {
        printk("This is a new system call!haha!\n");
}在linux/arch/arm/kernel/call.S中添加新的系统调用

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

在顶层Linux目录下编译新内核:make ARCH=arm CROSS_COMPILE=/usr/bin/arm-linux-gnueabi- -k编译module lib文件
在linux的上层目录新建modules文件夹,进入linux内核代码所在文件夹,执行下面语句编译make modules_install ARCH=arm CROSS_COMPILE=/usr/bin/arm-linux-gnueabi- INSTALL_MOD_PATH=../modules备份原firmware文件mkdir firmware_old
cd /boot/
cp *.elf *.bin ~/kernel/firmware_old/将以下新的内核文件通过scp放入树莓派目录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在首行修改为“kernel=kernel_new.img”。


4、重启测试输入命令查看内核版本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查看结果:

函数调用已经成功添加。
页: [1]
查看完整版本: 树莓派上为内核添加系统调用(转载)