南京大学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的命令行窗口中输入以 ...
随机推荐
- english note(6.2 to 5.30)
notes 6.2 to 5.30 http://www.51voa.com/VOA_Special_English/suicide-rates-among-young-americans-on-t ...
- iNeuOS工业互联网操作系统部署在华为欧拉(openEuler)国产系统,vmware、openEuler、postgresql、netcore、nginx、ineuos一站式部署
目 录 1. 概述... 3 2. 创建虚拟机&安装华为欧拉(openEuler)系统... 4 2.1 创建新的虚拟机... 4 2.2 ...
- 鸿蒙内核源码分析(特殊进程篇) | 龙生龙,凤生凤,老鼠生儿会打洞 | 百篇博客分析OpenHarmony源码 | v46.02
百篇博客系列篇.本篇为: v46.xx 鸿蒙内核源码分析(特殊进程篇) | 龙生龙凤生凤老鼠生儿会打洞 | 51.c.h .o 进程管理相关篇为: v02.xx 鸿蒙内核源码分析(进程管理篇) | 谁 ...
- P7408-[JOI 2021 Final]ダンジョン 3【贪心,树状数组】
正题 题目链接:https://www.luogu.com.cn/problem/P7408 题目大意 一个有\(n+1\)层的地牢,从\(i\)到\(i+1\)层要\(A_i\)点能量,第\(i\) ...
- 使用Dom4j、反射自定义实现xml与java对象互转
一.前言 国庆假期临近,工作动力不强.所以写几篇之前项目中自己用到的一些可能有用的东西分享出来. 今天分享的是Xml与javaBean互转的自定义实现. 先说几种我知道的Xml与javaBean互转的 ...
- JavaEE & Tomcat 介绍
目录 企业开发介绍 JavaEE 规范 Web 概述 系统结构简介 C/S 结构 B/S 结构 两种结构的区别及优略 Tomcat Tomcat 介绍 关于服务器 Tomcat下载与安装 Tomcat ...
- oracle扩展表空间
1. 查看表空间的名字及文件所在的位置 select tablespace_name, file_id, file_name, round(bytes / (1024 * 1024), 0) tot ...
- 自定义view---仪表盘--kotlin
我们知道一个自定义view一般来说需要继承view或者viewGroup并实现onMeasure, onLayout, onDraw方法. 其中onMeasure用于测量计算该控件的宽高, onLay ...
- 【MySQL】MySQL(三)存储过程和函数、触发器、事务
MySQL存储过程和函数 存储过程和函数的概念 存储过程和函数是 事先经过编译并存储在数据库中的一段 SQL 语句的集合 存储过程和函数的好处 存储过程和函数可以重复使用,减轻开发人员的工作量.类似于 ...
- 第3次 Beta Scrum Meeting
本次会议为Beta阶段第3次Scrum Meeting会议 会议概要 会议时间:2021年6月2日 会议地点:「腾讯会议」线上进行 会议时长:0.5小时 会议内容简介:对完成工作进行阶段性汇报:对下一 ...