linux内存管理 (五) 6 用户空间 系统调用

系统调用的标准与定义

系统调用一般是os提供给应用程序的接口(接口不同于函数调用)
在不同的系统(包括linux)上有不同的数量,不同的种类
在不同的架构实现上,有不同的系统调用底层实现机制

------------针对ARM-linux
系统调用在 ARM架构参考手册(ARM Architecture Reference Manual , ARM DDI 0100I)中 被提到

This allows them to be used to communicate extra information about the Operating System call or breakpoint to the handler.

them 指的是 SWI 和 BKPT 指令,他们属于 Exception-generating instructions

也就是说 ARM-linux 系统调用 是用 Exception-generating instructions 实现的.
至于 ARM-linux 要怎么实现系统调用,这就要看软件(linux)的设计了.

linux 系统调用 体现在哪里

1.用户空间怎么陷入内核(进入SYSCALL_DEFINE内核路径),陷入后又怎么返回用户空间 // 对应不同的体系架构有不同的指令, 陷入内核指令的执行一般由glibc提供
对于 x86    : int指令(在用户空间执行)陷入内核
对于 arm    : swi指令(在用户空间执行)陷入内核,iret指令(在内核空间执行)返回用户空间

2. 整个系统调用路径(全在内核中) // 以arm举例
		vector_swi //陷入内核后的第一条指令地址 // 第一条指令执行在内核态
			...
			SYSCALL_DEFINE3(execve,const char __user *, filename,const char __user *const __user *, argv,const char __user *const __user *, envp)
			...
			iret //陷入内核后的最后一条内核态指令地址 ,执行此指令后返回用户空间
3. 内核中类似SYSCALL_DEFINE定义的函数
	fs/exec.c
	SYSCALL_DEFINE3(execve,const char __user *, filename,const char __user *const __user *, argv,const char __user *const __user *, envp)

内核空间与用户空间

内核空间与用户空间是对 虚拟内存(0-4G) 的分配,对运行起来的系统中 虚拟内存的分配

当不运行时,内核空间和用户空间是不存在的.

当运行时,内核空间指的是(3-4G),这段内存中存在了 内核镜像的各个段,各种页表,内核申请的内存
当运行时,用户空间指的是(0-3G),每个用户进程有一个用户空间,这段内存中存在了 应用程序的各个段,应用程序申请的内存


内核空间与用户空间的界限就是 异常(对于ARM,包括系统调用和中断)等
对于系统调用,一般我们认为 int指令(不包括)之后 iret(包括)之前的路径都是运行在(3-4G)内核空间
对于中断, 进入中断与返回之间也运行在内核空间

从其他的角度分析:
	内核代码路径肯定运行在内核空间
	用户代码路径肯定运行在用户空间

内存相关的系统调用

也就是 SYSCALL_DEFINE 定义了 哪些内存相关的系统调用
应用程序对内核的需求不外乎 申请内存,释放内存
grep SYSCALL_DEFINE mm/* -nr 可以搜到很多 定义, 这些就是内核空间提供给用户空间

其他

  • linux 系统调用 与 linux 函数调用有什么不同


  • linux 系统调用 与 linux 中断有什么不同

猜你喜欢

转载自blog.csdn.net/u011011827/article/details/111661621