Linux中用户态的函数是如何通过系统调用进入内核态的(二)

上一篇中我们讲到用户空间执行到调用系统中断,便完成任务,接下来就是内核空间响应系统中断,来调用对应的函数执行,本篇我们便来详细分析内核空间是如何相应系统中断,并调用相关的驱动函数执行数据收发的。

基于内核4.4.94,我们先看看内核中相应swi中断定义的位置,在arch\arm\kernel\entry-armv.S文件中定义了硬件异常向量表,其中的W(ldr) pc, __vectors_start + 0x1000便是跳转到vector_swi

我们先解释为何 __vectors_start + 0x1000便是vector_swi,在arch\arm\kernel\vmlinux.lds.S文件中,定义了.stubs节在0x1000处,而vector_swi放在了__stubs_start处,所以__vectors_start + 0x1000便是vector_swi的入口了。

下面我们看vector_swi实体的定义,在arch\arm\kernel\entry-common.S中

上面只是截取了一段,后面还有一部分,这个实体中便会将用户空间传入的参数、系统调用号、线程信息等进行处理,我们重点关注加载系统调用表这一句,

这个表定义在arch/arm/kernel/calls.S中,在这个表中我们可以看到如下定义,

从这里就可以和用户空间传入的290这个系统调用号对应了,

然后继续回到vector_swi实体,我们看这一句,便是跳转到sys_sendto函数执行了。

后面的ret_fast_syscall则是执行完sys_sendto的系统调用后,恢复寄存器,返回用户空间。

下面我们继续探索sys_sendto这个系统调用函数在内核中的定义,在net/socket.c文件中有

这是个宏定义,在include\linux\syscalls.h中有如下引用

然后经过上述展开,形态如下:

后面还有一些展开,我们不再详细展示,至此,sys_sendto函数已经初现真容,系统便从此处进入sys_sendto函数的调用,来完成相关的工作了。至此,用户态的函数通过系统调用进入内核态函数的执行就完成了。

相关推荐
第404号工位42 分钟前
40块钱二手瘦客户端,如何跑满家庭物联网中枢?(拒绝Docker爆盘实录)
linux·架构·node.js
对象存储与RustFS43 分钟前
网盘限速逼你开会员?用 RustFS 自己搭一个不限速的“私人网盘
服务器·后端·docker
骑着蜗牛撵大象3272 小时前
Linux 进程间通信之管道:从 pipe() 的内核语义到 FIFO 落地排错
android·java·linux·系统编程·fifo·管道·进程间通信
..Dauntless..3 小时前
【Linux】一切皆文件和缓冲区
linux·运维·服务器
裕晟资质规划3 小时前
三类资质变更报告时限差在哪?军工 15 日、集成印制 10 日
大数据·服务器·网络
QMCY_jason3 小时前
x86 ubuntu2204 无gui 安装 openeuler 2203 aarch64版本
linux·运维·服务器
重生之小比特3 小时前
【Linux系统】12 进程程序替换 自定义Shell 命令行解释器
linux·运维·服务器
轻舟技术A3 小时前
Provider 不属于 Agent 核心:rpi 的分层理由与收益
服务器·网络
连山齐名3 小时前
ai应用开发的学习笔记
服务器·笔记·学习
Shadow(⊙o⊙)3 小时前
仿muduo实现高并发服务器——事件就绪管理Channel.hpp
服务器·c++