0.绪论
操作系统是个软件,为了让程序更好的在上面运行。比如说运行多个程序,让他们的内存隔离开来;让程序更好地和设备交互。
程序的输出可以输出到设备、文件、屏幕。
进程是运行的程序,操作系统希望把多个程序加入内存,把多个程序隔离开来,在多个程序中切换,因此有了进程的概念。
进程管理的API:创建一个进程,把一个进程从一个磁盘上加载到内存,把一个进程从内存换出到磁盘。
时钟中断定时去打断cpu,在中断处理程序里切换程序。
查看进程的具体信息: cd /proc/1;cat maps;stat运行多长时间,cmdline到底是什么样的程序
操作系统的three easy pieces::虚拟化:进程、虚拟储存、设备抽象;并发:多个程序分时共享多个处理器,进程/线程间通信;持久化:UNIX文件系统和他们的后代们(ext2,ext33,ext4,btrfs,xfs,zfs)。
Take-aways and Wrap-up:
操作系统解决”运行多个程序“的需求
- 这个需求是随着计算机性能的增长自然而然出现的
操作系统设计/实现需要考虑的问题
- 如何让复用(虚拟化)硬件资源,使每个程序看起来都在独占计算机?
- 提供什么样的API使各类程序都能被实现?
- 编译器?
- 浏览器?
- IDE?
- 任务管理器?
- 游戏外挂?
1.应用眼中的操作系统
什么是软件: 可执行文件和其他数据文件,ELF(Executable Linkable Format)是最常用的。gcc -c a.c生成目标文件,gcc a.o链接成可执行文件。
查看ip地址: ip address
查看文件储存地址: xxd a.c
指定入口函数: ld -e foo test.o
查询目标文件的信息: objdump
面试题: 一个普通的C程序执行的第一条指令在哪里?答:操作系统给我们最初始的加载器,然后加载libc,再调用libc的初始化,最后调用main。main的开始和结束不是整个程序的开始和结束。
追踪系统调用和信号: strace
程序流程:
- 被操作系统加载
- 通过父进程的execve
- 不断执行系统调用
- 进程管理:fork,execve,exit
- 文件/设备管理:open,close,read,write
- 存储管理:mmap,brk
- 直到_exit(exit_group)