Linux内核-系统调用

Linux内核-系统调用

1.与内核通信

#系统调用在用户空间进程和硬件设备之间增加了一个中间层

作用:1.为用户空间提供了一种硬件的抽象接口

2.系统调用保证了系统的稳定和安全

3.出于每个进程都运行在虚拟系统中的考虑

#系统调用是用户空间访问内核的唯一手段

2.API、POSIX和C库

#应用程序通过API而不是直接系统调用来编程

#一个API定义了一组应用程序使用的编程接口

3.系统调用

#内核必需提供系统调用所希望完成的功能,但它完全可以按照自己的方式去实现,只要最后结果正确

#所有的系统调用都要asmlinkage限定词

#为保证32/64位兼容,系统调用在用户空间返回值时int,内核空间为long

1.系统调用号:

#在Linux中每个系统调用被赋予一个系统调用号

#系统调用号一旦分配不可改变,否则编译好的应用会崩溃

#Linux上有一个“未实现”的系统调用sys_ni_syscall(),它除了返回-ENOSYS外不做其他任何工作

如果一个系统调用被删除,或变的不可用,这个函数去填补空缺

2.系统调用的性能

#Linux系统调用比其他操作系统要快,原因:

1.Linux很短的上下文切换时间

2.系统调用处理程序和每个系统调用非常简洁

4.系统调用处理程序

#通知内核的机制靠软中断实现,通过引发异常来促使系统切换到内核态去执行异常处理程序(系统调用处理程序)

#指定恰当的系统调用:

在x86上通过eax寄存器将系统调用号传递给内核

system_call()函数通过将给定的系统调用号与NR_syscalls()作比较来检查其有效性

#参数传递:在x86-32系统上,ebx,ecx,edx,esi,edi按照顺序存放前五个参数

给用户空间的返回值通过eax寄存器传递(x86)

5.系统调用的实现

#实现系统调用:

每个系统调用都有一个明确的用途

系统调用的接口力求简洁,参数尽可能少

设计接口的时候要尽量为将来多做考虑

#参数验证:

#系统调用必须验证他们所有的参数是否合法有效,最重要的检查时检查用户提供的指针是否有效

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

1.指针指向的内存区域属于用户空间,进程决不能让内核去读取内核空间的数据

2.指针指向的内存区域在进程的地址空间,进程决不能让内核去读取其他进程的数据

3.如果是读,内存标记为可读;如果是写,标记为可写;如果标记为可执行,进程决不能绕过内存访问限制

6.系统调用上下文

#绑定一个系统调用的最后步骤:

1.首先,在系统调用表的最后加入一个表项

2.系统调用号定义于<asm/unistd.h>中

3.系统调用必须被编译进内核映像(不能编译为模块)

#建立新的系统调用的利与弊:

利:#系统调用创建容易且使用方便

#Linux系统调用高性能

弊:#需要一个系统调用号,由官方分配

#系统调用加入稳定内核后被固化,它的接口不允许改动

#需要将系统调用分别注册到每个需要支持的结构体系去

#在脚本中不容易调用,也不能从文件系统直接访问系统调用

#在主内核树之外很难维护和调用系统调用

时间: 2024-08-07 10:38:49

Linux内核-系统调用的相关文章

linux内核系统调用--sendfile函数

在apache,nginx,lighttpd等web服务器当中,都有一项sendfile相关的配置,在一些网上的资料都有谈到sendfile会提升文件传输性能,那sendfile到底是什么呢?它的原理又是如何呢? 在传统的文件传输里面(read/write方式),在实现上其实是比较复杂的,需要经过多次上下文的切换,我们看一下如下两行代码: Java代码 read(file, tmp_buf, len); write(socket, tmp_buf, len); 以上两行代码是传统的read/wr

linux内核系统调用和标准C库函数的关系分析

今天研究了一下系统调用和标准库函数的区别和联系,从网上搜集的资料如下: 1.系统调用是为了方便应用使用操作系统的接口,而库函数是为了方便人们编写应用程序而引出的,比如你自己编写一个函数其实也可以说就是一个库函数. 2.系统调用可以理解为内核提供给我们在用户态用的接口函数,可以认为是某种内核的库函数. 3.read就是系统调用,而fread就是C标准库函数. 4.很多c函数库中的函数名与系统调用的名称一样是因为该函数本身其实就是调用的系统调用,放到c函数库就是为了用户态的使用 5.写程序直接使用的

Linux内核设计第四周——扒开系统调用三层皮

Linux内核设计第四周--扒开系统调用三层皮 by苏正生 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.知识点整理 1.用户态 内核态和中断处理程序 我们一般使用系统调用一般通过库函数的方式 用户态和内核态的区分: [CPU有不同的执行级别,高执行级别下,代码可以执行特权指令,访问任何的物理地址:低执行级别下,就会受到一定的限制.(处于系统安全和稳定的目的)Intel X86 C

Linux内核学习第五周 系统调用

一.实验截图 二.系统调用流程图: 三.总结:系统调用过程分析 linux的系统调用过程:用户程序→C库(即API):INT 0x80 →system_call→系统调用服务例程→内核程序.我们常说的用户API其实就是系统提供的C库. 系统调用是通过软中断指令 INT 0x80 实现的,而这条INT 0x80指令就被封装在C库的函数中.软中断和我们常说的硬中断不同之处在于,软中断是由指令触发的,而不是由硬件外设引起的.INT 0x80 这条指令的执行会让系统跳转到一个预设的内核空间地址,它指向系

20135327郭皓--Linux内核分析第四周 扒开系统调用的三层皮(上)

Linux内核分析第四周 扒开系统调用的三层皮(上) 郭皓 原创作品转载请注明出处 <Linux内核分析>MOOC课程 http://mooc.study.163.com/course/USTC-1000029000 一.用户态.内核态和中断 用户态:当进程在执行用户自己的代码时,则称其处于用户态,即此时处理器在特权级最低的(3级)用户代码中运行. 内核态:当一个进程执行系统调用而陷入内核代码中执行时,我们就称进程处于内核态,此时处理器处于特权级最高的(0级)内核代码中执行. PS:CPU指令

linux内核设计与实现 系统调用

系统调用的实现过程:触发软终端,调用系统调用处理函数:在处理函数中,从寄存器中读取系统调用号以及参数,根据系统调用号,读取系统调用表:系统调用号就是系统调用函数的位置,取该位置值,就找到真正的系统调用函数,最后执行. arm系统调用:r0-r5传递参数 r0保存返回值 系统调用的绑定过程: 1.系统调用函数asmlinkage 2.在系统调用表中添加系统调用 3.在asm/unistd.h中添加系统调用号 4.编译内核 即可 系统调用使用:1.包含系统调用实现文件 或者2._syscallN()

《Linux内核分析》 第五节 扒开系统调用的三层皮(下)

摘要:范闻泽 原创作品转载请注明出处<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 1.实验环境是使用本课程配置的实验楼虚拟机环境,打开命令行客户端,cd LinuxKernel目录,使用命令rm -rf menu 删除原来的代码,使用git clone https://github.com/mengning/menu.git获取menu的最新代码,然后cd menu进入menu子文件夹,使用vi test.c

20135201李辰希 《Linux内核分析》第四周 扒开系统调用的“三层皮”

李辰希无转载 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.用户态.内核态和中断处理过程 1.我们与系统调用打交道是通过库函数的方式 2.一般现代CPU都有几种不同的指令执行级别 因为如果所有程序员写的代码都可以有特权指令的话,系统就会很容易崩溃. 3.区别: 在高级别的状态下,代码可以执行特权指令,访问任意的物理地址. 在相应的低级别执行状态下,代码的掌控范围会受到限制. Intel x86 CPU有四

《Linux内核分析》第四周 扒开系统调用的“三层皮”

[刘蔚然 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000] WEEK FOUR(3.14——3.20)扒开系统调用的“三层皮” SECTION 1 用户态.内核态和中断处理过程 1.用户态.内核态区别 在高级别的状态下,代码可以执行特权指令,访问任意的物理地址: 在相应的低级别执行状态下,代码的掌控范围会受到限制. 为什么会有这种级别划分? 没有访问权限划分容易使得系统混乱(毕竟普通程序