内核基础(系统调用)

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

首先,内核是用来控制硬件的仅仅有内核才干直接控制硬件,所以说内核非常重要,假设内核被控制那么电脑的一切都被控制了,所以我们须要把内核保护起来。所以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. 为开发用途mac电脑瘦身

    本文介绍的瘦身方法仅仅针对开发用途的mac电脑,在我们的开发过程中会发现随着编译的程序过多非常导致硬盘空间的占用率不断上升. 原文地址:http://blog.csdn.net/qqmcy/artic ...

  2. poj 3258 River Hopscotch 【二分】

    题目真是不好读,大意例如以下(知道题意就非常好解了) 大致题意: 一条河长度为 L,河的起点(Start)和终点(End)分别有2块石头,S到E的距离就是L. 河中有n块石头,每块石头到S都有唯一的距 ...

  3. 安卓面试精华(Activity部分)

    过几天小弟要去面试了,当然免不了要好好复习下功课,其实很多东西也不是特别清楚,今天都当作一个回顾和巩固,希望我的这篇文章能对即将去找工作的同学有所帮助. 1. Q:什么是activity? 虽然这个问 ...

  4. Internet基础

    互联网是什么? Internet是一个互联网,它是将提供不同服务的,使用不同技术的,具有不同功能的物理网络互连起来而形成的. TCP/IP是一个协议集,它对Internet中主机的寻址方式,主机的命名 ...

  5. 基于visual Studio2013解决C语言竞赛题之1024求和

          题目 解决代码及点评 /* 已知有N个无规律的正整数,请编程序求出其中的素数并打印出能被5整除的数之积. */ #include <stdio.h> # ...

  6. C++-struct类的新特性当class用

    #include <iostream> #include <iomanip> #include <string> using namespace std; stru ...

  7. 浅谈IM软件业务知识——非对称加密,RSA算法,数字签名,公钥,私钥

    概述 首先了解一下相关概念:RSA算法:1977年由Ron Rivest.Adi Shamirh和LenAdleman发明的.RSA就是取自他们三个人的名字. 算法基于一个数论:将两个大素数相乘很ea ...

  8. CodeForces 462B Appleman and Card Game(贪心)

    题目链接:http://codeforces.com/problemset/problem/462/B Appleman has n cards. Each card has an uppercase ...

  9. G - Self Numbers(2.2.1)

    G - Self Numbers(2.2.1) Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%I64d & % ...

  10. 某公司ASP.NET应聘上机试题

    ASP.NET笔试题是ASP.NET程序员面试必须经历的,一般会叫你填两个表 1个是你的详细信息表 1个是面试题答卷 两个都要注意反正面是否都有内容不要遗漏,如果考你机试一般也有两种,就是程序连接数据 ...