南京大学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的命令行窗口中输入以 ...
随机推荐
- Loj#6503-「雅礼集训 2018 Day4」Magic【分治NTT】
正题 题目链接:https://loj.ac/p/6503 题目大意 \(n\)张卡\(m\)种,第\(i\)种卡有\(a_i\)张,求所有排列中有\(k\)对相邻且相同的卡牌. \(1\leq n\ ...
- P4770-[NOI2018]你的名字【SAM,线段树合并】
正题 题目链接:https://www.luogu.com.cn/problem/P4770 题目大意 给出一个长度为\(n\)的字符串\(S\).\(q\)次询问给出一个串\(T\)和一个区间\([ ...
- Vue2.0 基础入门
前言:" 今生遇汝,何其幸哉:于我蒙昧之时遇到你,于我大雾初透之时爱上你,于我大智初醒之时沉沦你. " 官网: 介绍 - Vue.js (vuejs.org) 指令与修饰符 创建实 ...
- C++ Primer 查漏补缺 —— C++ 中的各种初始化
初学者在刚开始读 C++ Primer 的时候,总是容易被书中各种初始化搞得头大:默认初始化.列表初始化.值初始化.类内初始值.构造函数初始值列表.new int 和 new int() 的区别... ...
- 感恩笔记之SQL语句操纵数据集基本功能模板
SQL查询_基本功能 一 SQL语句整体架构 SELECT --1 查询数据表 INTO --2 新建数据表 FROM --3 查询数据表 WHERE --4 筛选数据表 ORDER BY --5 排 ...
- 无法解析的外部符号之_cvLoadImage,_cvCreateMat,_cvReleaseImage之类
一个错误可能是:附加依赖项少添加了库函数: 还有一个可能是:配置设置错误了,比如该是64位,却设置成win32了.改过来就好了. 要注意opencv的使用中 在Debug.Release模式以及x64 ...
- 分析你的第一个Android程序
目录 分析你的第一个Android程序 Android模式的项目结构 切换项目结构模式 Project模式的项目结构 .gradle和idea app build(没有发现这个文件夹) gradle ...
- 2020.5.16-ICPC Central Europe Regional Contest 2019
A. ABB #include <bits/stdc++.h> using namespace std; #define PB push_back #define ZERO (1e-10) ...
- 395.至少有 K 个重复字符的最长子串
题目 给你一个字符串 s 和一个整数 k ,请你找出 s 中的最长子串, 要求该子串中的每一字符出现次数都不少于k .返回这一子串的长度. 示例 1: 输入:s = "aaabb" ...
- Java-基础-ArrayList
1. 简介 ArrayList 实现了 List 接口,其底层基于数组实现容量大小动态可变.既然是数组,那么元素存放一定是有序的,并允许包括 null 在内的所有元素. 每个 ArrayList 实例 ...