南京大学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看一下有什么问题

  1. 我们发现我们现在运行的这个程序进程号是12305。
  2. 我们使用pmap 12305输出这个进程的信息。

会发现os已经帮我们做了很多事情所以整个过程是

os自带的加载器---> 加载libc------> 加载a.out

看下面这个程序。

虽然main是空的。,但是这里的

Hello World
Goodbye, Cruel OS World

还是可以正常输出

3. Trace的使用

使用strace可以追踪系统调用

这里跟随课上jyy老师的脚步分析一下a.out的系统调用

  1. 可以发现第一条系统调用是execve
  2. 然后libc执行了一堆系统调用
  3. 最后才会到我们自己写的程序

3. 应用眼中的操作系统

可以说所有的程序都是类似的,不断的调用系统调用。从开始到关闭

1. gcc的系统调用过程

  1. 这里的gcc确实是先利用as来做编译

  2. 然后用collect2来做链接

    collect2主要用来做合成,会把构造器和析构器的代码生成出来

  1. 在gcc的最后会调用ld。

2. 其他的应用程序

南京大学OS笔记(1)-应用眼中的操作系统的更多相关文章

  1. 黑苹果之DELL台式机安装Mac OS X 10.13.6版本操作系统

    由于本人所在的公司一般都是DELL的品牌台式机,所以以DELL台式机做小白鼠.记得在2012年的时候,在当时的那家公司为了学习自学IOS开发的Objective-C开发语言的时候,由于囊中羞涩买不起m ...

  2. 论鸿蒙OS在某些人眼中的样子

    对于鸿蒙OS,博客园有一篇文章<为鸿蒙OS说两句公道话(我对鸿蒙OS的一些看法)>.有兴趣的可以看看. 在这篇文章中,个人觉得最精彩的不是文章本身,而是评论内容. 下面我挑一些出来,和大家 ...

  3. 进程描述和控制(os 笔记二)

    进程描述和控制 ​ 计算机最初的主要任务之一就是高效的自动化我们的工作,完成用户交付的任务.而这种任务在计算机中的表示就是一个个的进程.从上一篇文章中描述的计算机的发展历史我们能发现,无论是单道批处理 ...

  4. uc/os 笔记(转)

    1.uC/OS-II中使用互斥信号对象应该注意 互斥信号对象(Mutual Exclusion Semaphore)简称Mutex,是uC/OS-II的内核对象之一,用于管理那些需要独占访问的资源,并 ...

  5. 线程、对称多处理和微内核(OS 笔记三)

    线程.对称多处理 ​ 这一部分继续深入探讨与进程管理相关的高级概念并了解多处理机的对称多处理技术. 进程和线程 到目前为止提出的进程的概念包含两个特点: 资源所有权 存放进程映像的虚拟地址空间 调度/ ...

  6. 操作系统概述(os 笔记一)

    操作系统概述 操作系统的目标和功能 1.目标:作为用户/计算机接口 ​ 计算机的使用人群大致可以分为三类,终端用户,程序开发者,操作系统设计人员. 对于终端用户,即应用程序的用户来说,他们通常不关注计 ...

  7. LwIP应用开发笔记之一:LwIP无操作系统基本移植

    现在,TCP/IP协议的应用无处不在.随着物联网的火爆,嵌入式领域使用TCP/IP协议进行通讯也越来越广泛.在我们的相关产品中,也都有应用,所以我们结合应用实际对相关应用作相应的总结. 1.技术准备 ...

  8. OS笔记047代理传值和block传值

    在两个不同的控制器之间传递数据,可以使用代理传值或者block传值. 例子是一个简单通讯录. 主界面如下: 添加联系人界面 查看/编辑联系人界面:默认是查看模式,点击编辑后进入编辑模式 编辑模式 数据 ...

  9. Grails笔记一:windows8.1操作系统cmd下grails命令无效

    最近决定使用intellij idea工具来开发基于Grails框架的应用程序,,在安装好jdk 1.7以及配置好jdk和grails环境变量后进行grails测试,在win8.1的命令行窗口中输入以 ...

随机推荐

  1. Linux如何配置网络ip?

    Linux如何配置网络ip? 1.首先切换至root用户 su root 输入root用户密码 2.借助dhclient工具自动生成一个网络内可用的ip地址 我们可以手动配置对应的网段的ip地址,但是 ...

  2. P7726-天体探测仪(Astral Detector)【构造】

    正题 题目链接:https://www.luogu.com.cn/problem/P7726 题目大意 一个长度为\(n\)的排列,给出\(n\)个可重集\(S_i\)表示所有长度为\(i\)的区间的 ...

  3. 记一次Kafka服务器宕机的真实经历!!

    大家好,我是冰河~~ 估计节前前祭拜服务器不灵了,年后服务器总是或多或少的出现点问题.不知是人的问题,还是风水问题.昨天下班时,跟运维小伙伴交代了好几遍:如果使用Docker安装Kafka集群的话,也 ...

  4. Java AES 加密小试牛刀

    目录 问题出处 解决方法 方法一 方法二 方法三 补充 总结 在java开发过程中,很多时候我们都需要加密数据,例如声音.敏感信息等.我们通常使用的是 MD5加密.SHA加密.DES 加密.AES 加 ...

  5. 10.1 HTTP

    1.跨网络的主机间通讯 套接字Socket是进程间通信IPC的一种实现,允许位于不同主机(或同一主机)上不同进程之间通信和数据交换 在建立通信连接的每一端,进程间的传输要有两个标志:IP地址和端口号, ...

  6. Spring自动装配歧义性笔记

    Spring自动装配歧义性笔记 如果系统中存在两个都实现了同一接口的类,Spring在进行@Autowired自动装配的时候,会选择哪一个?如下: // 一下两个类均被标记为bean @Compone ...

  7. 超详细的Eureka源码解析

    Eureka简介 Eureka是什么? Eureka是基于REST(Representational State Transfer)服务,主要以AWS云服务为支撑,提供服务发现并实现负载均衡和故障转移 ...

  8. Go语言核心36讲(Go语言基础知识四)--学习笔记

    04 | 程序实体的那些事儿(上) 还记得吗?Go 语言中的程序实体包括变量.常量.函数.结构体和接口. Go 语言是静态类型的编程语言,所以我们在声明变量或常量的时候,都需要指定它们的类型,或者给予 ...

  9. PAT (Basic Level) Practice (中文)1086 就不告诉你 (15分)

    1086 就不告诉你 (15分) 做作业的时候,邻座的小盆友问你:"五乘以七等于多少?"你应该不失礼貌地围笑着告诉他:"五十三."本题就要求你,对任何一对给定的 ...

  10. Markdown Reference

    Markdown For Typora Overview Markdown is created by Daring Fireball; the original guideline is here. ...