xyz*_*xyz 41 compiler-construction operating-system process interrupt system-calls
据我所知,用户可以拥有一个进程,每个进程都有一个地址空间(包含有效的内存位置,这个进程可以参考).我知道进程可以调用系统调用并将参数传递给它,就像任何其他库函数一样.这似乎表明所有系统调用都是通过共享内存等进入进程地址空间.但也许,这只是一个错觉,因为在高级编程语言中,系统调用看起来像任何其他函数,当进程叫它.
但是,现在让我更进一步,更深入地分析引擎盖下发生的事情.编译器如何编译系统调用?它可能会将进程提供的系统调用名称和参数压入堆栈,然后将汇编指令说成"TRAP"或其他东西 - 基本上是用于调用软件中断的汇编指令.
该TRAP汇编指令由硬件执行,首先将模式位从用户切换到内核,然后将代码指针设置为说明中断服务程序的开始.从这一点开始,ISR在内核模式下执行,从堆栈中获取参数(这是可能的,因为内核可以访问任何内存位置,甚至是用户进程拥有的内存位置)并执行系统调用end放弃CPU,再次切换模式位,用户进程从停止的位置开始.
我的理解是否正确?
附上我理解的粗略图:

sar*_*old 14
你的理解非常接近; 诀窍是,大多数编译器将永远不会写的系统调用,因为程序调用的功能(例如getpid(2),chdir(2)等)实际上是由标准C库提供.标准C库包含系统调用的代码,无论是通过INT 0x80还是调用SYSENTER.它是一个奇怪的程序,在没有库完成工作的情况下进行系统调用.(即使perl提供了一个syscall()可以直接进行系统调用的功能!疯了吧?)
接下来,记忆.操作系统内核有时可以轻松地对用户进程内存进行地址空间访问.当然,保护模式是不同的,用户提供的数据必须复制到内核的受保护地址空间,以防止在系统调用正在进行时修改用户提供的数据:
static int do_getname(const char __user *filename, char *page)
{
int retval;
unsigned long len = PATH_MAX;
if (!segment_eq(get_fs(), KERNEL_DS)) {
if ((unsigned long) filename >= TASK_SIZE)
return -EFAULT;
if (TASK_SIZE - (unsigned long) filename < PATH_MAX)
len = TASK_SIZE - (unsigned long) filename;
}
retval = strncpy_from_user(page, filename, len);
if (retval > 0) {
if (retval < len)
return 0;
return -ENAMETOOLONG;
} else if (!retval)
retval = -ENOENT;
return retval;
}
Run Code Online (Sandbox Code Playgroud)
这虽然不是系统调用本身,但它是一个由系统调用函数调用的辅助函数,它将文件名复制到内核的地址空间中.它会检查以确保整个文件名位于用户的数据范围内,调用从用户空间复制字符串的函数,并在返回之前执行一些健全性检查.
get_fs()和类似的函数是来自Linux的x86根的残余.这些函数具有适用于所有体系结构的工作实现,但名称仍然过时.
段的所有额外工作是因为内核和用户空间可能共享可用地址空间的某些部分.在32位平台上(数字易于理解),内核通常具有1千兆字节的虚拟地址空间,而用户进程通常具有3千兆字节的虚拟地址空间.
当进程调用内核时,内核将"修复"页表权限以允许它访问整个范围,并获得用户提供的内存的预填充TLB条目的好处.巨大的成功.但是当内核必须上下文切换回用户空间时,它必须刷新TLB以删除内核地址空间页面上的缓存权限.
但关键是,虚拟地址空间的一千兆字节是不足够的庞大机器的所有内核数据结构.维护高速缓存文件系统和块设备驱动程序的元数据,网络堆栈以及系统上所有进程的内存映射可能会占用大量数据.
因此可以使用不同的"拆分":两个用户演出,两个内核演出,一个用户演出,三个内核演出等.随着内核空间的增加,用户进程的空间也随之下降.因此,存在一个4:4内存分割,它为用户进程提供4千兆字节,内核为4千兆字节,内核必须摆弄段描述符才能访问用户内存.TLB刷新进入和退出系统调用,这是一个非常显着的速度惩罚.但它让内核保持了更大的数据结构.
更大的页表和64位平台的地址范围可能使前面的所有外观都很古怪.无论如何,我当然希望如此.
您实际上调用了 C 运行时库。插入 TRAP 的不是编译器,而是 C 库将 TRAP 包装到库调用中。您的其余理解是正确的。
| 归档时间: |
|
| 查看次数: |
18130 次 |
| 最近记录: |