linux内核基础(系统调用,简明)
内核基础(系统调用)
在说系统调用之前。先来说说内核是怎么和我们交互的。或者说是怎么和我们产生交集的。
首先,内核是用来控制硬件的仅仅有内核才干直接控制硬件,所以说内核非常重要,假设内核被控制那么电脑的一切都被控制了,所以我们须要把内核保护起来。所以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内核基础(系统调用,简明)的更多相关文章
- Linux内核基础优化
Linux内核基础优化 net.ipv4.ip_forward = 1 #开启网络转发 net.ipv4.conf.default.rp_filter = 0 #开启代理功能 net.ipv4.con ...
- linux内核增加系统调用--Beginner‘s guide
Linux内核中设置了一组用于实现系统功能的子程序,称为系统调用.系统调用和普通库函数调用非常相似明知是系统调用由操作系统核心提供,运行于核心态,而普通的函数调用由函数库或用户自己提供,运行于用户态. ...
- Linux内核基础
Linux系统运行的应用程序通过系统调用来与内核通信.应用程序通常调用库函数(比如C库函数)再有库函数通过系统调用界面,让内核带其完成各种不同的任务. 下面这张图显示的就是应用程序,内 ...
- linux内核增加系统调用--Beginner's guide
Linux内核中设置了一组用于实现系统功能的子程序,称为系统调用.系统调用和普通库函数调用非常相似明知是系统调用由操作系统核心提供,运行于核心态,而普通的函数调用由函数库或用户自己提供,运行于用户态. ...
- Linux内核基础--事件通知链(notifier chain)
转载: http://blog.csdn.net/wuhzossibility/article/details/8079025 http://blog.chinaunix.net/uid-277176 ...
- 深入理解Linux内核-系统调用
系统调用:用户态进程向内核发出的,实现用户态进程调用硬件设备的函数或者中断:优点:使编程更容易,将用户从学习硬件设备的低级编程特性中解放:提高系统到安全性,内核在满足请求之前可以做正确性检查:提高可移 ...
- Linux内核基础--事件通知链(notifier chain)good【转】
转自:http://www.cnblogs.com/pengdonglin137/p/4075148.html 阅读目录(Content) 1.1. 概述 1.2.数据结构 1.3. 运行机理 1. ...
- Linux内核基础--事件通知链(notifier chain)【转】
转自:http://blog.csdn.net/wuhzossibility/article/details/8079025 内核通知链 1.1. 概述 Linux内核中各个子系统相互依赖,当其中某个 ...
- 向linux内核加入系统调用新老内核比較
2.6内核 1>改动linux-source-2.6.31/kernel/sys.c文件,在文件末尾加入系统响应函数.函数实现例如以下: asmlinkage int sys_mycall(in ...
随机推荐
- poj 2891 Strange Way to Express Integers(中国剩余定理)
http://poj.org/problem?id=2891 题意:求解一个数x使得 x%8 = 7,x%11 = 9; 若x存在,输出最小整数解.否则输出-1: ps: 思路:这不是简单的中国剩余定 ...
- 【Cocos2d-x游戏引擎开发笔记(25)】XML解析
原创文章,转载请注明出处:http://blog.csdn.net/zhy_cheng/article/details/9128819 XML是一种非常重要的文件格式,由于C++对XML的支持非常完善 ...
- c语言,enum
在设置错误代号时,使用enum比宏更好看. #include <stdio.h> typedef enum { retOK = 0, errComInterruption = 0x1000 ...
- HTML - HTML Commonly Used Character Entities
HTML Entities Some characters are reserved in HTML. It is not possible to use the less than (<) o ...
- EasyUI - Tabs 选项卡标签
基本效果: 效果图: html代码: <div id="tab"> <div title="tab1" > <p>tab1& ...
- 如何获得getElementById的length这个数值?
a=document.getElementById("a").innerHTML.length;我觉得你应该这么写 如果是文本框的话document.getElementById( ...
- boost::asio async_write也不能保证一次发完所有数据 二
只有看boost源码才能弄明白发生了什么.首先我是将vector里面写入了数据,然后用boost::asio::buffer将vector构造成了mutable_buffer_1对象. 参考该文档的重 ...
- 语音信号处理之(三)矢量量化(Vector Quantization)
语音信号处理之(三)矢量量化(Vector Quantization) zouxy09@qq.com http://blog.csdn.net/zouxy09 这学期有<语音信号处理>这门 ...
- TCP与UDP各自特点对比
UDP和TCP是我们最常用的两种通信方式,下面就两者之间的特点做一个对比: 1.UDP主要用在实时性要求高以及对质量相对较弱的地方,如流媒体. 2.TCP既然是面向连接的,那么运行环境必然要求其保证可 ...
- [Unity3D]Unity3D发展偷看游戏初期阶段NGUI
朋友,大家晚上好. 我是秦培.欢迎关注我的博客,我的博客地址blog.csdn.net/qinyuanpei.近期博主開始研究NGUI了,由于NGUI是Unity3D中最为流行的界面插件,所以不管从学 ...