【系统编程】LINUX系统结构、GDB调试

一、Linux系统结构

                      Linux体系结构大致可以分为两块:

                     (1)用户空间:用户空间中又包含了,用户的应用程序,C库

                     (2)内核空间:内核空间包括,系统调用,内核,以及与平台架构相关的代码

           Linux 内核由如下几部分组成:内存管理、进程管理、设备驱动程序、虚拟文件系统和网络接口等

1、内存管理 
内存管理主要完成的是如何合理有效地管理整个系统的物理内存,同时快速响应内核各个子系统对内存分配的请求。Linux内存管理支持虚拟内存,而多余出的这部分内存就是通过磁盘申请得到的,平时系统只把当前运行的程序块保留在内存中,其他程序块则保留在磁盘中。在内存紧缺时,内存管理负责在磁盘和内存间交换程序块。

2、进程管理 
进程管理主要控制系统进程对CPU的访问。当需要某个进程运行时,由进程调度器根据基于优先级的调度算法启动新的进程。:Linux支持多任务运行,那么如何在一个单CPU上支持多任务呢?这个工作就是由进程调度管理来实现的。在系统运行时,每个进程都会分得一定的时间片,然后进程调度器根据时间片的不同,选择每个进程依次运行,例如当某个进程的时间片用完后,调度器会选择一个新的进程继续运行。由于切换的时间和频率都非常的快,由此用户感觉是多个程序在同时运行,而实际上,CPU在同一时间内只有一个进程在运行,这一切都是进程调度管理的结果。

3. 设备驱动程序 
      设备驱动程序是 Linux  内核的主要部分。和操作系统的其它部分类似,设备驱动程序运行在高特权级的处理器环境中,从而可以直接对硬件进行操作,但正因为如此,任何一个设备驱动程序的错误都可能导致操作系统的崩溃。设备驱动程序实际控制操作系统和硬件设备之间的交互。设备驱动程序提供一组操作系统可理解的抽象接口完成和操作系统之间的交互,而与硬件相关的具体操作细节由设备驱动程序完成。一般而言,设备驱动程序和设备
的控制芯片有关,例如,如果计算机硬盘是 SCSI  硬盘,则需要使用 SCSI  驱动程序,而不是 IDE 驱动程序。 

4、虚拟文件系统 (VFS)
Linux内核中的虚拟文件系统用一个通用的文件模型表示了各种不同的文件系统,这个文件模型屏蔽了很多具体文件系统的差异,使Linux内核支持很多不同的文件系统,这个文件系统可以分为逻辑文件系统和设备驱动程序:逻辑文件系统指Linux所支持的文件系统,例如ext2、ext3和fat等;设备驱动程序指为每一种硬件控制器所编写的设备驱动程序模块。

5、网络接口 (NET)
网络接口提供了对各种网络标准的实现和各种网络硬件的支持。网络接口一般分为网络协议和网络驱动程序。网络协议部分负责实现每一种可能的网络传输协议。网络设备驱动程序则主要负责与硬件设备进行通信,每一种可能的网络硬件设备都有相应的设备驱动程序。

 

二、gdb调试

           简介:

                     GDB(GNU Debugger)是GCC的调试工具,主要有以下面四个方面的功能: 
                    1.启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。 
                    2.可让被调试的程序在你所指定的调置的断点处停住。(断点可以是条件表达式) 
                    3.当程序被停住时,可以检查此时你的程序中所发生的事。 
                    4.动态的改变你程序的执行环境。

           调试流程:

           生成gdb调试信息:gcc xxx.c -o xxx -g

          进入gdb调试:gdb xxx

          设置断点: b 15 //在程序运行后会停在15行,15行不运行

          删除断点: d 15 //删除15行的断点

         程序开始运行: r //不设置断点会直接一直顺着程序运行下去

         单步运行:n

         运行时碰到函数时直接跳过整个函数:s

         打印变量的值:print 变量

         打印类型的定义:ptype 类型

         退出gdb调试:quit

       参数列表:

命令

命令缩写

命令说明

list

l

显示多行源代码

break

b

设置断点,程序运行到断点的位置会停下来

info

i

描述程序的状态

run

r

开始运行程序

display

disp

跟踪查看某个变量,每次停下来都显示它的值

step

s

执行下一条语句,如果该语句为函数调用,则进入函数执行其中的第一条语句

next

n

执行下一条语句,如果该语句为函数调用,不会进入函数内部执行(即不会一步步地调试函数内部语句)

print

p

打印内部变量值

continue

c

继续程序的运行,直到遇到下一个断点

set var name=v

设置变量的值

start

st

开始执行程序,在main函数的第一条语句前面停下来

file

装入需要调试的程序

kill

k

终止正在调试的程序

watch

监视变量值的变化

backtrace

bt

查看函数调用信息(堆栈)

frame

f

查看栈帧  f n 切换到编号为n的栈

quit

q

退出GDB环境

参考博客:

[1]https://blog.csdn.net/yayaxueyu654/article/details/80037946

[2]https://blog.csdn.net/hello_world6/article/details/52675231

[3]https://blog.csdn.net/hguisu/article/details/6122513

[4]https://blog.csdn.net/weixin_30800987/article/details/99536057

 

 

 

 

 

发布了64 篇原创文章 · 获赞 82 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/qq_40602000/article/details/101146090
今日推荐