Linux内核学习(四)—— 系统调用(基于Linux 2.6内核)

news2024/11/17 14:40:21

在现代操作系统中,内核提供了用户进程与内核进行交互的一组接口,这些接口在应用程序和内核之间扮演了使者的角色。这些接口保证了系统的稳定可靠,避免应用程序肆意妄行。

一、与内核通信

系统调用在用户空间进程和硬件设备之间添加了一个中间层。有三个作用:

  • 第一,它为用户空间提供了一种硬件的抽象接口。举例来说,当需要读写文件的时候,可以不关心磁盘介质和类型,甚至不需要关心文件所在的文件系统。
  • 第二,系统调用保证了系统的稳定和安全。可以避免用户程序不正确的使用硬件设备,窃取其他进程的资源等危害系统的行为。
  • 第三,每个进程都运行在虚拟系统中,如果应用程序可以随意访问硬件而内核又对此一无所知,几乎就没法实现多任务和和虚拟内存。

在 Linux 中,系统调用是用户空间访问内核的唯一手段;除异常和陷入外,它们是内核唯一的合法入口。

二、API

应用编程接口(API,Application Programming Interface)定义了一组应用程序使用的编程接口,它可以使用系统调用实现,也可以不使用:

从程序员的角度来看,系统调用无关紧要,他们只需要和 API 打交道就行了。相反,内核只跟系统调用打交道。

三、系统调用

每个系统调用被赋予了一个系统调用号,通过这个独一无二的号就可以关联系统调用。

getpid() 返回的是 tgid(线程组 ID),对于普通的进程来说,TGID 和 PID 相等,对于线程来说,同一线程组内的所有线程及其 TGID 都相等。

Linux 系统调用实现十分简洁。

应用程序通过软中断来通知系统,告诉内核自己需要执行一个系统调用,希望系统切换到内核态,这样内核就可以代表应用程序在内核空间执行系统调用。软中断是通过引发一个异常来促使系统切换到内核态去执行异常处理程序。此时的异常处理程序实际上就是系统调用处理程序

在 x86 上,系统调用号是通过 eax 寄存器传递给内核的(系统调用的返回值也是通过 eax 寄存器传递给用户空间的)。除了系统调用号以外,还需要传入一些其他的参数给内核,同样也是通过寄存器来传递的,ebx、ecx、edx、esi、edi 按顺序存放前五个参数(当大于 6 个的时候就用一个单独的寄存器存放参数在内存中的地址)。

在接收一个用户空间的指针之前,内核必须保证:

  • 指针指向的区域属于用户空间。进程不能哄骗内核去读内核空间的数据。
  • 指针指向的内存区域在进程的地址空间里。进程绝不能哄骗内核去读其他进程的数据。
  • 用户必须有被指针访问的内容的相应访问权限。进程绝不能绕过内存访问限制。

内核提供了两个方法来完成必须的检查和内核空间和用户空间之间的数据拷贝:

  • 为了向用户空间写入数据,内核提供了 copy_to_user(),它需要三个参数。第一个参数为进程空间中的目的内存地址,第二个是内核空间内的源地址,最后一个参数为需要拷贝的数据长度(字节数)。
  • 为了从用户空间读数据,内核提供了 copy_from_user(),所需的参数和 copy_to_user() 类似

如果执行失败,这两个函数返回的都是没能完成拷贝的数据字节数。成功则返回 0。这两个函数都可能引起阻塞。当包含用户数据的页被换出到硬盘上而不是在物理内存上的时候,这种情况就会发生。此时进程会休眠,直到缺页处理程序将该页从硬盘重新换回物理内存。

用户可以使用 capable() 函数来检查是否有权能对指定的资源进行操作,返回非 0 值就有权进行操作,反之则无权。

四、系统调用上下文

内核在执行系统调用的时候处于进程上下文,current 指针指向当前任务,即引发系统调用的那个进程。

进程上下文中,内核可以休眠(比如在系统调用阻塞或显式调用 schedule() 的时候)并且可以被抢占。中断处理程序不可休眠。在进程上下文中可以被抢占。因为新的进程可以使用相同的系统调用,所以必须保证该系统调用是可重入的。

当系统调用返回的时候,控制权仍在 system_call() 中,它最终会负责切换到用户空间,并让用户进程继续执行下去。

ABI 为应用程序二进制接口。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/906489.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

阿里云——云存储:对象存储管理与安全

作者简介:一名云计算网络运维人员、每天分享网络与运维的技术与干货。 座右铭:低头赶路,敬事如仪 个人主页:网络豆的主页​​​​​ 目录 一.传统存储介绍: 1.存储的发展历史 2.硬盘发展历史与趋势 3.SDD硬盘介…

谷歌浏览器最新版本进行控制台调试js代码时候无法显示代码行数

问题描述 谷歌浏览器打开控制台进行js代码调试,js代码没有行数显示想当难受 原因分析: 最新版本谷歌浏览器进行了自动设置关闭那个功能,要自己去设置 解决方案: 最终效果 舒服了

用C++/JS/Python/Java代码描述秋天的味道

前言 秋天是一个充满诗意和浪漫的季节,它带来了清新、芬芳和美食的味道。让我们一起探索如何用编程语言来写出秋天味道的代码吧!无论是C、JavaScript、Python还是Java,以下是几个简单的步骤来帮助你创造出充满秋天味道的代码: …

ChatGPT的创造力已达到人类顶尖水平-蒙大拿大学研究

美国蒙大拿大学的一项新研究表明,ChatGPT的创造力已经达到了前1%的人类思想家水平。研究人员对ChatGPT进行了托兰斯创造力思维测验(TTCT, Torrance Tests of Creative Thinking),并记录了8个回答。此外,他们…

C++破坏电脑病毒

写了这么多python病毒,今天我来给大家分享一个C病毒。 创作背景:我有个同学对电脑十分精通,而且对MBR十分感兴趣,他跟我分享了他怎么把MBR搞报废的历程。听完之后,我开始研究MBR。用python研究了2个月,结果…

Apache和Nginx各有什么优缺点,应该如何选择?

Apache和Nginx各有什么优缺点,应该如何选择? Apache和Nginx都有各自的优点和缺点,选择应该根据您的具体需求而定。Nginx的优点包括:轻量级,与同等web服务相比,Nginx占用更少的内存和资源;抗并发…

面试热题(不同的二分搜索树)

给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。 经典的面试题,这部分涉及了组合数学中的卡特兰数,如果对其不清楚的同学可以去看我以前的博客卡特兰数 …

stack,queue,deque的使用

1.stack是后进先出的&#xff0c;这也影响其对应的接口&#xff0c;所能实现的功能也有限&#xff0c;其中主要的功能如下&#xff1a; void test_stack1() {stack<int> st;st.push(1);st.push(2);st.push(3);st.push(4);st.push(5);st.push(6);while (!st.empty()){c…

代码随想录打卡—day24—【回溯】— 基础,最新820 8.21 todo

1 理论基础 回溯法也可以叫做回溯搜索法&#xff0c;它是一种搜索的方式。回溯算法——回溯和递归是相辅相成的。回溯法的效率&#xff0c;回溯法其实就是暴力查找&#xff0c;并不是什么高效的算法。回溯法解决的问题都可以抽象为树形结构&#xff08;N叉树&#xff09; 1.1…

Linux面试笔试题(1)

1、以长格式列目录时&#xff0c;若文件test的权限描述为&#xff1a;drwxrw-r–&#xff0c;则文件test的类型及文件主的权限是__A____。 A.目录文件、读写执行 B.目录文件、读写 C.普通文件、读写 D.普通文件、读 在这个问题中&#xff0c;我们需要解析文件权限的描述&…

【记录】Python3|selenium4 极速上手入门(Windows)

环境&#xff1a;Windows 版本&#xff1a;python3&#xff0c;selenium 4.11.2 文章目录 1 装ChromeEdge其他浏览器 2 运行报错RequestsDependencyWarning: urllib3 (1.26.9) or chardet (3.0.4) doesn‘t match a supported version打开了浏览器&#xff0c;但是没有显示网页…

李沐pytorch学习-经典CNN的原理及代码实现

一、LeNet 1.1 模型结构 LeNet结构如图1所示&#xff0c;汇聚层即池化层&#xff0c;这里池化Stride&#xff08;步幅&#xff09;与池化层长宽一致&#xff0c;因此使得池化后大小减半。 图1. LeNet结构 1.2 代码实现 代码实现如下&#xff1a; import torch from torch imp…

KDAB QML学习笔记Day3(5,6,7,8)

KDAB QML学习笔记Day3&#xff08;5,6,7,8&#xff09; 学习视频链接&#xff1a;Introduction to Qt / QML - all videos so far - YouTube B站链接&#xff1a;Introduction to Qt / QML_哔哩哔哩_bilibili Part05&#xff0c;06 示例代码 import QtQuick 2.15 import Q…

根据源码,模拟实现 RabbitMQ - 虚拟主机设计(5)

目录 一、虚拟主机设计 1.1、需求分析 1.1.1、核心 API 1.1.2、虚拟主机的是用来干什么的&#xff1f; 1.1.3、如何表示 交换机和虚拟主机 之间的从属关系&#xff1f; 二、实现 VirtualHost 类 2.1、属性 2.2、锁对象 2.3、公开实例 2.4、虚拟主机构造方法 2.5、交…

Ubuntu系统更换Linux内核的详细方法汇总

文章目录 一、写在前面二、方法一&#xff08;手动下载编译安装Linux内核并更换&#xff09;三、方法二&#xff08;自动下载安装Linux内核并更换&#xff09;四、最后总结 一、写在前面 最近在复现Linux内核漏洞的时候&#xff0c;经常需要更换Ubuntu系统的Linux内核版本&…

索引下推及具体实践

什么是索引下推 索引下推(Index Condition Pushdown&#xff0c;简称ICP)&#xff0c;是MySQL5.6版本的新特性&#xff0c;它能减少回表查询次数&#xff0c;提高查询效率。 索引下推优化的原理 我们先简单了解一下MySQL大概的架构&#xff1a; MySQL服务层负责SQL语法解析…

Spring 中 @Primary 注解的原理是什么?

1. 问题分析 当我们使用 Spring 的时候&#xff0c;有时候会遇到下面这种情况。 假设我有 A、B 两个类&#xff0c;在 A 中注入 B&#xff0c;如下&#xff1a; Component public class A {AutowiredB b; }至于 B&#xff0c;则在配置类中存在多个实例&#xff1a; Configu…

windows上先简单使用libevent,运行demo

使用libevent 1:获取libevent库。 从libevent 官网中获取&#xff0c;这里获取到的版本是libevent-2.1.12-stable.tar 2:windows上编译libevent库&#xff08;VS2019上使用&#xff09; 2.1&#xff1a;cmake准备 注&#xff1a;这里要用cmake进行编译&#xff0c;除此之外…

变动的Python爬虫实现

在电商时代&#xff0c;了解商品价格的变动对于购物者和卖家来说都非常重要。本文将分享一种基于Python的实时监控电商平台商品价格变动的爬虫实现方法。通过本文的解决方案和代码示例&#xff0c;您将能够轻松监控商品价格&#xff0c;并及时做出决策。 一、了解需求和目标 在…

HyperMotion高度自动化云迁移至华为HCS8.1解决方案

项目背景 2020 年以来&#xff0c;金融证券已经成为信创落地最快的领域。2021 年证监会发布的《证券期货业科技发展十四五规划》中&#xff0c;将“加强信创规划与实施”作为证券行业重点建设任务之一。为了符合国家信创标准&#xff0c;某证券企业计划将网管系统、呼叫中心管…