南京大学OS笔记(1)-应用眼中的操作系统
南京大学OS笔记(1)-应用眼中的操作系统
早就想刷一刷南大JYY老师的os课。之前稍微看过几节,果然讲的风趣幽默,而且现场写代码展示水平确实很高,这次准备认真刷一刷然后好好记一下笔记。当然lab就不做了,因为已经做过mit的lab了。刷课主要是为了复习基础知识和学的更深入一点。第一节操作系统历史就不记笔记了,直接从第二节开始
1. 什么是应用程序
1. (应用)程序
这里学到和csapp里的一致的。下面看一系列代码演示
当我gcc -c a.c
的时候会生成一个a.o。注意-c表示编译。这里的a.o
是可重定位目标文件。而不是可执行目标文件。
而在执行gcc a.o
就会把它变成一个可执行目标文件。这里我在我自己的Linux机器上报错了。
总结一下,程序就是可执行的二进制文件,无论什么程序在Linux
系统下都是如此的。
2. ELF二进制文件
正因如此,我们可以用vim直接打开/bin/ls
这是一个二进制文件,所以这里直接显示乱码。
xxd
可以用来读二进制文件
这里的Entry point address
表示它第一条指令的起始地址。
3. 最简单的" Hello World"
1. 如果我们有一个下面这样的代码
int main () {
printf("Hello World\n");
}
可以直接运行吗。看起来没什么问题,但我们试试
这里会提示我们没有定义
puts
,明明是调用了printf
为什么会提示puts
这是因为printf在底层实际上调用了puts
这是因为gcc即便在没有设置优化的情况下。也就是
- o0
的情况下还是会做优化,把printf简化成了puts第二个问题是这里提示了warninng是我们没有制定代码的起始位置
2. 如果我们再尝试一次代码
int main() {
}
这是一个完全空的代码。但是它还是会报错
我们需要用gdb调试一下,看看到底为什么出错了
我们需要单步执行,执行到retrun这里。return指令就是调用main函数的地方。
因此在这里我们触发了段错误。这里我们不能访问地址为1的地方
3. 正确的尝试
这里jyy老师引入了一段汇编代码。让hello程序变得正确
这里单步执行到了系统调用
%eax 传递系统调用号
%rdi 传递第一个参数 ,以此类推
2. 应用程序怎么调用操作系统
1.首先看一下syscall的代码在哪里
objdump
指令解释
Displays information about one or more object files.
这里可以发现我们所有的系统调用都是callq syscall@plt
-动态链接来自于libc
的代码
2. Main()之前发生了什么?
(面试题)一个普通的C程序第一条指令子啊哪里?
- main的第一条指令
- libc的_start
可以用gdb调试一下会发现。它的第一条指令会在lib64/ld-linux-x86-64.so
这是操作系统自带的加载器
下面输入info inferiors
看一下有什么问题
- 我们发现我们现在运行的这个程序进程号是12305。
- 我们使用
pmap 12305
输出这个进程的信息。
会发现os已经帮我们做了很多事情所以整个过程是
os自带的加载器---> 加载libc------> 加载a.out
看下面这个程序。
虽然main是空的。,但是这里的
Hello World
Goodbye, Cruel OS World
还是可以正常输出
3. Trace的使用
使用strace可以追踪系统调用
这里跟随课上jyy老师的脚步分析一下a.out
的系统调用
- 可以发现第一条系统调用是
execve
- 然后libc执行了一堆系统调用
- 最后才会到我们自己写的程序
3. 应用眼中的操作系统
可以说所有的程序都是类似的,不断的调用系统调用。从开始到关闭
1. gcc的系统调用过程
这里的gcc确实是先利用as来做编译
然后用collect2来做链接
collect2主要用来做合成,会把构造器和析构器的代码生成出来
- 在gcc的最后会调用ld。
2. 其他的应用程序
南京大学OS笔记(1)-应用眼中的操作系统的更多相关文章
- 黑苹果之DELL台式机安装Mac OS X 10.13.6版本操作系统
由于本人所在的公司一般都是DELL的品牌台式机,所以以DELL台式机做小白鼠.记得在2012年的时候,在当时的那家公司为了学习自学IOS开发的Objective-C开发语言的时候,由于囊中羞涩买不起m ...
- 论鸿蒙OS在某些人眼中的样子
对于鸿蒙OS,博客园有一篇文章<为鸿蒙OS说两句公道话(我对鸿蒙OS的一些看法)>.有兴趣的可以看看. 在这篇文章中,个人觉得最精彩的不是文章本身,而是评论内容. 下面我挑一些出来,和大家 ...
- 进程描述和控制(os 笔记二)
进程描述和控制 计算机最初的主要任务之一就是高效的自动化我们的工作,完成用户交付的任务.而这种任务在计算机中的表示就是一个个的进程.从上一篇文章中描述的计算机的发展历史我们能发现,无论是单道批处理 ...
- uc/os 笔记(转)
1.uC/OS-II中使用互斥信号对象应该注意 互斥信号对象(Mutual Exclusion Semaphore)简称Mutex,是uC/OS-II的内核对象之一,用于管理那些需要独占访问的资源,并 ...
- 线程、对称多处理和微内核(OS 笔记三)
线程.对称多处理 这一部分继续深入探讨与进程管理相关的高级概念并了解多处理机的对称多处理技术. 进程和线程 到目前为止提出的进程的概念包含两个特点: 资源所有权 存放进程映像的虚拟地址空间 调度/ ...
- 操作系统概述(os 笔记一)
操作系统概述 操作系统的目标和功能 1.目标:作为用户/计算机接口 计算机的使用人群大致可以分为三类,终端用户,程序开发者,操作系统设计人员. 对于终端用户,即应用程序的用户来说,他们通常不关注计 ...
- LwIP应用开发笔记之一:LwIP无操作系统基本移植
现在,TCP/IP协议的应用无处不在.随着物联网的火爆,嵌入式领域使用TCP/IP协议进行通讯也越来越广泛.在我们的相关产品中,也都有应用,所以我们结合应用实际对相关应用作相应的总结. 1.技术准备 ...
- OS笔记047代理传值和block传值
在两个不同的控制器之间传递数据,可以使用代理传值或者block传值. 例子是一个简单通讯录. 主界面如下: 添加联系人界面 查看/编辑联系人界面:默认是查看模式,点击编辑后进入编辑模式 编辑模式 数据 ...
- Grails笔记一:windows8.1操作系统cmd下grails命令无效
最近决定使用intellij idea工具来开发基于Grails框架的应用程序,,在安装好jdk 1.7以及配置好jdk和grails环境变量后进行grails测试,在win8.1的命令行窗口中输入以 ...
随机推荐
- P4332-[SHOI2014]三叉神经树【LCT】
正题 题目链接:https://www.luogu.com.cn/problem/P4332 题目大意 给出\(n\)个点的一棵有根三叉树,保证每个点的儿子个数为\(3\)或者\(0\),每个叶子有一 ...
- Hyper-V CPU设置
前言 最近在用Hyper-V测试项目,发现在运行过程中发现项目总数崩掉,几经发现有一个共性,CPU占用率100%,分析问题发现问题出在Hyper-V CPU设置上,Hyper-V装系统就不赘述了,网上 ...
- 小米路由器4a千兆版刷openwrt
现在网上搜小米路由器4a千兆版刷机的都是刷的padavan的,很少能找到openwrt的刷机教程. 首先刷openwrt系统的时候要先刷入引导程序breed,网上有一篇帖子写的很详细(https:// ...
- MySQL学习总结:提问式回顾 undo log 相关知识
原文链接:MySQL学习总结:提问式回顾 undo log 相关知识 1.redo 日志支持恢复重做,那么如果是回滚事务中的操作呢,也会有什么日志支持么? 也回滚已有操作,那么就是想撤销,对应的有撤销 ...
- Java(40)网络编程
作者:季沐测试笔记 原文地址:https://www.cnblogs.com/testero/p/15201659.html 博客主页:https://www.cnblogs.com/testero ...
- C# 提取PDF中的表格
本文介绍在C#程序中(附VB.NET代码)提取PDF中的表格的方法,调用Spire.PDF for .NET提供的提取表格的类以及方法等来获取表格单元格中的文本内容:代码内容中涉及到的主要类及方法归纳 ...
- 微信小程序中路由跳转
一.是什么 微信小程序拥有web网页和Application共同的特征,我们的页面都不是孤立存在的,而是通过和其他页面进行交互,来共同完成系统的功能 在微信小程序中,每个页面可以看成是一个pageMo ...
- wget命令8种实用用法
大家好,我是良许. wget 是一个可以从网络上下载文件的免费实用程序,它的工作原理是从 Internet 上获取数据,并将其保存到本地文件中或显示在你的终端上. 这实际上也是大家所使用的浏览器所做的 ...
- Go语言核心36讲(Go语言进阶技术五)--学习笔记
11 | 通道的高级玩法 我们已经讨论过了通道的基本操作以及背后的规则.今天,我再来讲讲通道的高级玩法. 首先来说说单向通道.我们在说"通道"的时候指的都是双向通道,即:既可以发也 ...
- 【UE4】GAMES101 图形学作业0:矩阵初识
作业描述 给定一个点P=(2,1), 将该点绕原点先逆时针旋转45◦,再平移(1,2), 计算出变换后点的坐标(要求用齐次坐标进行计算). UE4 知识点 主要矩阵 FMatrix FBasisVec ...