树莓派论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1662|回复: 0
收起左侧

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

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

2、连接树莓派,获取config文件
  1. sudo zcat /proc/config.gz > .config
复制代码
  1. <span style="background-color: rgb(255, 255, 255); ">scp pi@222.205.48.188:/home/pi/kernel/linux/.config</span>
复制代码
  1. make ARCH=arm CROSS_COMPILE=/usr/bin/arm-linux-gnueabi- oldconfig
复制代码
1.png
3、增加系统调用

在linux/arch/arm/kernel/目录下新建mysyscall.c文件

  1. #include <linux/kernel.h>
  2. void mysyscall(void) {
  3.         printk("This is a new system call!haha!\n");
  4. }
复制代码
在linux/arch/arm/kernel/call.S中添加新的系统调用
2.png
修改arch/arm/kernel/目录下的Make&#64257;le文件,在obj-y后面添加mysyscall.o
3.png
在顶层Linux目录下编译新内核:
  1. make ARCH=arm CROSS_COMPILE=/usr/bin/arm-linux-gnueabi- -k
复制代码
编译module lib文件

在linux的上层目录新建modules文件夹,进入linux内核代码所在文件夹,执行下面语句编译

  1. make modules_install ARCH=arm CROSS_COMPILE=/usr/bin/arm-linux-gnueabi- INSTALL_MOD_PATH=../modules
复制代码
备份原firmware文件
  1. mkdir firmware_old
  2. cd /boot/
  3. cp *.elf *.bin ~/kernel/firmware_old/
复制代码
将以下新的内核文件通过scp放入树莓派目录
  1. linux/arch/arm/boot/Image ——》/boot/kernel_new.img
  2. modules/lib ——》 /
  3. cd firmware/boot
  4. bootcode.bin fixup.dat fixup_cd.dat start.elf ——》 /boot (这些文件若没有需要从文章首部的github/firmware下载)
复制代码
4.png
5.png 6.png
修改树莓派的启动配置文件
  1. sudo nano /boot/config.txt
复制代码
在首行修改为“kernel=kernel_new.img”。


4、重启测试

输入命令查看内核版本

  1. uname -a
复制代码
7.png

可见内核版本已经升级为3.6.11


编写函数调用

  1. #include <stdio.h>
  2. #define sys_call() {__asm__ __volatile__ ("swi 0x900000+223\n\t");} while(0)

  3. int main(void) {
  4.     sys_call();
  5.     printf("Type "dmesg | tail" to see the result.\n");

  6.     return 0;
  7. }
复制代码
编译运行:
8.png
输入dmesg | tail查看结果:
9.png
函数调用已经成功添加。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|树莓派论坛 ( 粤ICP备15075382号-1  

GMT+8, 2024-11-26 01:47 , Processed in 1.187500 second(s), 28 queries , Gzip On.

Powered by Shumeipai.net! X3.2

© 2001-2015 树莓派论坛安全联盟

快速回复 返回顶部 返回列表