1.学到的知识点
异常
- 系统调用属于异常中的陷阱。系统调用的处理:陷阱处理程序将控制返回值给应用程序控制流中的下一条指令。
- Linux中,信号(Signal)是一种用户层异常控制流。
- 中断是硬件层的异常控制流
- 异步异常是同处理器外部的I/O设备中的事件产生的(硬件产生),同步异常是执行一条指令的直接产物(软件产生)。
- 陷阱是有意的异常,是执行一条指令的结果;故障由错误情况引起,他可能能够被故障处理程序修正;中之事不可恢复的致命错误造成的结果,通常是一些硬件错误。
- 异常表是一张跳转表,其中表目k包含异常k的处理程序代码的地址。
- 异常表的起始地址存放在异常表基址寄存器中。异常处理程序运行在内核模式下。
- 系统中可能的每种类型的异常都分配了一个唯一的非负整数的异常号。
进程
- 从程序员角度看进程状态有运行、停止、终止。
- 用户进程可以通过系统调用来访问内核代码和数据。
- int main(){} 的返回值是0,会调用exit(0),在命令行中运行echo $? 的值是0,main中不调用exit,会补上exit(0)。
- 非本地跳转通过setjmp和longjmp函数来提供的
- x86-64中,Linux系统调用的系统调用号是通过%rax传递的。
- 调用wait(&status)等价于调用waitpid(-1,%status,0)
- 如果一个父进程终止了,内核会安排init进程成为他的孤儿进程的养父。
- waitpid挂起调用进程的执行,直到他的等待集合中的一个子进程终止。
- 如果statusp参数是非空的,那么waitpid就会在status中放上关于导致返回的子状态信息。
- Unix/Linux中通过调用fork()可以获取子进程PID。
- Unix/Linux中通过调用getppid()可以获取父进程PID。
- 进程调度由内核中的调度器处理完成
- 上下文就是内核重新启动一个被抢占的进程所需的状态。他由一些对象的值组成,这些对象包括通用目的寄存器、浮点寄存器、程序计数器、用户栈、状态寄存器、内核栈和各种内核数据结构。
- .进程调度中的上下文切换包括保存当前进程的上正文,恢复某个先前被抢占的进程被保存的上下文,将控制传递给这个新恢复的进程。
- 如果两个流并发的运行在不同的处理器和或者计算机上,那我们称他们并发的运行。
- 通过把处理程序的地址传递到signal函数从而改变默认行为,这叫设置信号处理程序。执行信号处理程序被称为处理信号。
- 每种类型最u多只能有一个未处理的信号,如果两种类型k的信号发给同一个目的进程,第二个信号就简单的被遗弃了。
- kill函数发送信号号码sig给进程pid,可以用sigaction()处理信号
- fork()调用一次返回两次,在子进程中,fork返回值为0.
- 父进程和子进程都把它们的输出显示在屏幕上。原因是子进程继承了父进程所有的打开文件。
- 子进程和父进程的用户级虚拟地址空间相同但独立
- 调用fork(2)的系统调用号是57
- 进程调用了exec系列函数后,代码会改变。exec系列函数中带e的要传入环境变量参数.不能用char[][] 来传递argv,结尾的0(null)无法处理;system=fork+exec+wait;
- 地址空间底部是保留给用户程序的,包括通常的代码、数据、堆和栈段。代码段总是0x400000开始。
- 即使在系统中通常有许多程序在运行,进程也可以像每个程序提供一种假象,好像他在独占的使用处理器。这个PC的序列叫做逻辑控制流。
- C语言中有syscall函数可以直接调用任何系统调用
2.班课作业
-
1、使用man ls查看ls的帮助手册,通过实践搞清楚ls各种参数对应的功能并提交实践截图。
参考https://wenku.baidu.com/view/a164dc08f78a6529647d53a6.html?from=related&hasrec=1
-
2、实现ls
要求:参考伪代码实现ls的功能
打开目录文件
针对目录文件:
--读取目录条目
--显示文件名
关闭文件目录文件
-
3、实现ls -l