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
烧写到开发板运行: