系统调用

计算机基础-操作系统

核能气质少年 提交于 2020-03-31 01:58:52
1.为何要有操作系统   现在的计算机由一个或多个处理器、内存、硬盘、鼠标、键盘等一系列的硬件组成,要是程序员掌握这些多有的细节,将花费很多的时间。为了提高效率,简化开发工作,就有了操作系统来管理这些复杂的硬件,应用程序通过调用操作系统提供的简单借口来达到使用硬件的功能。 2.操作系统的位置       操作系统位于计算机硬件与应用软件之间的位置。操作系统包括 操作系统的内核 (运行于内核态,管理硬件资源),以及 系统调用 (运行于用户态,用来为应用程序提供系统调用的接口)两部分组成。 3.操作系统的功能       ①为应用程序提供简单、方便的系统调用接口;   ②管理应用程序对于硬件资源的请求,由竞态变为有序化。 4.操作系统的发展    ① 第一代计算机(1940~1955):真空管和穿孔卡片     特点: 没有操作系统的概念,所有的程序设计都是直接操控硬件   ②第二代计算机(1955~1965):晶体管和批处理系统      特点: 人员有明确的分工,程序人员、操作员等;有了操作系统的概念,程序员把自己的程序统一 放到读卡机,然后由可以把多个程序一起读取到磁带中,然后一次性执行,并输出。(不能立马修改问题)   ③第三代计算机(1965~1980):集成电路芯片和多道程序设计      特点: 多个联机终端+多道技术   ④第四代计算机(1980~至今):个人计算机 5

sleep实现原理

坚强是说给别人听的谎言 提交于 2020-03-31 01:23:35
用户程序中的睡眠: sleep() usleep() nanosleep() sleep()和nanosleep()都是使进程睡眠一段时间后被唤醒,但是二者的实现完全不同。 Linux中并没有提供系统调用sleep(),sleep()是在库函数中实现的,它是通过调用alarm()来设定报警时间,调用sigsuspend()将进程挂起在信号SIGALARM上,sleep()只能精确到秒级上。 nanosleep()则是Linux中的系统调用,它是使用定时器来实现的,该调用使调用进程睡眠,并往定时器队列上加入一个timer_list型定时器,time_list结构里包括唤醒时间以及唤醒后执行的函数,通过nanosleep()加入的定时器的执行函数仅仅完成唤醒当前进程的功能。系统通过一定的机制定时检查这些队列(比如通过系统调用陷入核心后,从核心返回用户态前,要检查当前进程的时间片是否已经耗尽,如果是则调用schedule()函数重新调度,该函数中就会检查定时器队列,另外慢中断返回前也会做此检查),如果定时时间已超过,则执行定时器指定的函数唤醒调用进程。当然,由于系统时间片可能丢失,所以nanosleep()精度也不是很高。 alarm()也是通过定时器实现的,但是其精度只精确到秒级,另外,它设置的定时器执行函数是在指定时间向当前进程发送SIGALRM信号。 sleep被打断的例子应该是

时钟中断周期对操作系统整体实时性的影响分析

怎甘沉沦 提交于 2020-03-29 03:58:14
时钟中断是操作系统最重要的中断,操作系统内核依靠时钟中断完成时间片计算和分配、定时等管理工作,是分时机制实现的基础。可以说如果没有时钟中断,操作系统将无法正常运行。时钟中断由专门的时钟芯片产生,比如PC机上的8253芯片。大多数的操作系统实现,时钟中断周期会维持在10ms到100ms之间,比如Windows操作系统,其时钟中断周期一般为10ms或者20ms。表面上看,似乎时钟中断周期越短,系统的实时性越好,因为进程或线程的运行时间片会被控制的越精确,优先级高的进程或线程会优先得到运行。但仔细分析起来,会发现实际并不是这么回事,时钟中断周期的大小与系统整体实时性关系并不十分紧密。 可用两个指标来衡量操作系统的实时性:一个是中断响应时间,即从外部中断发生,到得到操作系统处理之间的时间;另外一个是任务切入时间,即一个高优先级的线程运行所需的资源就绪,到得到调度所需的时间。时钟中断周期的大小,与这两个指标并无直接关联。 首先看中断响应时间,这个时间与硬件系统关联紧密。中断一般由外部设备引发,外部设备的控制电路连接到计算机的中断控制器上(比如PC的8259A芯片)。一旦外部设备发生中断,设备会通过一条中断引脚通知中断控制器,中断控制器根据输入引脚的状态(比如是否禁止引发中断)、输入引脚的优先级、连接到片上的其它中断引脚的情况,综合判断是否需要对该中断进行处理。如果判断结果为进一步处理

Windows Embedded CE 6.0 Internals (4) The Mechanism of API

荒凉一梦 提交于 2020-03-29 03:38:31
引言 在调用系统提供的( System call )或者自己实现的DLL文件(有导出函数)中的API时,我很好奇其中的机制,也就是:我们为什么能调用这些API? 另外,安全和效率总是矛盾的,那么CE如何保证这两者? 现在的CE是不是不堪一击,用户态进程无意的操作是否就能让系统Crash,或者几行 Shellcode 就能瓦解它的安全体系? 这个问题让我想起来前几天看到的新闻,关于Windows桌面操作系统和Mac系统安全性的比较,就像查理·米勒所说的: “Mac OS X就像是你生活在一所乡村里的,没有锁的房子,而Windows则是一间只有门闩的城市公寓。” 笔者尝试搞清楚其中的一些问题,欢迎交流,如发现文章错误或者欠妥的地方,请不吝赐教。 1.什么是系统调用? “In computing , a system call is the mechanism by which a program requests a service from an operating system's kernel .” 简单的说就是 系统内核提供给程序各种服务的一种方法 。与系统调用类似的还有异常、中断(参加 WindowsCE异常和中断服务程序初探 或者《Windows Internals》)。 “On Unix , Unix-like and other POSIX -compatible

第七周:可执行程序的装载

偶尔善良 提交于 2020-03-28 22:49:23
吕松鸿 原创作品转载请注明出处 《Linux内核分析》MOOC课程 http://mooc.study.163.com/course/USTC-1000029000 一、预处理,编译,链接和目标文件格式 1.可执行程序是怎么得来的 c代码->预处理->汇编代码->汇编器->目标代码->链接成可执行文件->加载到内核执行 2.目标文件的格式ELF 符号修饰标准、变量内层布局、函数调用方式等这些跟可执行代码二进制兼容性相关的内容称为ABI(Application Binary Interface) 常见的ABI格式: 3.静态链接的ELF可执行文件和进程的地址空间 一般静态链接将会把所有代码放在同一个代码段。 动态连接的进程会有多个代码段。 二、可执行程序、共享库和动态链接 1.可执行程序的执行环境 命令行参数和shell环境,一般我们执行一个程序的Shell环境,我们的实验直接使用execve系统调用。 Shell本身不限制命令行参数的个数, 命令行参数的个数受限于命令自身。 shell会调用execve将命令行参数和环境参数传递给可执行程序的main函数。 命令行参数和环境串都放在用户态堆栈中。 2.装载时动态链接和运行时动态链接应用举例 动态链接分为可执行程序装载时动态链接和运行时动态链接 三、可执行程序的装载 1. sys_execve内核处理过程 (1)新的可执行程序起点

第七周 可执行程序的卸载

不想你离开。 提交于 2020-03-28 22:40:52
一.预处理,编译,链接和目标文件的格式 可执行程序是怎么得来的: 预处理负责把include的文件包含进来及宏替换等工作 可执行文件的创建——预处理、编译和链接: 目标文件的格式ELF:A.out-->COFF-->PE/ELF ABI&目标文件格式: 一个可重定位保存着代码和适当的数据,用于和其他的object文件一起来创建一个可执行文件或是一个共享文件(主要是.o文件) 一个可执行文件保存着一个用来执行的程序,该文件指出exec(BA_OS)如何来创建程序进程映像(主要是.so文件) 当创建或增加一个进程映像的时候,系统理论上将拷贝一个文件的段到一个虚拟的内存段 一般静态链接会将所有代码放在一个代码段,动态链接的进程会有多个代码段 二.可执行程序,共享库和动态链接 可执行程序的执行环境 命令行参数和shell环境,一般我们执行一个程序的Shell环境即execve系统调用。 $ ls -l /usr/bin 列出/usr/bin下的目录信息 Shell本身不限制命令行参数的个数, 命令行参数的个数受限于命令自身 例如,int main(int argc, char *argv[]) 又如, int main(int argc, char *argv[], char *envp[]) Shell会调用execve将命令行参数和环境参数传递给可执行程序的main函数 int

linux学习笔记一

試著忘記壹切 提交于 2020-03-27 09:00:13
一 1.X86计算机体系是冯-诺伊曼体系,包括现在很多智能设备。 2.计算机主要由CPU(运算器和控制器),存储设备,输入输出设备。 3.运算器提供运算能力,但是只是二进制运算 控制器是协调各部件 4.组件之间的连接 以及和存储的连接 是通过总线(bus) 5.总线分为 控制总线 数据总线和地址总线 6.CPU指令集 分为特权指令和普通指令 CPU物理上分为4个环,最中心的是环0,依次外为环1,环2,环3 特权指令就是在环0上,普通指令在环3上 只有操作系统才有权限调用特殊指令 7.从底层到高的语言分别是 机器语言----汇编语言----高级语言 8.为什么要有操作系统? 生产厂商众多,所生产的硬件规格和接口也各自不同,而操作系统的作用就是将底层不统一的规格接口,向上统一成一个标准的规格和接口。 操作系统 Operating System 简写OS 9.编程层次: 硬件规格 系统调用 库调用 10.什么是程序运行? 该程序占据了CPU一部分性能,然后逐条自上向下的运行代码 11.用户接口 图形用户接口 GUI 命令行接口 CLI 用户接口程序:用户通过这个程序,调用接口 接口格式 ABI 应用编程接口 API 12.CPU的架构类型:X86 X64 ARM M68000 POWER 13.操作系统有 Windows Linux Unix GNU组织发起 软件自由运动 GNU

Linux 学习路线规划

好久不见. 提交于 2020-03-24 03:22:27
1 抛弃旧文化,迎接Linux命令新文化 Linux第一步,从Windows思维,切换到Linux的“命令行+文件”模式 在Linux中,做什么都有相应命令。一般就在bin或者sbin目录下,数量繁多。如果你事先不知道该用哪个命令,很难通过枚举的方式找到。因此,在这样没有统一入口的情况下,就需要你对最基本的命令有所掌握。 一旦找到某个命令行,替代输入框的是各种各样的启动参数。 这些参数怎么填, 一般可以通过 -h 查看help,就能找到相应的配置项 还可以通过man命令,查看文档 无论是什么命令行工具,最终的配置一般会落到一个文件上,只要找到了那个文件,文件中会有注释,也可以挨个儿看下去,基本就知道如何配置了。 攻克了第一个困难了。这个时候,你能看到一些很美丽的风景,例如一些很有技巧的命令sed和awk、很神奇的正则表达式、灵活的管道和grep、强大的bash。你可以自动化地做一些事情了,例如处理一些数据,会比你使用Excel要又快又准,关键是不用框框点点,在后台就能完成一系列操作。在处理数据的同时,你还可以干别的事情,半夜处理数据,第二天早上发个邮件报告,这都是Excel很难做到的事情。 2 通过系统调用或者glibc,掌握程序设计 命令行工具也是程序,只不过是别人写的程序。从用别人写的程序,到自己能够写程序,通过程序来操作Linux,这是第二个要攻克的困难。

[转帖]浅谈Linux进程模型

折月煮酒 提交于 2020-03-23 13:29:35
浅谈Linux进程模型 https://blog.lecury.cn/2019/04/04/浅谈Linux进程模型/ 写在前面 进程基础 进程概念 进程描述符 进程创建 上下文切换 init进程 进程应用 进程间通信 信号处理 后台进程与守护进程 浅谈nginx多进程模型 常用工具介绍 ps: 查看进程属性 lsof: 查看打开的文件情况 netstat: 查看网络连接情况 strace: 查看系统调用情况 进程基础 基础概念 进程是操作系统的基本概念之一,它是操作系统分配资源的基本单位,也是程序执行过程的实体。程序是代码和数据的集合,本身是一个静态的概念,而进程是程序的一次执行的实体,是一个动态的概念。 那在Linux操作系统中,是如何描述一个进程的呢? 进程描述符 为了管理进程,内核需要对每个进程的属性和所需要做的事情,进行清楚的描述,这个就是进程描述符的作用,Linux中的进程描述符由 task_struct 标识。 task_struct 的数据结构是相当复杂的,不仅包含了很进程属性的字段,而且也包括了指向其他数据结构的指针。大致结构如下: state: 描述进程状态 thread_info: 进程的基本信息 mm: mm_struct 指向内存区描述符的指针 tty: tty_struct 终端相关的描述符 fs: fs_struct 当前目录 files: files