20135302魏静静——课本5章学习笔记

第五章 系统调用

5.1 与内核通信

  • 中间层

    作用三个:1.为用户空间提供一种硬件的抽象接口;2.保证系统稳定和安全;3.除异常和陷入,是内核唯一的合法入口。

5.2 API、POSIX和C库

  • API定义了应用程序使用的编程接口(可实现系统调用)。
  • API、POSIX、C库与系统调用之间关系。

5.3 系统调用——syscall

5.3.1 系统调用号

  • 当用户空间的进程执行一个系统调用,就用系统调用号指明到底执行哪个系统调用。
  • sys_ni_syscall():错误号,负责“填补空缺”,返回-ENOSYS,专门针对无效的系统调用。
  • 存在sys_call_table。

5.3.2 系统调用的性能

  • 简洁高效

5.4 系统调用处理程序

  • 通知内核的机制是软中断实现的:通过引发一个异常来促使系统切换到内核态去指向异常处理程序,而此时的异常处理程序就是系统调用的处理程序。
  • x86系统上的软中断是由int $0x80指令触发128号软中断。

5.4.1 指定恰当的系统调用

  • eax寄存器传递系统调用号给内核。

5.4.2 参数传递

  • x86系统,ebx,ecx,edx,esi,edi按顺序存放前五个参数。
  • 需要6个及以上参数,应用一个单独的寄存器存放指向这些参数在用户空间地址的指针。
  • 返回值存放在eax。

5.5 系统调用的实现

1.实现系统调用

  • 决定它的用途
    不提倡采用多用途的系统调用
  • 确定参数、返回值、错误码
    力求简洁
  • 越通用越好,不做错误假设
  • 时刻注意可移植性和健壮性

    2.参数验证

    必须检查每个参数,保证他们不但合法有效,而且正确。
    最重要——检查用户提供的指针:

    • 指针指向的内存区域必须属于用户空间
    • 指针指向的内存区域在进程的地址空间内
    • 决不能绕过内存访问限制
      内核无论何时都不能轻率地接受来自用户空间的指针。

※1.检查读写
(1)向用户空间写入数据——copy_to_user()
参数:

进程空间中的目的内存地址
内核空间内的源地址
需要拷贝的数据长度

(2)从用户控件读取数据——copy_from_user()
把第二个参数指定的位置上的数据拷贝到第一个参数指定的位置上
第三个参数——拷贝数据长度。

以上两个函数成功返回0,失败返回没能完成拷贝的数据的字节数。
这两个函数都有可能引起阻塞——当包含用户数据的页被换出到硬盘上而不是物理内存上的时候。

※2.检查是否有合法权限
老版本:suser()
新版本:权能机制,capable(),返回非0有权操作,返回0则无权操作。

5.6 系统调用上下文

  • 内核在执行系统调用时处于进程上下文。
    在进程上下文中,内核可以:

    • 休眠
      说明系统调用可以使用内核提供的绝大部分功能
    • 可以被抢占
      要求保证该系统调用是可重入的

    1.绑定一个系统调用的最后步骤

    1,在系统调用表的最后加入一个表项。
    2,对于所支持的各种体系结构,系统调用号都必须定义于<asm/unistd.h>中
    3,系统调用必须被编译进内核映像,不能被编译成模块。——放进kernel/下的一个相关文件中即可,例如sys.c。

    2.从用户空间访问系统调用

    Linux本身提供了一组宏,用于直接对系统调用进行访问。

    _syscalln()     //n的范围从0到6,代表需要传递给系统调用的参数个数。

    例如:

    long open(const char *filename, int flags, int mode)
    =
    #define NR_open 5
    _syscall3(long, open,const char*, filename, int, flags, int, mode)
    应用程序可以直接用open()了。

    对于每个宏来说,都有(2+2xn)个参数:

    1.系统调用的返回值类型
    2.系统调用的名称
    以后按照系统调用参数的顺序排列每个参数的类型和名称。

    _NR_open在<asm/unistd.h>中定义。
    这个宏会被扩展成为内嵌汇编的C函数。

    3.为什么不通过系统调用的方式实现

    好处:

    - 系统调用创建容易并且使用方便
    - linux系统调用的高性能

    问题:

    - 占用系统调用号
    - 固化,不允许改动接口
    - 需要分别注册到每个需要支持的体系结构中
    - 脚本中不易调用,文件系统中也不能直接访问
    - 在主内核树外难以维护使用
    - ……

    替代:

    - 某些接口,例如信号量,用文件描述符表示
    - 把增加的信息作为一个文件放在sysfs的合适位置。
时间: 2024-07-30 13:37:14

20135302魏静静——课本5章学习笔记的相关文章

20135302魏静静——课本1-2章学习笔记

第一章 Linux内核简介 一.Unix Unix是一个强大.健壮和稳定的操作系统. Unix——支持抢占式多任务.多线程.虚拟内存.换页.动态链接和TCP/IP网络. 二.操作系统和内核简介 操作系统是指在整个系统中负责完成最基本功能和系统管理的那些部分. 内核独立于普通应用程序,一般处于系统态,拥有受保护的内存空间和访问硬件设备的所有权限.这种系统态和被保护起来的内存空间,统称为内核空间.在系统中运行的应用程序通过系统调用来与内核通信. 应用程序完成其工作的基本行为方式是: 应用程序通过系统

20135302魏静静——课本18章学习笔记

第十八章 调试 一.内核中的bug 内核bug的原因可能有: - 错误代码 - 同步时发生的错误,例如共享变量锁定不当 - 错误的管理硬件 - …… 内核bug发作的症状可能有: - 降低所有程序的运行性能 - 毁坏数据 - 使得系统处于死锁状态 - …… 内核开发比起用户开发要多考虑一些独特的问题,比如: - 定时限制 - 竞争条件 - …… 原因是允许多个线程在内核中同时运行. 二.通过打印来调试 1. 健壮性 弹性极佳的函数:任何时候.任何地方都能调用它 可以在中断上下文和进程上下文中被调

20135302魏静静——课本第4章学习笔记

第4章   进程调度 调度:调度是一个平衡的过程.一方面,它要保证各个运行的进程能够最大限度的使用CP:另一方面,保证各个进程能公平的使用CPU. 调度功能:决定哪个进程运行以及进程运行多长时间. 调度实现原理:与进程的优先级有关 Linux上调度实现的方法:O(1)的调度算法 调度相关的系统调用 4.1多任务   多任务系统可以划分为两类:非抢占式多任务( cooperative multitasking )和抢占式多任务(preemptive multitasking).像所 有Unix 的

20135302魏静静——课本第17章学习笔记

第17章   模块与设备 设备类型:在所有 Unix 系统中为了统一普通设备的操作所采用的分类. 模块: Linux 内核中用于按需加载和卸载目标码的机制. 内核对象:内核数据结构中支持面向对象的简单操作,还支持维护对象之间的父子关系. sysfs :表示系统中设备树的一个文件系统. 1. 设备类型 三种类型 块设备 字符设备 网络设备 2. 模块 1. Hello,World 模块的所有初始化函数必须符合形式:int my _ init (void); 退出函数必须符合形式:void my_e

20135302魏静静——课本第3章学习笔记

第三章   进程管理 本章主要内容: 进程和线程 进程的任务结构 进程和线程的创建 进程的终止 1. 进程和线程 进程:进程就是处于执行期的程序,实际上,进程就是正在执行的程序代码的实时结果: 线程:执行线程,简称线程,是进程中活动的对象(每个线程拥有独立的程序计数器.进程栈.和一组进程寄存器),内核调度的对象是线程,不是进程 进程提供2种虚拟机制:虚拟处理器和虚拟内存 每个进程有独立的虚拟处理器和虚拟内存, 每个线程有独立的虚拟处理器,同一个进程内的线程有可能会共享虚拟内存. 内核中进程的信息

20135302魏静静——Linux课程期中总结

Linux期中总结 Linux课程第一周实验及总结:[http://www.cnblogs.com/20135302wei/p/5218607.html] 冯诺依曼体系结构的核心思想是存储程序计算机.在计算机中有两种指令,一是用户指令,一是系统调用. 当用户使用计算机时,计算机根据其汇编的指令一步步运行,当使用系统调用完后,再返回用户模式,保证系统的稳定. 程序中执行call的堆栈变化 汇编基础 通用寄存器 16位  32位 AX    eax 累加器BX    ebx 基址寄存器CX    e

【tapestry3笔记】--tapestry 初探,《 tapestry in action 》第一章学习笔记

由于要维护一个项目,要用到tapestry3这个老框架,虽然这个框架很老,但是在我看来ta的思想还是很先进的---面向组件编程. 由于网上资料少的可怜,辛苦找了很久终于找到一本名为<tapestry in action>的工具书,以下学习笔记均以此书为参考. 正文---tapestry初探 tapestry in action 第一章学习笔记 tapestry是一款以组件为核心的开发框架,组件就向一个黑盒子,我们无需关系组件是如何实现的,只需合理使用即可.这有点像jquery的插件,我们无需关

《Linux内核设计与实现》第一、二章学习笔记

<Linux内核设计与实现>第一.二章学习笔记 姓名:王玮怡  学号:20135116 第一章 Linux内核简介 一.关于Unix ——一个支持抢占式多任务.多线程.虚拟内存.换页.动态链接和TCP/IP网络的现代化操作系统 1.主要发展过程   1969年,贝尔实验室的程序员们设计了一个文件系统原型,最终发展演化成了Unix 1971年,Unix被移植到PDP-11型机中 1973年,整个Unix系统使用C语言进行重写,为后来Unix系统的广泛移植铺平了道路 Unix第六版(V6)被贝尔实

安卓权威编程指南 - 第五章学习笔记(两个Activity)

学习安卓编程权威指南第五章的时候自己写了个简单的Demo来加深理解两个Activity互相传递数据的问题,然后将自己的学习笔记贴上来,如有错误还请指正. IntentActivityDemo学习笔记 题目:ActivityA登录界面(用户名.密码.登陆按钮),ActivityB(Edit,返回按键:SubmitButton).A界面输入用户名和密码传到B中,B验证用户输入的用户名和密码,如果错误就返回A,并用Toast 显示用户名和密码错误:如果正确,就在第二个 activity中显示一个Edi