Linux嵌入式 -- 内核 - 系统调用

1. 系统调用 定义

Linux内核中设置了一组用于实现各种系统功能的子程序,称为系统调用。用户可以通过系统调用命令在自己的应用程序中调用它们。

系统调用和普通的函数调用非常相似,区别仅仅在于,系统调用由操作系统内核实现,运行于内核态;而普通的函数调用由函数库或用户自己提供,运行于用户态。


2. 系统调用原理

#include<time.h>
main()
{
time_t the_time;
the_time=time((time_t *)0);/*调用time系统调用*/
printf("The time is %ld\n",the_time);
} /* 从格林尼治时间1970年1月1日0:00开始到现在的秒数。 */

工作原理 :一般情况下,用户进程是不能访问内核的。它既不能访问内核所在的内存空间,也不能调用内核中的函数。系统调用是一个例外。其原理是进程先用适当的值填充寄存器,然后调用一个特殊的指令,这个指令会让用户程序跳转到一个事先定义好的内核中的一个位置:v在Intel CPU中,这个指令由中断0x80实现。在ARM中,这个指令SWI。



3. 实现系统调用

向内核中添加新的系统调用,需要执行 3 个步骤:
1. 内核代码 kernel/sys.c 中 添加新的内核函数
2. 更新头文件 unistd.h, 在arch/arm/include/asm/unistd.h 中添加编号, #define __NR_add (__NR_SYSCALL_BASE+361)
3. 针对这个新函数更新系统调用表 ,arch/arm/kernel/calls.S 指向新的系统调用函数:CALL(sys_add);

重新编译内核 使用!!

示例程序:

1. 在kernel/sys.c中添加函数:
asmlinkage int sysMul(int a, int b)
{
intc;
c =a*b;
returnc;
} /* asmlinkage:使用栈传递参数 */

2. 在arch/arm/include/asm/unistd.h中添加如下代码: #define __NR_sysMul 361

3.在arch/arm/kernel/calls.S中添加代码,指向新实现的系统调用函数:CALL(sysMul)

4. 使用系统调用
#include <stdio.h>
#include <linux/unistd.h>
main()
{
int result;
result = syscall(361,1, 2);
printf("result = ", result);
}


posted @ 2013-08-11 14:00  今晚打酱油_  阅读(589)  评论(0编辑  收藏  举报