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、重启测试输入命令查看内核版本
可见内核版本已经升级为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查看结果:
函数调用已经成功添加。
|