Linux内核(四)系统调用

转载请注明出处:jiq?钦‘s
technical Blog

什么是系统调用?

系统调用——内核和用户应用程序的桥梁,中间人。

系统调用就是内核实现的一系列函数,这些函数提供了一套固定的接口,通过这套接口,用户程序可以访问系统硬件和操作系统的资源,即内核提供的服务。

为什么提供系统调用?

用户空间只能通过系统调用来访问内核提供的服务的根本原因是为了对系统进行“保护”,因为我们知道Linux的运行空间分为内核空间与用户空间,它们各自运行在不同的级别中,逻辑上相互隔离。用户进程在通常情况下不允许随意访问内核资源。

(1) 系统调用和POSIX:

虽然系统调用是内核和用户应用程序之间的桥梁,是用户程序访问内核的入口点,但是通常用户应用程序却是通过“操作系统提供的应用程序编程接口(API)”而不是直接通过系统调用来编程的。

而Unix系统里面的这个所谓的操作系统提供的API就是POSIX,即是Portable
Operating SystemInterface of Unix,可移植操作系统接口。

(2) 系统调用与C库:

操作系统API就是以C库形式提供的,或者说C库提供了POSIX大部分的API。而C库主要是调用内核提供的系统调用实现的。所以可以说POSIX主要是通过调用内核提供的系统调用实现的。

POSIX IN UNIX C库构建在内核之上,由内核实现,但是也有其他一些C库是平台无关的。

(1)Linux中的系统调用是如何工作的呢?要知道在用户空间里面可不能直接执行内核代码!!!

答案是使用软中断:通过软中断引发一个异常,促使系统切换到内核态执行异常处理程序。这个异常处理程序被指定为“系统调用处理程序”,此时在“系统调用处理程序”中便可以执行系统调用了(此时已经陷到内核空间中)。

(2)但是调用哪个系统调用呢?

答案是Linux中每一个系统调用都对应一个唯一的“系统调用号”:陷入内核之前用户空间就把这个号放在寄存器中了,执行“系统调用处理程序”的时候只需要调用这个号码对应的系统调用即可。

(3)系统调用上下文:

不同于中断上下文,内核在执行系统调用的时候是处于“进程上下文”,也就是说(1)可以休眠;(2)可以被抢占;

此时current指向当前任务,也就是引发系统调用那个任务。

(4)有哪些系统调用?

系统调用宏定义文件:

http://lxr.linux.no/linux+v2.6.30/arch/arm/include/asm/unistd.h

这些系统调用按照功能逻辑大致可分为“进程控制”、“文件系统控制”、“系统控制”、“存储管理”、“网络管理”、“socket控制”、“用户管理”、“进程间通信”等几类

源文档 <http://www.kerneltravel.net/journal/iv/syscall.htm>

系统调用列表:

http://www.ibm.com/developerworks/cn/linux/kernel/syscall/part1/appendix.html

这里大概列出一些主要的:

一、进程控制:


fork


创建一个新进程


clone


按指定条件创建子进程


execve


运行可执行文件


exit


中止进程


pause


挂起进程,等待信号


sched_yield


进程主动让出处理器,并将自己等候调度队列队尾


vfork


创建一个子进程,以供执行新程序,常与execve等同时使用


wait


等待子进程终止

二、文件系统控制

1、文件读写操作


fcntl


文件控制


open


打开文件


creat


创建新文件


close


关闭文件描述字


read


读文件


write


写文件


umask


设置文件权限掩码

2、文件系统操作


access


确定文件的可存取性


chdir


改变当前工作目录


chmod


改变文件方式


chown


改变文件的属主或用户组


mkdir


创建目录


mknod


创建索引节点


rmdir


删除目录


rename


文件改名

三、系统控制


ioctl


I/O总控制函数


uname


获取当前UNIX系统的名称、版本和主机等信息


create_module


创建可装载的模块项


delete_module


删除可装载的模块项


init_module


初始化模块

四、内存管理


brk


改变数据段空间的分配


mmap


映射虚拟内存页

五、网络管理


getdomainname


取域名


setdomainname


设置域名


gethostname


获取本主机名称


sethostname


设置主机名称

六、socket控制


socketcall


socket系统调用


socket


建立socket


bind


绑定socket到端口


connect


连接远程主机


accept


响应socket连接请求


send


通过socket发送信息


sendto


发送UDP信息


recv


通过socket接收信息


recvfrom


接收UDP信息


listen


监听socket端口


select


对多路同步I/O进行轮询

七、用户管理


getuid


获取用户标识号


setuid


设置用户标志号


getgid


获取组标识号


setgid


设置组标志号

八、进程间通信


ipc


进程间通信总控制调用

1、信号


sigaction


设置对指定信号的处理方法


sigprocmask


根据参数对信号集中的信号执行阻塞/解除阻塞等操作


sigpending


为指定的被阻塞信号设置队列


sigsuspend


挂起进程等待特定信号


signal


参见signal


kill


向进程或进程组发信号

2、消息


msgctl


消息控制操作


msgget


获取消息队列


msgsnd


发消息


msgrcv


取消息

3、管道


pipe


创建管道

4、信号量


semctl


信号量控制


semget


获取一组信号量


semop


信号量操作

5、共享内存


shmctl


控制共享内存


shmget


获取共享内存

时间: 2024-11-15 17:24:14

Linux内核(四)系统调用的相关文章

向linux内核添加系统调用新老内核比较

2.6内核 1>修改linux-source-2.6.31/kernel/sys.c文件,在文件末尾添加系统响应函数.函数实现如下: asmlinkage int sys_mycall(int number) { printk("这是我添加的第一个系统调用"); return number; } 2>在linux-source-2.6.31/arch/x86/kernel/syscall_table_32.S 中添加:.long sys_mycall 如: .long sy

Linux内核的系统调用---linux内核学习笔记(四)

内容一:实验报告相关说明. 真实姓名 谢润帮 原创作品转载请注明出处  所学课程:<Linux内核分析>MOOC课程   链接:http://mooc.study.163.com/course/USTC-1000029000 代码来源于孟宁老师的课件 虚拟实验室实验截图 实验结果图 实验代码截图

[linux内核]ARM-Linux系统调用

1,系统调用的概念: 是用户空间访问内核的唯一手段,系统调用依靠软件中断实现,每个系统调用被赋予一个系统调用号,用来指明要执行哪个系统调用. 2,系统调用的实现:系统调用是通过软中端(SWI)实现的,SWI指令SWI指令的格式为:SWI{条件} 24位的立即数SWI指令用于产生软件中断,以便用户程序能调用操作系统的系统例程.操作系统在SWI的异常处理程序中提供相应的系统服务,指令中24位的立即数指定用 户程序调用系统例程的类型,相关参数通过通用寄存器传递,当指令中24位的立即数被忽略时,用户程序

linux内核增加系统调用--Beginner‘s guide

Linux内核中设置了一组用于实现系统功能的子程序,称为系统调用.系统调用和普通库函数调用非常相似明知是系统调用由操作系统核心提供,运行于核心态,而普通的函数调用由函数库或用户自己提供,运行于用户态. 一般的,进程是不能访问内核的,它不能访问内核所占用内存空间也不能调用内核函数.这被称为保护模式.为了和用户空间上运行的进程进行交互,内核提供一组接口.通过该接口应用程序可以访问硬件设备和其他操作系统资源. 实际上提供这组接口主要是为了保证系统稳定可靠,避免应用程序肆意妄为. 系统调用在用户空间和硬

通过内核编译法向Linux内核添加系统调用

[实验内容]: 向Linux添加一个系统调用 测试该系统调用 使用ptrace或类似的系统跟踪工具来对该测试程序进行跟踪调试 [软件]:VMWare支持的Ubuntu虚拟机 VSCode [步骤] 1.在实验之前先下载好相关软件包 不过如果升级了make以后,如果内核版本低,会报错 1. sudo apt-get install make 2. sudo apt-get install gcc 3. sudo apt-get install libncurses5-dev 4. sudo apt

深入理解Linux内核-系统调用

系统调用:用户态进程向内核发出的,实现用户态进程调用硬件设备的函数或者中断:优点:使编程更容易,将用户从学习硬件设备的低级编程特性中解放:提高系统到安全性,内核在满足请求之前可以做正确性检查:提高可移植性: 系统调用与API调用的区别:1.API调用是一个函数定义:系统调用是通过软中断向内核发出的明确请求2.内核不可以访问库函数 内核中,返回值为正数或者0表示系统调用成功结束,否则表示出错条件 进入内核态的两种方式:1.执行 int $0x80 指令 :2.执行 sysenter 指令内核推出系

《Linux内核分析》 week6作业-Linux内核fork()系统调用的创建过程

一.进程控制块PCB-stack_struct 进程在操作系统中都有一个结构,用于表示这个进程.这就是进程控制块(PCB),在Linux中具体实现是task_struct数据结构,它主要记录了以下信息: 状态信息,例如可执行状态.就绪状态.阻塞状态等. 性质,由于unix有很多变种,进行有自己独特的性质. 资源,资源的链接比如内存,还有资源的限制和权限等. 组织,例如按照家族关系建立起来的树(父进程.子进程等). task_struct结构体内容非常庞大,暂时没有去分析源代码,以后有时间再去研究

linux内核增加系统调用 - 内核版本3.16.39

详细内容见下面链接: http://files.cnblogs.com/files/jingjingblog/linux%E5%86%85%E6%A0%B8%E5%A2%9E%E5%8A%A0%E7%B3%BB%E7%BB%9F%E8%B0%83%E7%94%A8.pdf 文档主要内容: 1.基础知识介绍 2.增加系统调用 3.以树的形式输出进程间的父子关系

向linux内核加入系统调用新老内核比較

2.6内核 1>改动linux-source-2.6.31/kernel/sys.c文件,在文件末尾加入系统响应函数.函数实现例如以下: asmlinkage int sys_mycall(int number) { printk("这是我加入的第一个系统调用"); return number; } 2>在linux-source-2.6.31/arch/x86/kernel/syscall_table_32.S 中加入:.long sys_mycall 如: .long