搜索
首页系统教程LINUXLinux中系统调用不是内核的合法入口

Linux中系统调用不是内核的合法入口

Mar 19, 2024 am 10:34 AM
linux系统调用

在Linux中,系统调用是用户空间访问内核的惟一手段,它们是内核惟一的合法入口。实际上,其他的像设备文件和/proc之类的方法,最终也还是要通过系统调用进行的。

通常情况下,应用程序通过应用编程插口(API)而不是直接通过系统调用来编程,并且这些编程插口实际上并不须要和内核提供的系统调用对应。一个API定义了一组应用程序使用的编程插口。它们可以实现成一个系统调用,也可以通过调用多个系统调用来实现,就算不使用任何系统调用也不存在问题。实际上,API可以在各类不同的操作系统上实现,给应用程序提供完全相同的插口,而它们本身在这种系统上的实现却可能迥异。

在Unix世界中,最流行的应用编程插口是基于POSIX标准的,Linux是与POSIX兼容的。

从程序员的角度看,她们只须要给API打交道就可以了,而内核只跟系统调用打交道;库函数及应用程序是怎样使用系统调用不是内核关心的。

系统调用(在linux中常叫做syscalls)一般通过函数进行调用。它们一般都须要定义一个或几个参数(输入)并且可能形成一些副作用。这种副作用通过一个long类型的返回值来表示成功(0值)或则错误(负值)。在系统调用出现错误的时侯会把错误码写入errno全局变量。通过调用perror()函数,可以把该变量翻译成用户可以理解的错误字符串。

系统调用的实现有两个非常之处:1)函数申明中都有asmlinkage限定词,用于通知编译器仅从栈中提取该函数的参数。2)系统调用getXXX()在内核中被定义为sys_getXXX()。这是Linux中所有系统调用都应当遵循的命名规则。

系统调用号:在linux中,每位系统调用都赋于一个系统调用号,通过这个独一无二的号就可以关联系统调用。当用户空间的进程执行一个系统调用的时侯,这个系统调用号就被拿来指明究竟要执行那个系统调用;进程不会提到系统调用的名称。系统调用号一旦分配就不能再有任何变更(否则编译好的应用程序都会崩溃),假若一个系统调用被删掉,它所占用的系统调用号也不容许被回收借助。Linux有一个"未使用"系统调用sys_ni_syscall(),它不仅返回-ENOSYS外不做任何其他工作,这个错误号就是专门针对无效的系统调用而设的。似乎很罕见,但假如有一个系统调用被删掉,这个函数就要负责“填补空位”。

内核记录了系统调用表中所有已注册过的系统调用的列表,储存在sys_call_table中。它与体系结构有关,通常在entry.s中定义。这个表中为每一个有效的系统调用指定了惟一的系统调用号。

用户空间的程序难以直接执行内核代码。它们不能直接调用内核空间的函数,由于内核留驻在受保护的地址空间上,应用程序应当以某种形式通知系统,告诉内核自己须要执行一个系统调用,系统系统切换到内核态linux 内核调用,这样内核就可以代表应用程序来执行该系统调用了。这些通知内核的机制是通过软中断实现的。x86系统上的软中断由int$0x80指令形成。这条指令会触发一个异常造成系统切换到内核态并执行第128号异常处理程序,而该程序正是系统调用处理程序,名子叫system_call().它与硬件体系结构紧密相关,一般在entry.s文件中通过汇编语言编撰。

所有的系统调用深陷内核的形式都是一样的红旗linux系统,所以仅仅是深陷内核空间是不够的。因而必须把系统调用号一并传给内核。在x86上,这个传递动作是通过在触发软中断前把调用号放入eax寄存器实现的。这样系统调用处理程序一旦运行,就可以从eax中得到数据。上述所说的system_call()通过将给定的系统调用号与NR_syscalls做比较来检测其有效性。假如它小于或则等于NR_syscalls,该函数就返回-ENOSYS.否则,就执行相应的系统调用:call*sys_call_table(,%eax,4);

因为系统调用表中的表项是以32位(4字节)类型储存的,所以内核须要将给定的系统调用号除以4,之后用所得到的结果在该表中查询器位置。如图图一所示:

里面早已提及,不仅系统调用号以外,还须要一些外部的参数输入。最简单的办法就是像传递系统调用号一样把这种参数也储存在寄存器里。在x86系统上ebx,ecx,edx,esi和edi根据次序储存前5个参数。须要六个或六个以上参数的情况不多见,此时,应当用一个单独的寄存器储存指向所有那些参数在用户空间地址的表针。给用户空间的返回值也通过寄存器传递。在x86系统上,它储存在eax寄存器中。

系统调用必须仔细检测它们所有的参数是否合法有效。系统调用在内核空间执行。假如任由用户将不合法的输入传递给内核,这么系统的安全和稳定将面临极大的考验。最重要的一种检测就是检测用户提供的表针是否有效,内核在接收一个用户空间的表针之前,内核必需要保证:

1)表针指向的显存区域属于用户空间

2)表针指向的显存区域在进程的地址空间里

3)若果是读,读显存应当标记为可读。若果是写,该显存应当标记为可写。

内核提供了两种方式来完成必须的检测和内核空间与用户空间之间数据的来回拷贝。这两个方式必须有一个被调用。

内核调用用户态函数_内核调用call_linux 内核调用

copy_to_user():向用户空间写入数据,须要3个参数。第一个参数是进程空间中的目的显存地址。第二个是内核空间内的源地址

.第三个是须要拷贝的数据宽度(字节数)。

copy_from_user():向用户空间读取数据,须要3个参数。第一个参数是进程空间中的目的显存地址。第二个是内核空间内的源地

址.第三个是须要拷贝的数据宽度(字节数)。

注意:这两个都有可能造成阻塞。当包含用户数据的页被换出到硬碟上而不是在数学显存上的时侯,这些情况才会发生。此时linux 内核调用,进程都会休眠,直至缺页处理程序将该页从硬碟重新换回到化学显存。

内核在执行系统调用的时侯处于进程上下文,current表针指向当前任务,即引起系统调用的那种进程。在进程上下文中,内核可以休眠(例如在系统调用阻塞或显式调用schedule()的时侯)但是可以被占领。当系统调用返回的时侯,控制权一直在system_call()中,它最终会负责切换到用户空间并让用户进程继续执行下去。

给linux添加一个系统调用时间很简单的事情,如何设计和实现一个系统调用是困局所在。实现系统调用的第一步是决定它的用途,这个用途是明晰且惟一的,不要尝试编撰多用途的系统调用。ioctl则是一个背面教材。新系统调用的参数,返回值和错误码该是哪些linux教程下载,这种都很关键。一旦一个系统调用编撰完成后,把它注册成为一个即将的系统调用是件繁杂的工作,通常下边几步:

1)在系统调用表(通常坐落entry.s)的最后加入一个表项。从0开始算起,系统表项在该表中的位置就是它的系统调用号。如第

10个系统调用分配到系统调用号为9

2)任何体系结构,系统调用号都必须定义于include/asm/unistd.h中

3)系统调用必须被编译进内核映像(不能编译成模块)。这只要把它放进kernel/下的一个相关文件就可以。

一般,系统调用靠C库支持,用户程序通过包含标准头文件并和C库链接,就可以使用系统调用(或则使用库函数,再由库函数实际调用)。幸好的是linux本身提供了一组宏用于直接对系统调用进行访问。它会设置好寄存器并调用int$0x80指令。这种宏是_syscalln(),其中n的范围是从0到6.代表须要传递给系统调用的参数个数。这是因为该宏必须了解究竟有多少参数根据哪些顺序压入寄存器。以open系统调用为例:

open()系统调用定义如下是:

longopen(constchar*filename,intflags,intmode)

直接调用此系统调用的宏的方式为:

#defineNR_open5

_syscall3(long,open,constchar*,filename,int,flags,int,mode)

这样,应用程序就可以直接使用open().调用open()系统调用直接把里面的宏放置在应用程序中就可以了。对于每位宏来说,都有2+2*n个参数。每位参数的意义简单明了,这儿就不详尽说明了。

以上是Linux中系统调用不是内核的合法入口的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文转载于:ITcool。如有侵权,请联系admin@php.cn删除
Linux管理员的薪水是多少?Linux管理员的薪水是多少?Apr 17, 2025 am 12:24 AM

Linux管理员的平均年薪在美国为75,000至95,000美元,欧洲为40,000至60,000欧元。提升薪资可以通过:1.持续学习新技术,如云计算和容器技术;2.积累项目经验并建立Portfolio;3.建立职业网络,拓展人脉。

Linux的主要目的是什么?Linux的主要目的是什么?Apr 16, 2025 am 12:19 AM

Linux的主要用途包括:1.服务器操作系统,2.嵌入式系统,3.桌面操作系统,4.开发和测试环境。Linux在这些领域表现出色,提供了稳定性、安全性和高效的开发工具。

互联网在Linux上运行吗?互联网在Linux上运行吗?Apr 14, 2025 am 12:03 AM

互联网运行不依赖单一操作系统,但Linux在其中扮演重要角色。Linux广泛应用于服务器和网络设备,因其稳定性、安全性和可扩展性受欢迎。

Linux操作是什么?Linux操作是什么?Apr 13, 2025 am 12:20 AM

Linux操作系统的核心是其命令行界面,通过命令行可以执行各种操作。1.文件和目录操作使用ls、cd、mkdir、rm等命令管理文件和目录。2.用户和权限管理通过useradd、passwd、chmod等命令确保系统安全和资源分配。3.进程管理使用ps、kill等命令监控和控制系统进程。4.网络操作包括ping、ifconfig、ssh等命令配置和管理网络连接。5.系统监控和维护通过top、df、du等命令了解系统运行状态和资源使用情况。

使用Linux别名提高自定义命令快捷方式的生产率使用Linux别名提高自定义命令快捷方式的生产率Apr 12, 2025 am 11:43 AM

介绍 Linux是一个强大的操作系统,由于其灵活性和效率,开发人员,系统管理员和电源用户都喜欢。但是,经常使用长而复杂的命令可能是乏味的

Linux实际上有什么好处?Linux实际上有什么好处?Apr 12, 2025 am 12:20 AM

Linux适用于服务器、开发环境和嵌入式系统。1.作为服务器操作系统,Linux稳定高效,常用于部署高并发应用。2.作为开发环境,Linux提供高效的命令行工具和包管理系统,提升开发效率。3.在嵌入式系统中,Linux轻量且可定制,适合资源有限的环境。

在Linux上掌握道德黑客的基本工具和框架在Linux上掌握道德黑客的基本工具和框架Apr 11, 2025 am 09:11 AM

简介:通过基于Linux的道德黑客攻击数字边界 在我们越来越相互联系的世界中,网络安全至关重要。 道德黑客入侵和渗透测试对于主动识别和减轻脆弱性至关重要

如何学习Linux基础知识?如何学习Linux基础知识?Apr 10, 2025 am 09:32 AM

Linux基础学习从零开始的方法包括:1.了解文件系统和命令行界面,2.掌握基本命令如ls、cd、mkdir,3.学习文件操作,如创建和编辑文件,4.探索高级用法如管道和grep命令,5.掌握调试技巧和性能优化,6.通过实践和探索不断提升技能。

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
1 个月前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
1 个月前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
1 个月前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.聊天命令以及如何使用它们
1 个月前By尊渡假赌尊渡假赌尊渡假赌

热工具

EditPlus 中文破解版

EditPlus 中文破解版

体积小,语法高亮,不支持代码提示功能

WebStorm Mac版

WebStorm Mac版

好用的JavaScript开发工具

安全考试浏览器

安全考试浏览器

Safe Exam Browser是一个安全的浏览器环境,用于安全地进行在线考试。该软件将任何计算机变成一个安全的工作站。它控制对任何实用工具的访问,并防止学生使用未经授权的资源。

SublimeText3 英文版

SublimeText3 英文版

推荐:为Win版本,支持代码提示!

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境