1 系统调用:(SYSTEM CALL)
操作系统(operating system)内核中有一组实现系统功能的过程,系统调用就是对上述过程的调用。程序员利用系统调用,向OS提出服务请求,由OS代为完成。
一般情况下进程是不能够存取系统内核的。它不能存取内核使用的内核段,也不能调用内核函数,CPU的硬件结构保证了这一点。只有系统调用是个例外。
系统调用是用户态进入内核态的唯一入口。
Linux被分为内核空间和用户空间;如果想在内核空间实现了某个函数提供给应用程序去使用,比如sys_read()函数;而应用程序的read()实现是来源于sys_read(),这样就形成一个系统调用。
Linux中的系统调用接口:https://www.cnblogs.com/dongry/p/10650620.html
2 系统调用分析:
打开entry_common.S;找到其中的ENTRY(vector_swi)

在这个函数中得到调用标号

根据标号找到一个调用表

然后找到进入表

打开calls.S文件,会得到一张系统调用列表(部分图示)

3 系统调用实例:
实现功能:系统调用打印字符串
3.1 编写系统调用函数(/mini2440/kernel/printk.c)

添加一个新的系统调用(/mini2440/arch/arm/kernel/calls.S)

添加到头文件(/mini2440/arch/arm/include/asm/unistd.h)

3.2 make clean系统,重新编译make uImage ARCH=arm CROSS_COMPILE=arm-linux- 并重新安装到开发板上
 
cp arch/arm/boot/uImage /tftpboot
3.3 编写应用程序syscall.c
void pk()
{
            __asm__(
            "ldr r7,=365\n"
            "swi \n"
            :
            :
            :"memory"
            );
}
int main()
{
            pk();
            return 0;
}
编译:arm-linux-gcc -static syscall.c -o syscall
烧写到开发板运行:

 
 
 
 
 