linux第二次读书笔记
第五章系统调用
系统调用是用户进程与内核进行交互的接口。为了保护系统稳定可靠,避免应用程序恣意忘形。
5.1与内核通信
系统调用在用户空间进程和硬件设备间添加了一个中间层,
作用:为用户空间提供了一种硬件的抽象接口;保证了系统的稳定和安全,避免应用程序不正确使用硬件,窃取其他进程的资源,或做出危害系统的行为;为了实现多任务和虚拟内存。
Linux提供的系统调用比大部分操作系统少得多。
5.2 API、POSIX、和C库
一个API定义了一组应用程序使用的编程接口。(API和系统调用不是一一对应)API可以在各种不同的操作系统上实现,给应用程序提供完全相同的接口,而API本身的实现在不同系统中可能迥异。
Unix的API基于POSIX,Linux尽力与POSIX和SUSv3兼容
Linux的系统调用作为C库的一部分提供。
5.3系统调用
访问系统调用通常通过C库中定义的函数调用,通常需要定义参数,而且可能产生副作用(使系统状态发生改变)。系统调用还会返回了一long类型的值表示成功或错误。
定义系统调用:asmlinkage long sys_***
限定词 返回类型 命名规则
系统调用号:每个系统调用被赋予一个系统调用号,用户空间执行系统调用时,用系统调用号指明系统调用。一旦分配不再变更,系统调用被删除,其系统调用号也不允许回收利用。内核记录了系统调用表中所有已注册的系统调用列表,存储在sys_call_table中
系统调用的性能:Linux系统调用比其他操作系统要快,原因:上下文切换时间短;系统调用程序和系统调用都很简洁。
5.4系统调用处理程序
内核驻留在受保护的地址空间上,因此应用程序要通知内核自己需要使用系统调用。通知内核是靠软中断实现,引发异常时系统切换到内核态。通过int $0x80触发中断,执行128号异常处理程序(系统调用处理程序)
指定恰当的系统调用:X86上系统调用号通过eax寄存器传递给内核
参数传递:除了系统调用号还需要传递外部参数,按顺序存储在ebx,ecx,edx,esi和edi五个寄存器中,很少有需要六个参数的。
5.5系统调用的实现
实现系统调用:1、决定用途(不提倡采用多用途);2、调用的参数、返回值和错误码应该是什么(借口力求简洁,参数尽可能少,力求稳定);3、设计接口尽量为将来做考虑(是否有不必要的限制,是否可移植);
提供机制(mechaniam)不提供策略(policy)
参数验证:必须仔细检查参数是否合法有效,因为系统调用在内核空间执行,如果有不合法输入,那会威胁系统安全和稳定。最重要的检查是 检查用户提供的指针是否有效。在接收一个用户空间的指针之前,内核必须保证1、指针指向的内存区域属于用户空间。进程绝不能哄骗内核去读内核空间的数据;2、指针指向的内存区域在进程的地址空间里。进程绝不能哄骗内核去读其他进程的数据;3、进程绝不能绕过内存访问限制。
内核提供copy_to_user(),copy_from_user()两个方法完成检查拷贝数据
5.6系统调用上下文
内核在执行系统调用的时候处于进程上下文,在进程上下文中,内核可以休眠,并且可以被抢占。休眠说明系统调用可以使用内核提供的绝大部分功能。可以抢占说明新进程可以使用相同的系统调用。
绑定一个 系统调用的最后步骤:1、在系统调用表的最后加入一个表项;2、系统调用号必须定义于<asm/unistd.h>;3、系统调用必须被编译进内核映像。
从用户空间访问系统调用:只写出系统调用gilc恐怕并不提供支持。Linux本身提供一组宏_syscalln(),n的范围从0到6,代表需要传递给系统调用的参数个数。
新建一个系统调用的好处:1、系统调用容易创建且使用方便;2、系统调用很高效。
新建一个系统调用的坏处:1、需要系统调用号,这需要一个内核在处于开发版本的时;候官方分配给你;2、系统调用的接口不允许改动;3、需要将系统调用分别注册到每个需要支持的体系结构中;4、在脚本中不容易调用系统调用,也不能从文件系统直接访问系统调用;5、对于简单信息交换,系统调用大材小用;
linux第二次读书笔记的更多相关文章
- 20135320赵瀚青LINUX第二章读书笔记
第二章-从内核出发 获取内核代码 使用git 获取最新提交到版本树的一个副本 $ git clone git://git.kernel.org/pub/scm/linux/kernel/git/tor ...
- Linux第二章读书笔记
1.获取内核源码 1.1Git 分布式的:下载和管理Linux内核源代码: - 获取最新提交到版本树的一个副本 $ git clone git://git.kernel.org/pub/scm/lin ...
- 2013337朱荟潼 Linux第二章读书笔记——从内核出发
1.获取内核源码 1.1Git 分布式的:下载和管理Linux内核源代码: - 获取最新提交到版本树的一个副本 $ git clone git://git.kernel.org/pub/scm/lin ...
- 《深入理解Linux内核》 读书笔记
深入理解Linux内核 读书笔记 一.概论 操作系统基本概念 多用户系统 允许多个用户登录系统,不同用户之间的有私有的空间 用户和组 每个用于属于一个组,组的权限和其他人的权限,和拥有者的权限不一样. ...
- Linux第二次学习笔记
#Linux第二次实验(第三周) 学习目标 熟悉Linux系统下的开发环境 熟悉vi的基本操作 熟悉gcc编译器的基本原理 熟练使用gcc编译器的常用选项 熟练使用gdb调试技术 熟悉makefile ...
- Linux内核分析 读书笔记 (第一章、第二章)
第一章 Linux内核简介 1.1 Unix的历史 Unix很简洁,仅仅提供几百个系统调用并且有一个非常明确的设计目的. 在Unix中,所有东西都被当做文件,这种抽象使对数据和对设备的操作是通过一套相 ...
- 《鸟哥的Linux私房菜:基础学习篇》第二部分读书笔记
一.Linux的文件权限与目录配置 1. Linux用户身份与用户组记录的文件:默认情况下,/etc/passwd记录所有的系统账号与一般身份账号及root的相关信息,/etc/shadow记录个人的 ...
- linux私房菜-读书笔记
第零章:计算机概论 计算机:接受用户输入指令和数据,经过中央处理器的数据和逻辑单元运算处理器处理后,以产生或存储成有用的信息. 计算机硬件的五大单元:输入单元.输出单元.CPU内部控制单元.算术逻辑单 ...
- 《Linux程序设计》--读书笔记---第十三章进程间通信:管道
管道:进程可以通过它交换更有用的数据. 我们通常是把一个进程的输出通过管道连接到另一个进程的输入: 对shell命令来说,命令的连接是通过管道字符来完成的: cmd1 | cmd2 sh ...
随机推荐
- IntelliJ IDEA 创建Spring项目
第一步:点击file --> new --> project... 第二步: 在左侧选择Spring, 然后勾选Spring , 最后点击Next 第三步 : 填写项目名称和项目地址,点击 ...
- 个人技术博客——linux服务器配置以及flask框架
本次的软件工程实践,我负责我们组后台服务的搭建,我选用了bandwagon的服务器,安装的是Debian GNU/Linux,全程在root用户下操作,后端服务是用python的flask框架,数据库 ...
- File类_常见的方法(获取目录内容)
获取当前目录下的文件以及文件夹,包含隐藏文件 调用list方法的File对象中封装的必须是目录否则会发生空指针异常,如果封装的是系统级的目录也会发生空指针异常(因为数组根本就没有创建成功) 如果目录存 ...
- C++整形转化成string类型---路径拼接在批处理程序中的应用
上"酸菜" // show_dateset_image.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include ...
- Java SE和Java EE应用的性能调优
凡事预则立,不预则废,和很多事情一样.Java性能调优的成功.离不开行动计划.方法或策略以及特定的领域背景知识.为了在Java性能调优工作中有所成就.你得超越"花似雾中看"的状态, ...
- nat表使用
Net Address Translation 网络地址转换 IP地址 私网IP:nat技术将私网IP转换公网IP 公网IP: iptables nat表:三条链 主要用PREROUTING,POST ...
- 用脚本将excel,csv等文件导入数据库
文章转自 http://blog.csdn.net/lky5387/article/details/6043009 1.--导excel文件 select 订单编码 from OpenRowSet( ...
- C++ new/malloc、delete/free
1.new和delete是运算符,可以被重载:malloc和free是库函数,不能被重载. 2.new会调用对象的构造函数,delete会调用对象的析构函数:malloc和free不会.
- Git使用—第二讲
前面我们学习了Git最基本的用法,包括安装Git.创建代码仓库,以及提交本地代码.下面我们将学习Git更多的使用技巧,在开始之前,我们先给一个项目创建代码仓库,这里选择在ProviderTest项目中 ...
- Saltstack学习之二:target与模块方法的运行
对象的管理 saltstack系统中我们的管理对象叫做target,在master上我们可以采用不同的target去管理不同的minion,这些target都是通过去管理和匹配minion的id来做的 ...