给树莓派增加一个Linux系统调用
来源:互联网 发布:高新区行知小学地址 编辑:程序博客网 时间:2024/05/01 03:05
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;}
- 给树莓派增加一个Linux系统调用
- 树莓派实验四: 增加一个linux系统调用
- Lab4_1树莓派上增加一个Linux系统调用
- 阅读笔记:如何给OpenSolaris增加一个系统调用
- Linux增加系统调用
- 如何在Linux内核里增加一个系统调用
- 如何在Linux内核里增加一个系统调用
- linux内核增加一个系统调用的方法
- Linux之使用内核模块增加一个系统调用
- Ubuntu增加一个系统调用
- 给linux添加一个系统调用(linux-4.10.1)
- Linux内核增加系统调用
- linux内核增加系统调用
- linux内核增加系统调用
- 给webkit增加一个系统事件
- 给树莓派系统增加看门狗
- 给linux添加系统调用
- 修改Linux内核增加系统调用
- Python多线程操作
- Letter Combinations of a Phone Number
- linux下遍历目录树方法总结(下)
- Android备用知识
- 赢在测试2:中国软件测试专家访谈录
- 给树莓派增加一个Linux系统调用
- java高级工程师---------spring的知识重点
- opencv(一):VC6.0下安装与配置OpenCV1.0
- 动态设置滚动条高度宽度的方法[非润乾知识库方法]
- gsensor架构和原理分析
- Magic C++ (函数指针)(xml配置控件样式)
- POJ 动态规划题目列表
- Java之美[从菜鸟到高手演变]之Java学习方法
- busybox1-17.2编译出错