内核基础(系统调用)

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

首先,内核是用来控制硬件的仅仅有内核才干直接控制硬件,所以说内核非常重要,假设内核被控制那么电脑的一切都被控制了,所以我们须要把内核保护起来。所以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. STL--G - For Fans of Statistics(两个推断条件-二分)

    G - For Fans of Statistics Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & ...

  2. 使用【百度云推送】第三方SDK实现推送功能具体解释

    之前介绍过怎样使用shareSDK实现新浪微博分享功能,今天介绍怎样使用百度云推送SDK实现Android手机后台推送功能. 执行效果例如以下 第一步,假设使用百度的SDK,当然要先成为百度的开发人员 ...

  3. SDUT 2860-生日Party(BFS)

    生日Party Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描写叙述 Sherlock的生日即将来临,Sherlock打算邀请几个好 ...

  4. android Bitmap(将视图转为bitmap对象)

    1)从android的资源文件夹layout中加载xml布局文件,并把布局文件映射为Bitmap main.xml文件如下: <?xmlversion="1.0"encodi ...

  5. 怎样制作一个相似Tiny Wings的游戏 Cocos2d-x 2.1.4

    在第一篇<怎样使用CCRenderTexture创建动态纹理>基础上,添加�创建动态山丘,原文<How To Create A Game Like Tiny Wings with C ...

  6. Java内部类——局部内部类

    局部内部类,即放在“{块中}”,局部内部类,不能被成员修饰符static修饰,且内部类的成员也不能是static. 内部类中访问局部变量“{块中}”,需要将局部变量声明为final. 可以直接访问外部 ...

  7. Boost::thread库的使用

    阅读对象 本文假设读者有几下Skills [1]在C++中至少使用过一种多线程开发库,有Mutex和Lock的概念. [2]熟悉C++开发,在开发工具中,能够编译.设置boost::thread库. ...

  8. Android Studio显示行数

    Android Studio在打开的文件左側单击鼠标右键,也能像Eclipse一样设置显示代码行数,如图1.可是这边跟Eclipse有一个非常大的差别,Eclipse设置后,其余的相应文件也跟着生效, ...

  9. Effective C++_笔记_条款08_别让异常逃离析构函数

    (整理自Effctive C++,转载请注明.整理者:华科小涛@http://www.cnblogs.com/hust-ghtao/) C++并不禁止析构函数吐出异常,但它不鼓励你这样做.考虑如下代码 ...

  10. 国际化之DateFormat、NumberFormat

    之所以在国际化中介绍DateFormat和NumberFormat这两个类,一是因为本身这两个类是地区敏感类,即可用传入Locale对象:二是因为这两个类具有不同的输出模式,而这些模式能在国际化的动态 ...