Linux 系统调用(system call)

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

  烧写到开发板运行:

猜你喜欢

转载自www.cnblogs.com/dongry/p/10650015.html