Chinaunix首页 | 论坛 | 博客
  • 博客访问: 57019
  • 博文数量: 11
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 123
  • 用 户 组: 普通用户
  • 注册时间: 2014-08-30 17:10
个人简介

半路出家者.学习蜗牛,向着嵌入式软件开发的金字塔顶一步步迈进!

文章分类

全部博文(11)

文章存档

2017年(1)

2016年(3)

2015年(1)

2014年(6)

我的朋友

分类: 嵌入式

2014-12-27 15:40:56

      在嵌入式开发中,增加内核系统调用虽然极少涉及到,但是我们掌握了这个过程,对于开发者更深入的了解内核,了解应用层和内核通信的过程是非常有帮助的。
一、先简单介绍一下添加系统调用的步骤:
    1:内核空间要做的事情(没有先后顺序)
    (1)在arch/arm/include/asm/unistd.h(本人开发主机的目录)中添加一个新的系统调用号。
    (2)在arch/arm/kernel/call.S(系统调用表)中添加一个新项。
    (3)在arch/arm/kernel/sys_arm.c中添加一个内核函数的实现,类似sys_write.
    2:用户空间要做的事情
linux系统提供了一个系统调用函数syscall来帮助程序员完成:保存系统调用号到R7寄存器中,然后调用SVC触发软中断的工作。
函数原型为:
int syscall(int number,...);
返回值就是系统调用号对应的函数的返回值,如果出错一律返回-1;
number:系统调用号;
...系统调用号对应的函数的参数;
二、下面以我的开发环境为例,介绍一个简单的添加系统调用的过程。
1.首先进入内核源码的根目录 cd /opt/kernel
2.执行"vim arch/arm/kernel/sys_arm.c",在文件最后添加
asmlinkage int sys_add(int x,int y)
{
    printk("call sys_add\n");
    return x+y;
}//加法函数实现
3.执行“vi arch/arm/include/asm/unistd.h”,在“#define __NR_recvmmsg        (__NR_SYSCALL_BASE+365)”后增加如下代码:
#define __NR_add        (__NR_SYSCALL_BASE+366) //添加新的系统调用号
4.执行“vim arch/arm/kernel/call.S”,在“/*365*/        CALL(sys_recvmmsg)”后增加 “CALL(sys_add)”. //在系统调用表中添加一 个新项
5.在内核源码根目录下执行make zImage
6.拷贝生成的镜像文件到tftp目录下 cp /arch/arm/boot/zImage   /tftpboot/     ------用新内核重新引导系统
7.创建测试用例,生成可执行文件
8.把可执行文件拷贝到NFS目录下
9.在开发板上执行。






阅读(2291) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~