Linux 系统调用(system call)

时间:2021-03-22 18:00:30

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)

Linux 系统调用(system call)

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

Linux 系统调用(system call)

  根据标号找到一个调用表

Linux 系统调用(system call)

  然后找到进入表

Linux 系统调用(system call)

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

Linux 系统调用(system call)

3 系统调用实例:

  实现功能:系统调用打印字符串

3.1 编写系统调用函数(/mini2440/kernel/printk.c)

Linux 系统调用(system call)

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

Linux 系统调用(system call)

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

Linux 系统调用(system call)

3.2 make clean系统,重新编译make uImage ARCH=arm CROSS_COMPILE=arm-linux- 并重新安装到开发板上

Linux 系统调用(system call)

  cp arch/arm/boot/uImage /tftpboot

3.3 编写应用程序syscall.c

void pk()
{
__asm__(
"ldr r7,=365\n"
"swi \n"
:
:
:"memory"
);
} int main()
{
pk();
return ;
}

  编译:arm-linux-gcc -static syscall.c -o syscall

  烧写到开发板运行:

Linux 系统调用(system call)