其他分享
首页 > 其他分享> > 20191215李业达第一、二章读书笔记

20191215李业达第一、二章读书笔记

作者:互联网

一、知识点总结:

第一章:引言

前言:

该章是本书的引言部分,讲述了Unix的历史,包括各种unix的版本,还介绍了Linux的开发及其各种发行版,列出了适用于Linux的各种硬件平台以及虚拟机,还解释了Linux的启动过程,描述了Unix/Linux文件系统组织等,最后介绍了用户管理和维护Linux系统需执行的一些系统管理任务。

学到了什么?

  1. 在1.2中提出系统编程的作用:有效利用系统资源来开发应用软件;为学生打下扎实的专业基础,以便在多个领域继续深造。

  2. 1.3中提出本书的目标,包括强化学生的编程背景知识,动态数据结构的应用等。

  3. 在1.5中提到了本书的独特之处,在众多的独特之处中我发现本书着重介绍了编程实践,提供了一系列的编程项目,来让学生练习编程,亲自上手。

  4. 第一章中的内容还是比较简单的,大体介绍了一下这本书的内容,以及我们可以需要学到的东西,让我们对这本书以及这门课有个大体的认识,为之后的学习铺好路。

  5. 书中最后提到了虚拟机上的linux,我就想到了大一时娄老师让我们安的虚拟机,还好我到现在还没有删,我便打算继续使用我大一所一直使用的virtualbox,但在我想要重新继续使用时我的virtualbox遇到了不可启动的bug,使用了好多方法废了很多时间最后才把问题解决掉,才可以继续使用继续课程的学习。

第二章 编程背景

前言:

本章主要讲述了系统编程所需的背景信息:介绍了基于GUI的文本编辑器,如vim、gedit和EMACS,尤其是vim,我们在大一用过,我觉得这个编辑器再重新上手相较来说比较容易;展示了如何在命令和GUI模式下使用EMACS编辑器来编辑、编译和执行C语言程序;阐述了程序开发的步骤;详细阐释了函数调用惯例和运行时堆栈的使用;展示了C语言程序与汇编代码的链接;讨论了GNU make工具,举例说明如何编写makefile;提到了如何使用GDB调试工具调试C语言程序;提到了高级编程技术,以及C语言中的结构和指针,从单根目录节点开始,兴成文件系统树。

学到了什么?

  1. 书中介绍了三种文本编辑器:vim,gedit,emacs.其中vim我较为熟悉,也是因为在大一的课程中稍微的接触使用过。

  2. 2.1.1着重介绍了vim这一编辑器,与其他大多数编辑器不同,vim有3种不同的操作模式,分别是命令模式:用于输入命令。插入模式:用于输入和编辑文本。末行模式:用于保存文件并退出。vim启动时,处于默认的命令模式,在该模式下,大多数键表示特殊命令。移动光标的

    命令键示例如下:
    
  1. 动态链接的主要优点是

动态链接所用的库称为动态链接库(DLL)。它们在 Linux中称为共享库(.s0文件)。动
态加载(DL)库是指仅按需加载的共享库。动态加载库可用作插件和动态加载模块

  1. a.out文件的内容
    为了简便起见,我们首先讨论传统的a.out文件。
    a.out文件包括以下部分:

(1). 代码段:也称为正文段,其包含程序的可执行代码。代码段从标准C启动代码开始,该代码调用main()函数。

(2). 数据段:数据段包含初始化全局变量和初始化静态数据:

(3). 符号表:可选,仅为运行调试所需。

最有收获的内容:

看完第一章与第二章的内容我对于程序的执行与停止这一过程较为感兴趣,并且有一定的收获,因为这一部分与我的日常学习联系最为紧密,我需要了解我的程序如何运行与停止。

1.程序执行过程****

在类Unix操作系统中,在sh命令行执行a.out文件,以标记字符串作为命令行参数。为执行命令,sh创建一个子进程并等待该子进程终止。子进程运行时,sh使用a.out文件,按照以下步骤创建新的执行映像。

(1)读取aout文件头,以确定所需的总内存大小,包括堆栈空间大小:

Totalsize=brk stacksize

其中,堆栈大小通常是操作系统内核为待启动程序选择的默认值。无法知道一个程序究竟需要多大的堆栈空间。操作系统内核通常使用待启动程序的默认初始堆栈大小,并试着处理随后在运行期间可能出现的堆栈溢出问题。

(2)sh从总大小中分配一个内存区给执行映像。从概念上讲,我们可假设分配的内存区是一个单独的连续内存。sh将a.out文件的代码段和数据段加载到内存区中,堆栈区位于高位地址端。sh将bss段清除为0,使得所有未初始化全局变量和未初始化静态局部变量以初始值0开始。执行期间,堆栈向下朝低位地址延伸。

(3)然后,sh放弃旧映像,开始执行新映像,

2.程序终止

可通过两种可能的方法终止正在执行a.out的进程。

(1)正常终止:如果程序执行成功,main()最终会返回到crt0.0,调用库函数exit(0)来

终止进程。首先, exit(value))函数会执行一些清理工作,如刷新 stdout、关闭/0流等。然

后,它发出一个 exit(value))系统调用,使进入操作系统内核的进程终止。退出值0通常表

示正常终止。如果需要,进程可直接调用 I exit(value),不必返回到crt0.0。再直接一点,进

程可能会发出 exit( value))系统调用以立即终止,不必先进行清理工作。当内核中的某个进

程终止时,它会在进程结构体中将 f exit(value))系统用值记录为退出状态,通知它的父进

程并使该进程成为僵尸进程。父进程可通过系统调用

pid wait(int * atatus)i

找到僵尸子进程,获得其pid和退出状态,它还会清空僵尸子进程的结构体,使该结构体可

被另一个进程重新使用。

(2)异常终止:在执行a.out时,进程可能会遇到错误,如无效地址、非法指令、越权

等,这些错误会被CPU识别为异常。当某进程遇到异常时,它会陷入操作系统内核。内核

的陷入处理程序将陷入错误类型转换为一个幻数,称为信号,将信号传递给进程,使进程终

止。在这种情况下,僵尸进程的退出状态就是信号数值,我们可以说该进程异常终止了。除

了错误导致的陷入,信号也可能来自硬件或其他程。例如,按下“Ctrl+C”组合键会产生

硬件中断,它会向该终端上的所有进程发送数字2的信号 SIGINT,使进程终止。或者,用

户可以使用命令

kill -s signal number pid

signal number 1 to 31

向通过pid识别的目标进程发送信号。对于大多数信号数值,进程的默认操作是终止。

问题与解决思路

我在准备将书上的代码敲入我的虚拟机时遇到了虚拟机无法启动这一问题:

查阅资料

我选择在网上查阅资料,查询到了包括重新安装,更改注册表,重新启动服务等方法,但没有一个是奏效的,哪怕我将同学的文件拷来电脑上也无法解决该问题

依旧无法启动。

3.自我总结

我在接下来的时间中还需要用更多的时间来把这个问题解决掉,这一问题严重的影响了我的学习,网上的办法无一例外都无法解决,我需要找到更多办法,这一问题的解决过程我还会在我的博客园持续更新,直到解决。

标签:文件,二章,读书笔记,初始化,李业,进程,全局变量,链接,out
来源: https://www.cnblogs.com/Werido-/p/15267032.html