内核基础(系统调用)

在说系统调用之前。先来说说内核是怎么和我们交互的。或者说是怎么和我们产生交集的。

首先,内核是用来控制硬件的仅仅有内核才干直接控制硬件,所以说内核非常重要,假设内核被控制那么电脑的一切都被控制了,所以我们须要把内核保护起来。所以SHELL 就诞生了,我们绝大多数情况下是在和SHELL 交互,应用程序也执行与SHELL之上。当执行一些进程时。进程会切换进程上下文。这时进程从用户态切换到内核态,也就是常说的内核代表进程执行。可是就算如此内核依旧是被保护起来的。我们始终不能和内核直接进行数据的交换,我们差点儿不可能从内核中读取数据。可是内核依旧能明确我们写的函数须要执行的进程,由于我们的函数是调用的C库。而C库中的函数均是系统调用(能够理解位内核的一些功能函数)的封装表现。所以说内核能够理解而且能执行上层的应用程序。

系统调用号:

在Linux中每一系统调用都有一个系统调用号,进程是不会提及系统调用名称的。假设一个系统调用被删除,它所占的系统调用号不会被回收,由于假设回收,那么其它曾经调用这个函数的程序就会调用成别的函数,事实上是错误的,它还非常高兴的运行呢。当中一个系统调用sys_ni_syscall( )就是用来填充被删除系统调用的空白的。这个函数仅仅返回-ENOSYS这个值,然后什么都不干。内核记录了系统调用表中的全部已经注冊过的系统调用列表。存储在sys_call_table中,每一种体系结构都明白定义了这个表,里面指定了唯一的系统调用号。

系统调用的性能:

Linux系统调用比其它非常多的操作系统运行的要快。Linux非常短的上下文切换时间非常短是一个重要的原因,进出内核都被优化的非常便捷高效,还有一个重要的原因就是每个系统调用本身就已经非常高效便捷了。

系统调用处理程序:

就像前边说的那样用户空间是不能运行内核代码的,所以系统调用函数不能直接放在用户空间中运行,所以必需要靠软中断来实现。通过一个异常来促使系统切换到内核态去处理异常处理程序,此时异常处理程序就是系统调用程序。X86有一个叫做sysenter 的指令,这条指令被用来使陷入内核运行系统调用的方式。

系统调用的使用

由于全部的系统调用陷入内核的方式都一样,所以不过陷入内核空间是不够的因此必须把系统调用号一并传给内核。X86系统是将系统调用号放入eax寄存器中的。通样系统调用的參数也是先放在寄存器中一并传入的,(那几个寄存器不同系统是不同的)。

參数验证:

不论是系统调用还是其它的一般的程序,參数验证一直都是一个重要的话题,參数验证能够将发生错误在产生损失之前。

尤其是系统调用,假设在内核中发生參数的错误,可能会造成极端的不良影响,所以必须进行严格的參数验证。一般有例如以下几条:

1.传递的指针指向的区域属于用户空间,进程绝不能哄骗内核去读取内核空间的数据(内核是非常单纯的)

2.指针指向的内存区域必须在进程的地址空间里,不能哄骗内核去读取其它进程的数据

3.读或者写或者是读写的权限内存必须分明。进程决不能绕过内存的訪问限制

内核提供了两种方法来完毕必须的检查和内核空间和用户空间的数据的来回拷贝,copy_to_user()  copy_from_user()

都须要三个參数。第一个是目的内存地址。第二个是源内存地址。第三个位须要操作的字节数。都是原子操作。

linux内核基础(系统调用,简明)的更多相关文章

  1. Linux内核基础优化

    Linux内核基础优化 net.ipv4.ip_forward = 1 #开启网络转发 net.ipv4.conf.default.rp_filter = 0 #开启代理功能 net.ipv4.con ...

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

    Linux内核中设置了一组用于实现系统功能的子程序,称为系统调用.系统调用和普通库函数调用非常相似明知是系统调用由操作系统核心提供,运行于核心态,而普通的函数调用由函数库或用户自己提供,运行于用户态. ...

  3. Linux内核基础

            Linux系统运行的应用程序通过系统调用来与内核通信.应用程序通常调用库函数(比如C库函数)再有库函数通过系统调用界面,让内核带其完成各种不同的任务. 下面这张图显示的就是应用程序,内 ...

  4. linux内核增加系统调用--Beginner's guide

    Linux内核中设置了一组用于实现系统功能的子程序,称为系统调用.系统调用和普通库函数调用非常相似明知是系统调用由操作系统核心提供,运行于核心态,而普通的函数调用由函数库或用户自己提供,运行于用户态. ...

  5. Linux内核基础--事件通知链(notifier chain)

    转载: http://blog.csdn.net/wuhzossibility/article/details/8079025 http://blog.chinaunix.net/uid-277176 ...

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

    系统调用:用户态进程向内核发出的,实现用户态进程调用硬件设备的函数或者中断:优点:使编程更容易,将用户从学习硬件设备的低级编程特性中解放:提高系统到安全性,内核在满足请求之前可以做正确性检查:提高可移 ...

  7. Linux内核基础--事件通知链(notifier chain)good【转】

    转自:http://www.cnblogs.com/pengdonglin137/p/4075148.html 阅读目录(Content) 1.1. 概述 1.2.数据结构 1.3.  运行机理 1. ...

  8. Linux内核基础--事件通知链(notifier chain)【转】

    转自:http://blog.csdn.net/wuhzossibility/article/details/8079025 内核通知链 1.1. 概述 Linux内核中各个子系统相互依赖,当其中某个 ...

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

    2.6内核 1>改动linux-source-2.6.31/kernel/sys.c文件,在文件末尾加入系统响应函数.函数实现例如以下: asmlinkage int sys_mycall(in ...

随机推荐

  1. hdu4620 Fruit Ninja Extreme

    Fruit Ninja Extreme Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...

  2. 使用代码辅助生成工具CodeSmith -- 生成NHibernate的映射文件

    首先下载CodeSmith工具:在百度云中,在CodeSmith文件夹中. 安装,使用激活工具激活. 然后下载NHibernate模板,也是在百度云中,在CodeSmith文件夹中. 之后直接点击NH ...

  3. Webfrom 生成流水号 组合查询 Repeater中单选与复选控件的使用 JS实战应用

                                             Default.aspx 网页界面 <%@ Page Language="C#" AutoE ...

  4. 基于visual Studio2013解决面试题之0908最大连续数字串

     题目

  5. [WCF]WCF起航

    解决方案概览: Client:windows 控制台应用程序. WcfService1: windows 服务应用程序. WCFWebTest:asp.net 空web应用程序. 变量程序命名.结构可 ...

  6. WF4.0——升级技能:托付应用

    回想: 在一个月前,我们刚刚回想了面对象至关重要的部分:托付,详细请移步我们博客:面向对象--一起来复习托付与事件!关于这篇博客的详细内容,不再赘述,在这里我们主要讨论在工作流中的应用及他的详细怎样解 ...

  7. MFC类中获得其它类指针

    当用VC++的Application Wizard生成除了CDialog Basiced以外的应用程序时,将自动产生视图类.文档类.主帧窗口类.应用程序类等等.一般来说,程序的核心数据及操作在文档类中 ...

  8. sum(case when then)(男女生的个数)

    判断类似一个班级的男生和女生的人数,用sum (cese when then ) select count(er.execute_result), sum(case er.execute_result ...

  9. 基于visual Studio2013解决面试题之0501上台阶

     题目

  10. UVA 644 Immediate Decodability (字符处理)

    An encoding of a set of symbols is said to be immediately decodable if no code for one symbol is the ...