南京大学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的命令行窗口中输入以 ...
随机推荐
- [转载]session多服务器共享的方案梳理
转载网址: http://www.cnblogs.com/wangtao_20/archive/2013/10/29/3395518.html session的存储了解以前是怎么做的,搞清楚了来龙去脉 ...
- 如何基于Security实现OIDC单点登录?
一.说明 本文主要是给大家介绍 OIDC 的核心概念以及如何通过对 Spring Security 的授权码模式进行扩展来实现 OIDC 的单点登录. OIDC 是 OpenID Connect 的简 ...
- Redis新旧复制
在Redis中,用户可以通过执行SALVEOF命令,让一个服务器去复制另一个服务器. 127.0.0.1:12345> SLAVEOF 127.0.0.1 6379 OK 6379的奴隶是123 ...
- HTML[2种特殊选择器]_伪类选择器&属性选择器
本文介绍两种特殊的选择器 1.伪类选择器 2.属性选择器 1.伪类选择器 ...: nth-of -type (x) x为同类型兄弟元素中的排名 例如: <body> <ul> ...
- 100台机器上海量IP如何查找出现频率 Top 100?
场景题 有 100 机器,每个机器的磁盘特别大,磁盘大小为 1T,但是内存大小只有 4G,现在每台机器上都产生了很多 ip 日志文件,每个文件假设有50G,那么如果计算出这 100 太机器上访问量最多 ...
- 10.6 Nginx 高并发连接
Nginx 高并发连接 什么是IO,输入输出 Web服务器IO的整个详细过程 (1)客户发起请求到服务器网卡: (2)服务器网卡接受到请求后转交给内核 ...
- C#开发BIMFACE系列43 服务端API之图纸拆分
BIMFACE二次开发系列目录 [已更新最新开发文章,点击查看详细] 在上一篇博客<C#开发BIMFACE系列42 服务端API之图纸对比>的最后留了一个问题,在常规业务场景下,一 ...
- Miller-Rabin and Pollard-Rho
实话实说,我自学(肝)了两天才学会这两个随机算法 记录: Miller-Rabin 她是一个素数判定的算法. 首先需要知道费马小定理 \[a^{p-1}\equiv1\pmod{p}\quad p\i ...
- 题解 Division Game
link Description 懒得写了. Solution 设 \(f(x)\) 表示对于一个位置操作了 \(x\) 次后刚好变为 \(1\) 的方案数,可以看出的是 \(f(x)\) 同样也是对 ...
- Golang/Java 实现无重复字符的最长子串 - LeetCode 算法
给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度. 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/longest-subs ...