系统调用

shell简介

三世轮回 提交于 2020-01-31 03:12:36
1、什么是shell: Shell(壳)是一种用C语言编写的程序(命令解释器),是连接用户和Unix/Linux内核的桥梁。 它的功能和windows的图形界面是一样的,只不过操作的形式不一样。 它通过建立文件的形式并行的运行多个程序,帮助用户完成很多工作。 Shell即是一种命令语言,也是一种程序设计语言。 作为命令语言的时候,shell的工作形式是交互式的,用户输入一行命令,shell根据命令内容给出用户反馈信息; 作为程序设计语言时,shell的工作形式是非交互式的,在它的程序语言中,提供了许多参数和变量,并具有在高级程序语言中才具有的控制结构(if case while ),但是,shell程序不需要编译,而是从脚本文件中读取一行命令,执行一行,所以又称为解释行语言。 linux操作系统结构主要体现的是:用户空间和内核空间之间进行信息交换时,系统调用起着关键性的作用。 shell在这里,上通各种应用程序(以文件的形式存放在磁盘中)下通系统调用,好像胶水一样,将各种小功能程序和内核粘了起来,并在粘的节点处开了个接口,这使得各种小功能程序可以通过这个接口协同工作,从而增强了各个程序的功能。我们也知道,Shell是可编程的,它可以执行符合Shell语法的文本,往往很短的代码就可实现非常强大的功能,原因是这些shell语句通常都对系统调用做了一层封装。 2

《Unix内核源码剖析》

北城以北 提交于 2020-01-30 11:39:19
《Unix内核源码剖析》 基本信息 作者: (日)青柳隆宏 译者: 殷中翔 丛书名: 图灵程序设计丛书 出版社:人民邮电出版社 ISBN:9787115345219 上架时间:2014-2-17 出版日期:2014 年3月 开本:16开 页码:1 版次:1-1 所属分类:计算机 更多关于》》》 《Unix内核源码剖析》 编辑推荐  精读1万行代码,深入理解操作系统原理!   超级计算机“京”的L1缓存设计者青柳隆宏经典著作!   彻底读懂Unix源代码! 内容简介 书籍 计算机书籍   《unix内核源码剖析》是一本unix v6内核源代码的阅读指南。作者结合unix v6已公开的相关文档,对unix v6的内核源码进行详细剖析,旨在让读者更深入地理解进程、中断、块i/o系统、文件系统、字符i/o系统、启动系统等操作系统的基本原理。   《unix内核源码剖析》适合操作系统的初中级学习者阅读,特别适合通过大学课程和其他入门书对操作系统有所了解,但是对具体细节缺乏深入理解的读者,以及那些对操作系统的具体实现有兴趣的读者。 目录 《unix内核源码剖析》 第i部分 什么是unix v6  1 第1章 unix v6的全貌  2 1.1  什么是unix  v6  2 1.2  unix的历史2 1.3  unix  v6内核  4 1.4  构成unix v6运行环境的硬件  4

Java I/O体系原理

℡╲_俬逩灬. 提交于 2020-01-29 00:20:15
基础概念 在介绍I/O原理之前,先重温几个基础概念: (1) 操作系统与内核 操作系统:管理计算机硬件与软件资源的系统软件内核:操作系统的核心软件,负责管理系统的进程、内存、设备驱动程序、文件和网络系统等等,为应用程序提供对计算机硬件的安全访问服务 2 内核空间和用户空间 为了避免用户进程直接操作内核,保证内核安全,操作系统将内存寻址空间划分为两部分:内核空间(Kernel-space),供内核程序使用用户空间(User-space),供用户进程使用 为了安全,内核空间和用户空间是隔离的,即使用户的程序崩溃了,内核也不受影响 3 数据流 计算机中的数据是基于随着时间变换高低电压信号传输的,这些数据信号连续不断,有着固定的传输方向,类似水管中水的流动,因此抽象数据流(I/O流)的概念:指一组有顺序的、有起点和终点的字节集合, 抽象出数据流的作用:实现程序逻辑与底层硬件解耦,通过引入数据流作为程序与硬件设备之间的抽象层,面向通用的数据流输入输出接口编程,而不是具体硬件特性,程序和底层硬件可以独立灵活替换和扩展 I/O 工作原理 1 磁盘I/O 典型I/O读写磁盘工作原理如下: tips: DMA:全称叫直接内存存取(Direct Memory Access),是一种允许外围设备(硬件子系统)直接访问系统主内存的机制。基于 DMA 访问方式,系统主内存与硬件设备的数据传输可以省去CPU

用户级线程和内核级线程的区别

我们两清 提交于 2020-01-28 15:29:13
线程的实现可以分两类:用户级线程,内核级线程和混合式线程。 用户级线程是指不需要内核支持而在用户程序中实现的线程,它的内核的切换是由用户态程序自己控制内核的切换,不需要内核的干涉。但是它不能像内核级线程一样更好的运用多核CPU。 优点: (1) 线程的调度不需要内核直接参与,控制简单。 (2) 可以在不支持线程的操作系统中实现。 (3) 同一进程中只能同时有一个线程在运行,如果有一个线程使用了系统调用而阻塞,那么整个进程都会被挂起,可以节约更多的系统资源。 缺点: (1) 一个用户级线程的阻塞将会引起整个进程的阻塞。 (2) 用户级线程不能利用系统的多重处理,仅有一个用户级线程可以被执行。 内核级线程:切换由内核控制,当线程进行切换的时候,由用户态转化为内核态。切换完毕要从内核态返回用户态。可以很好的运用多核CPU,就像Windows电脑的四核八线程,双核四线程一样。 优点: (1)当有多个处理机时,一个进程的多个线程可以同时执行。 (2) 由于内核级线程只有很小的数据结构和堆栈,切换速度快,当然它本身也可以用多线程技术实现,提高系统的运行速率。 缺点: (1) 线程在用户态的运行,而线程的调度和管理在内核实现,在控制权从一个线程传送到另一个线程需要用户态到内核态再到用户态的模式切换,比较占用系统资源。(就是必须要受到内核的监控) 关联性 (1) 它们之间的差别在于性能。 (2)

操作系统特征、功能和用户接口

北慕城南 提交于 2020-01-28 05:00:58
1、操作系统特征 ( Characteristics of OperatingSystems ) 并行性 并行性和并发性是既相似又有区别的两个概念。并行性是指两个或多个事件在同一时刻发生,而 并发性是指两个或多个在同一时间间隔内 发生。在 多道程序环境 下, 并发性是指宏观上在一段时间内有多道程序在同时执行 。但在单处理机系统中,每一个时刻仅能执行一道程序,故微观上,这些程序是在交互执行。 共享性(Sharing) 共享是指系统中的所有资源不再为一个程序所独占,而是供同时存在于系统中的多道程序所共同使用。根据资源属性不同,可有 互斥共享 和 同时共享 两种不同的共享方式。 并发和共享关系: 并发和共享是操作系统的两个最基本的特性,它们又是互为存在条件。一方面资源共享是以程序(进程)的并发性执行为条件的,若系统不允许程序并发执行,自然不存在资源共享问题。另一方面若系统不能对资源共享实施有效管理,则也必将影响到程序并发执行。 虚拟性(Virtual) 虚拟是指通过某种技术把一个物理实体变成若干个逻辑上的对应物。物理实体是实际存在的,是实的;逻辑物体是用户感觉到的,是虚拟的。例如在单CPU多道分时系统中,通过多道程序技术和分时技术可以把一个物理CPU虚拟为多个逻辑上的CPU,使每个终端用户都认为有一台“独立”的CPU为它运行,用户感觉的CPU是虚拟CPU。 异步性

【Linux】系统调用简单了解

不问归期 提交于 2020-01-26 22:55:57
系统调用决定了操作系统是否好用,功能是否齐全。 进程管理 创建进程:fork 原进程叫父进程,新进程叫子进程。 当父进程fork创建子进程时,采用写时拷贝的方案。先是父子共用同一内存,如果有一方要写数据,就会将该内存块进行拷贝。然后再写。 fork可以根据返回值进行对父子进程的区分。 返回0,说明是子进程。 返回非0,说明是父进程,返回的值为子进程的进程号。 子进程可以使用 exec函数族 去执行另一个程序。 父进程可以通过 waitpid系统调用 ,通过传入子进程进程号,来让父进程知道子进程的运行状态。 内存管理 每个进程都有自己独立的内存空间。 该内存空间会放入程序的代码(代码段),程序的数据(数据段)。 (这里牵扯到物理分段分页问题) 在 堆 分配内存的时候使用的系统调用, brk和mmap 。 brk分配的内存是和原来的堆连在一起的,通过调整堆的上线来扩大堆。 mmap是在映射区重新划分一块内存区域。 文件管理 在Linux下一切皆文件。 程序,进程:可执行二进制文件 配置文件:文本文件 进程间通信的管道,Socket:也是文件 设备的存储形式也是吻技安。 每一个文件,Linux都会分配一个文件描述符(一个整数),我们一般通过这个文件描述符来使用系统调用。 信号 程序执行过程中遇到异常等情况就会发生中断,发送信号给进程,进程收到信号后进一步处理。 一般不重要的会忽略

Linux课程设计报告【全集】

杀马特。学长 韩版系。学妹 提交于 2020-01-26 06:45:32
4个题目:进程创建及创建过程分析、进程族亲关系分析、进程间软中断通信、进程间管道通信 (欢迎评论/私信) 笔者用的是“ProcessOn免费在线作图网站”作的图。 报告格式要求:正文{中文:宋体、五号、单倍距;英文:Times New Roman、11号、单倍距} 一级标题{宋体、小三号、加粗} 二级标题{四号} 三级标题{小四} 不允许有四级标题 图命名{在图下方居中、宋体、五号、 仅允许出现2级图名 eg.3-1<空格>名称} 图中文字{宋体、小五} 表命名{在表上方居中、......} 表中文字{......} 页眉{学号<空格>姓名、宋体、小四、居中} 页脚{目录页码用罗马数字、正文页码用阿拉伯数字} 注* 参考文献格式要求、缩进要求 题目1 进程创建及创建过程分析 参看书P163~166 1.1设计目的 灵活运用fork系统调用创建进程,深入分析进程创建过程及fork系统调用返回值的含义,透彻分析父子进程代码共享、执行流程及数据集合的变化轨迹。 1.2设计要求 设计的程序能体现出父子进程执行轨迹的差别,也能体现出父子进程数据集合的差别。 1.3程序源代码 #include<stdio.h> #include<unistd.h> pid_t fork(void); int main() { printf("parent pid=%d\n",getpid()); pid_t

Chapter 1:进程和线程

◇◆丶佛笑我妖孽 提交于 2020-01-26 04:39:10
1.1 进程 操作系统中最核心的概念是进程:这是对正在进行程序的一个抽象。操作系统的其他所有内容都是围绕着进程的概念展开的。 进程是操作系统提供的最古老的也是最重要的抽象概念之一。没有进程的抽象,现代计算将不复存在。 1.1.1 进程模型 一个进程就是一个正在执行程序的实例,包括程序计数器,寄存器和变量的当前值。从概念上说,每个进程都拥有它自己的虚拟CPU。 由于CPU在各进程之间来回快速切换,所以每个进程执行其运算的速度是不确定的。而且当同一进程再次运行的时候,其运算速度也是不可再现的。所以,在对进程编程时决不能对时序做任何确定的假设。 关键思想:一个进程是某种类型的一个活动,它有程序,输入,输出以及状态。单个处理器可以被若干进程共享,它使用某种调度算法决定何时停止一个进程的工作,并转而为另一个进程提供服务。 1.1.2 创建进程 操作系统需要有一种方式来创建进程。有4种主导事件: 1,系统初始化 2,执行了正在运行的进程所调用的进程创建系统调用 3,用户请求创建一个新进程 4,一个批处理作业的初始化 从技术上看,在所有这些情形中,新进程都是由于一个已存在的进程执行了一个用于创建进程的系统调用而创建的。在UNIX系统中,只有一个系统调用可以用来创建新进程:fork。 1.1.3 进程的终止 永恒是不存在的。终止通常由下列条件引起: 1,正常退出。自愿的。 2,出错退出。自愿的。

如何在Linux下写汇编

对着背影说爱祢 提交于 2020-01-26 03:37:40
本文为翻译文章,原文参见: http://docs.cs.up.ac.za/programming/asm/derick_tut/ 1.NASM编译器 目前Linux下的汇编器主要有:as、as86和gas,但是本文使用的是NASM(The Netwide Assembler)。它使用Intel形式的汇编格式,和Intel形式相对的是AT&T形式的汇编格式。 2.Linux下汇编介绍 2.1DOS和Linux下汇编的主要不同 (1)DOS下的汇编,主要通过 int 21h 中断来实现各种DOS功能调用,而BIOS调用则是主要通过 int 10h 和 int 16h 中断来实现。但是在Linux中, 所有以上的功能调用都是通过内核来实现的。因此所有的功能都是通过“系统调用”来实现,而我们可以通过使用 int 80h 中断来实现系统调用。其中,Linux大约有190个左右的系统调用,比DOS下的要少。 (2)Linux是一个真正32位保护模式的操作系统,因此我们使用的是32为的汇编程序。32位汇编程序运行我们使用全部的内存(4G),这意味着我们不用在考虑段基址了,也不用在修改和操作段寄存器了,从某种程度上来说,变的更容易了。 (3)在32为汇编程序中,我们可以使用32位的寄存器 EAX、EBX、ECX等代替传统的16位寄存器 AX、BX、CX等寄存器。 2.2Linux下汇编的编写

如何实现文件隐藏

亡梦爱人 提交于 2020-01-25 23:32:02
方法: 1. 劫持系统中用于读取文件列表的系统调用 2. 劫持文件系统中的库函数,实现对于文件的隐藏 一、如何通过劫持库函数实现: 通过preload 预加载库机制进行 1. 编写注入劫持函数,并编译成动态链接库 gcc -fPIC -shared parock.c -o libmycmp.so 2. 加载预加载库 export LD_PRELOAD=绝对路径/libmycmp.so 3. 卸载预加载库 unset LD_PRELOAD 4. 单个程序加载预加载库 LD_PRELOAD=绝对路径/libmycmp.so ./pass args 二: 通过劫持系统调用函数进行 寻找内核内存中系统调用表的内存地址sys_call_table,调换该内存中某个函数地址,实现劫持函数的调用----->实现某个真正系统调用的实现。 系统调用的过程: 调用int 0x80,触发SWI中断异常,从idt(系统中断异常向量表) 表中,找到 0x80中断对应的中断处理函数(syscall),然后调用对应的sys_call,也就是call sys_call_table eax(nr_syscall),定位到sys_read,然后找到文件file节点,通过节点,找到file_operations中的操作函数.read 寻找sys_call_table地址的方法: 通过搜索system