20191226刘煊赫

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

一、知识点归纳

第一章:引言

  1. 系统编程课程的目的:

(1)教授学生计算机系统软件方面的广博知识以及高级编程技巧,使其能够与操作系统内核交互,从而有效利用系统资源来开发应用软件;

(2)为学生打下扎实的专业基础,以便在操作系统、嵌入式系统、数据库系统、数据库系统、数据挖掘、人工智能、计算机网络、网络安全、分布式和并行计算等计算机科学/工程领域继续深造。

  1. 系统编程的作用

   系统编程是计算机科学和计算机工程教育不可或缺的一部分。

  1. 关于Unix

   概念:Unix是一种通用操作系统,诞生于20世纪70年代早期,由肯·汤姆森和丹尼斯·里奇开发。

   分类:AT&T UnixBerkeley UnixHP UnixIBM UnixSun Unix

   下面是对各种Unix系统的介绍:

名称

介绍

总结

 

 

AT&T Unix

20世纪80年代末,由美国电话电报公司开发,最终发布了AT&T System V UnixSystem V Unix是一个单处理器系统,在20世纪80年代后期,该系统被拓展为多处理器版本。

可以看出,大多数Unix系统都是专有的,并且与特定的硬件平台相关联。

 

 

Berkeley Unix

1977年至1985年间由加州大学伯克利分校的伯克利软件发行中心开发的一组Unix操作系统变体。BSD Unix最重要的贡献是实现了TCP/IP协议族和套接字接口,作为一种标准的组网方式。

 

 

HP Unix

由惠普公司开发的专有Unix操作系统,第一版发布于1984年。HP-UX的独特功能包括可代替Unix标准rwx文件权限的用于大型文件系统和访问控制表的内置逻辑卷管理器。

 

 

IBM Unix

AIXIBM为其多个计算机平台开发的一系列专有Unix操作系统。AIX最初是为IBM 6150 RISC工作站而开发,现可支持各种硬件平台。

 

 

 

Sun Unix

最初是Sun公司开发的一款Unix操作系统。自20101月起,该系统更名为Oracle SolarisSolaris以其可拓展性而闻名,特别是在SPARC系统上。它支持由Oracle和其他供应商提供的各种基于SPARC和基于x86的工作站和服务器。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  1. 关于Linux

   定义:Linux是一个类Unix系统。它最初是林纳斯·托瓦兹在1991年为基于Intel x86的个人计算机开发的一个实验性内核。Linux的一个重要里程碑发生在20世纪90年代末,当时,它与GUN相结合,纳入了许多GUN软件,如GCC编辑器、GNU emacs编辑器和bash等,极大地促进了Linux的进一步发展。 Linux包含其他Unix系统的许多特性。在某种意义上,它是由各种最为流行的Unix系统组合而成。在很大程度上,Linux是兼容POSIX标准的。

   版本:Debian LinuxUbuntu LinuxLinux Mint、基于RPMLinuxSlackware Linux

   下面是对各类Linux系统的介绍:

名称

介绍

 

Debian Linux

Debian是专注于免费软件的Linux发行版,可支持很多软件平台。Debian发行版采用.deb包格式和dgpk包管理器及其前端。

 

Ubuntu Linux

Ubuntu是基于DebianLinux发行版,有多个官方发行版。

 

Linux Mint

Linux Mint是基于Debian Ubuntu的社区主导型Linux发行版。

 

基于RPMLinux

Red Hat LinuxSUSE Linux 是最早使用RPM文件格式的主要发行版,目前仍有一些软件包管理系统在使用这些格式。

 

Slackware Linux

Slackware Linux发行版以高度可定制而著称,专注于通过尖端的软件和自动化工具来提供维护便捷性和可靠性。

   

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  1. Linux使用

(1)Linux内核映像

        在典型的Linux系统中,Linux内核映像位于/boot目录中。可启动的Linux内核映像名为 vmlinuz-generic-VERSION_NUMBERinitrdLinux内核的初始ramdisk映像。一个可启动的Linux内核的初始ramdisk映像。

        一个可启用的Linux内核映像由三部分组成:|BOOT|SETUP|linux kernel|

  1. Unix/Linux文件系统组织

   Unix/Linux文件系统采用树形组织结构

 

文件类型分为两种,分别是目录文件以及非目录文件,非目录文件、符号链接文件。

   目录文件:一个目录可能包含其他目录和(非目录)文件。

   非目录文件:非目录文件可以进一步划分为常规文件、特殊文件(字符特殊文件、块特殊文件)。

(1)常规文件:包含普通文本或包含可执行的二进制代码。

(2)特殊文件:特殊文件时/dev目录中的条目。

符号链接文件:属于常规文件,其内容为其他文件的路径名。因此,这些文件是指向其他文件的指针。例如,Linux命令  ln -s aVeryLongFileName myLink,可创建一个符号链接文件“myLink”,指向“aVeryLongFileName”。

Unix/Linux文件系统树的根节点(用“/”符号表示)称为根目录,或简称为根。文件系统树的每个结点都有以下表单的路径名指定:

/a/b/c/d OR a/b/c/d

“/”开头的路径名为绝对路径名,反之则为相对于进程当前工作目录(CWD)的相对路径名。

pwd可以打印CWD的绝对路径名

  1. Unix/Linux命令

   下面列出了Unix/Linux中最常用的命令:

    lsls dirname:列出CWD或目录的内容

cd dirname:更改目录

pwd:打印CWD的绝对路径名

touch filename:更改文件名时间戳(如果文件不存在,则创建文件)

cat filename:显示文件内容

cp src dest:复制文件

mv src dest:移动或重命名文件。

mkdir dirname:创建目录

rmdir dirname:移除(空)目录

rm filename:移除或删除文件

ln oldfile newfile:在文件之间创建链接

find:搜索文件

grep:搜索文件中包含模式的行

ssh:登录到远程主机

gzip filename:将文件压缩为.gz文件。

gunzip file.gz:解压.gz文件

tar -zcvf file.tgz .:从当前目录创建压缩tar文件

tar -zxvf file.tgz:从.tgz文件中解压文件

man:显示在线手册页

zip file.zip filenames:讲问价压缩为.zip文件

unzip file.zip:解压.zip文件

  1. Linux手册页

    

9.  Ubuntu Linux系统管理

(1)用户账户:当用户使用登录名和密码登录后,登录进程将通过获取用户的giduid来转换成用户进程,并将目录更改为用户的homeDir,然后执行列出的initialProgram,该程序通常为命令解释程序sh

(2)sudo命令:在Ubuntu里,sudo(“超级用户执行”)允许用户以另一个用户(通常是超级用户)的身份执行命令,为确保用户能够发出sudo,只需在sudoers文件中添加一行:username ALLALLALL

第二章:编程背景

  1. Linux中的文本编辑器

(1)Vim

     VimLinux的标准内置编辑器。它是Unix原始默认vi编辑器的改进版本。与其他大多数编辑器不同,vim3种不同的操作模式,分别是命令模式、插入模式、末行模式。

下面介绍一下这三种模式:

命令模式:用于输入命令

插入模式:用于输入和编辑文本

末行模式:用于保存文件并退出

移动光标的命令键:

h 左移一个字符 l:右移一个字符

j:下移 k:上移

插入模式:

i:插入文本 a:追加文本 esc:退出

输入“:”进入末行模式,将文本保存为文件或退出vim:

:w:写入(保存)文件

:q:退出vim

:wq:保存并退出

:q!:不保存更改,强制退出

(2)WYSIWYG编辑器

     

    

  1. 使用文本编辑器

1)emacs

       emacs是一款强大的文本编辑器,可在多个不同的平台上运行。最受欢迎的emacs是GNU Emacs,可在大多数Linux发行版中使用。

 

3.程序开发

程序开发步骤:

执行程序的开发步骤如下:

(1)创建源文件:使用文本编辑器创建一个或多个程序源文件。在系统编程中,最重要的编程语言是C语言和编程语言。C语言程序中的变量可分为全局变量、局部变量、静态变量、自动变量和寄存器变量。

(2)gcc把源文件转换成二进制可执行文件,如:gcc t1.c t2.c 生成一个二进制可执行文件,文件名为a.out。在Linux中,cc链接到gcc,所以它们是一样的。

(3)gcc是什么?gcc是一个程序,它包含三个主要步骤,如图所示

     

第一步:将C源文件转换为汇编代码文件。

第二步:把汇编代码转换成目标代码。

第三步:链接。一个程序可能包含多个.o文件,这些文件相互依赖。

      可执行文件格式:

        虽然默认的二进制可执行文件名为a.out,但实际文件格式可变。其中包括

(1)二进制可执行平面文件

(2)a.out可执行文件

(3)ELF可执行文件(更适合动态链接)

        a.out文件的内容:

        (1)二进制可执行平面文件

        (2)代码段

        (3)数据段

        (4)符号表

        

       程序执行过程:

1)读取a.out文件头,以确定所需的总内存大小,包含栈空间大小:

TotalSize = _brk +stackSize

2)sh从总大小中分配一个内存区给执行映像

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

4)执行从crt0.o开始,调用main()

程序终止:

(1)正常终止

(2)异常终止

4.C语言中的函数调用

  1)每个CPU都有以下寄存器或同等寄存器,括号中的条目表示x86CPU的寄存器:

PC(IP):指向CPU要执行的下一条指令。

SP(SP):指向栈顶

FP(BP):指向当前激活函数的栈帧

返回值寄存器(AX):函数返回值的寄存器。

 

 

 

 

sub()执行C语句return x+y+u+v时,他对表达式求值,并将结果值放入返回寄存器(AX)。

  1. C语言程序与汇编代码的链接

(1)汇编代码说明

       GCC生成的汇编代码由三部分组成:

       ①入口代码:又叫作prolog,它建立栈帧,在堆栈上分配局部变量和工作空间

       ②函数体代码:在AX寄存器中执行带有返回值的函数任务

       ③退出代码:又叫做epilog,它释放堆栈空间并返回到调用者

  1. 链接库

  Linux中,有两种链接库:用于静态链接的静态链接库和用于动态链接的动态链接库。

  静态链接库:

 

在编译链接过程中,-L指定链接库路径(当前目录),-l指定链接库。注意,链接库(mylib)未指定前缀lib和后缀.a。

 

动态链接库:

 

  

  1. Makefile

(1) makefile格式:一个make文件由一系列目标项、依赖项和规则组成

  1. GDB调试工具

  1、创建makefile:

t: t.c

gcc -g -o t t.c

然后使用RMACS编辑c语言源文件。

2、编译源代码

打开Tools菜单,选择编译或

gccc -g -o t t.c

3、启动GDB

4、多窗口GDB

5、附加GDB命令

  C语言程序中的常见错误:

    1、使用任何指针时,程序员必须确保指针部位NULL或被设置为执行有效的内存地址

2、数组下标越界

3、字符串指针和char数组使用不当

4assert宏的用法

 

  1. C语言结构体

   next:指向下一个节点结构体的指针

   key:一个整数

   name:一个由64个字符组成的数组

1)定义结构体变量

struct node x,node;

NODE x,node;

(2) typedef struct node{

struct node *next;

int key key;

char name[2];

}attribute((packed,aligned(1))) NODE;

PACKED属性定义C语言结构体,这可以防止C编译器用额外字节填充字段

3)联合体所有成员共享相同的存储区。

4)可扩充C语言结构体:要使用这类结构体,用户必须为实际结构体分配所需要的内存。

10.链表处理

单向链表是一种由一系列节点组成的数据结构

链表操作:

链表最常见的操作类型为:构建、遍历、搜索、插入、删除、重新排序

  1. 树和Linux

mkdir 路径名:为给定的路径名创建一个新目录。

rmdir 路径名:如果目录为空,则删除该目录

creat 路径名:创建一个FILE结点。

save 文件名:将当前文件系统树保存为文件

reload 文件名:从一个文件构造一个文件系统树

menu:显示有效命令菜单

quit:保存文件系统树,然后终止程序

posted on 2021-09-14 21:58  20191226刘煊赫  阅读(11)  评论(0编辑  收藏  举报