Linux环境编程导引

简介: 计算机系统硬件组成 总线贯穿整个系统的一组电子管道称为总线, 分为:  片内总线  系统总线 数据总线DB 地址总线AB 控制总线CB  外部总线 I/O设备I/O设备是系统与外界联系的通道    键盘鼠标是输入设备,显式器是输出设备,磁盘既是输入设备也是输出设备,输入输出是相对于内存来说的。

计算机系统硬件组成

 

总线

贯穿整个系统的一组电子管道称为总线, 分为:

  片内总线

  系统总线

数据总线DB

地址总线AB

控制总线CB

  外部总线

 

I/O设备

I/O设备是系统与外界联系的通道

    键盘鼠标是输入设备,显式器是输出设备,磁盘既是输入设备也是输出设备,输入输出是相对于内存来说的。

 

内存

  内存是一个重要的部件,它是与CPU进行沟通的桥梁。它用来存放程序以及程序要处理的数据,磁盘中的程序要加载到内存才能运行。

 

处理器

  中央处理器(CPU),简称处理器。

  CPU主要有运算器、控制器、寄存器构成

  取指: PC, IR

  译码: 指令译码器, RISC, CISC

  执行: ALU

  写回: -> 内存

  跳转: JMP

 

系统结构图

 

 

DMA传输

    DMA (直接访问内存)传输将数据从一个地址空间复制到另外一个地址空间的一种技术。当 CPU 初始化这个传输动作时,传输动作本身是由 DMA 控制器 来实行和完成, 而CPU可以继续去完成其他的工作, CPU仅在传输动作的开始和结束的时候参与数据传输的控制。 典型的例子就是移动一个外存的区块到芯片内部的内存区。像是这样的操作并没有让处理器工作拖延,反而可以使CPU重新去处理其他的工作。在实现DMA传输时,是由DMA控制器直接掌管总线。


操作系统

什么是操作系统

   操作系统是”有效地管理计算机系统中的资源,合理地管理计算机系统的工作流程,方便用户使用”的程序的集合。

 

操作系统三个基本抽象

    操作系统拥有三个基本抽象概念: 进程、虚拟存储器和文件

    文件是对I/O设备的抽象表示,虚拟存储器是对主存和磁盘I/O设备的抽象表示,进程则是对处理器、主存和I/O设备的抽象表示。


进程

   进程是操作系统对正在运行的程序的一种抽象。一个系统可以运行多个进程,而每个进程好像在独占使用硬件。

 

进程上下文切换

 

 

 

虚拟存储器

  虚拟存储器为每个进程提供了一个大的、一致的、私有的地址空间;

  它将内存看成是存储在磁盘上的地址空间的高速缓存,在主存中只保存活动区域,并根据需要在主存与磁盘中来回交换数据。

  为每个进程提供一致的地址空间,简化了存储管理,保护每个进程的地址空间不被其他进程破坏。

 

进程虚地址空间


 

文件

   文件是一系列的字节序列,它向应用程序提供了一个统一的视角,来看待系统中各式各样的I/O设备。

 

虚拟文件系统VFS

    虚拟文件系统是内核实现的一种架构,为用户空间提供统一的文件操作接口,即文件系统调用。它在内核内部为不同的真实文件系统提供一致的抽象接口。

    用户通过系统调用与内核中的虚拟文件系统交互,进而操作实际的文件系统和设备。

 


系统编程 VS. 应用编程

系统编程

   在操作系统之上利用系统调用、C库进行对系统资源进行访问。编写如apache 、gcc、gdb 等的服务应用.

   系统资源包括:处理器,输入输出,进程管理,内存,设备,定时器,进程间通信,网络

应用编程

   在更高层次的编程接口或者库之上构建应用程序。如android程序(android sdk)、iphone程序(iphone sdk)、QT程序设计(QT)、MFC程序设计(MFC)等。

 

 

系统调用在系统中所处的位置

   所有操作系统都提供多种服务的入口点,由此程序向系统核请求服务。这些入口点被称之为系统调用(system call),

 

 

C库

   这里我们所说的C库(libc),指的是标准C定义的C函数的集合。如标准输入输出函数、字符串处理函数、动态存储分配函数、日期时间函数、数学函数等。

   GNU发布的libc称为glibc.

 

系统调用与C库关系

   系统调用与C库从形式上来看都C函数;

   但C库函数有些是调用系统调用来实现的,比如说malloc、free调用brk,printf调用write系统调用,而有些函数不需要任何系统调用,比如abs(fabs)、strcpy、atoi等,因为它并不是必需要使用内核服务;

   因此系统调用通常提供的是最小界面,而C库函数通常提供更复杂的功能。

 

内核如何处理系统调用

   内核通过软中断的方式实现系统调用, 每个系统调用被赋予一个系统调用号, 在i386平台上,执行一个系统调用需要通过 INT 0x80 指令来完成, 从用户态切换到核心态.

   寄存器eax存放系统调用号, 寄存器ebx、ecx、edx、esi、edi存储系统调用参数,对于超过5个参数的系统调用,用一个寄存器(如ebx)指向用户空间的某个缓存, 该缓存存储所有系统调用的参数(可以多于5个)。

 

错误处理

   在系统编程中通常通过函数返回值来表示错误(一般-1代表函数执行出错),并通过特殊变量errno来描述。

   errno这个全局变量在 errno.h 头文件中声明如下:extern int errno;

    错误处理函数:perror, strerror;

//示例

int main()
{
    int ret = close(10);
    /*
        if (ret == -1)
        {
            perror("close error");
        }
    */
    if (ret == -1)
    {
        fprintf(stderr, "close error with message: %s, errno = %d\n",
                strerror(errno), errno);
    }

    return 0;
}

 

常见错误代码

E2BIG

参数列表太长

EACCESS

权限不足

EAGAIN

重试

EBADF

错误的文件描述符

EBUSY

设备或资源忙

ECHILD

无子进程

EDOM

数学参数不在函数域内

EEXIST

文件已存在

EFAULT

地址错误

EFBIG

文件太大

EINTR

系统调用被中断

 

//常见错误代码打印程序

int main()
{
    for (int i = 0; i < 140; ++i)
    {
        errno = i;
        cout << "errno " << i << ": " << strerror(errno) << endl;
    }
    return 0;
}

目录
相关文章
|
1月前
|
存储 Linux 开发工具
Linux环境下使用Buildroot配置软件包
使用Buildroot可以大大简化嵌入式Linux系统的开发和维护工作,但它需要对Linux系统和交叉编译有深入的理解。通过上述步骤,可以有效地配置和定制软件包,为特定的嵌入式应用构建高效、稳定的系统。
189 11
|
3月前
|
存储 监控 Linux
Linux环境锁定关键文件防止误删操作流程。
总结以上内容,在Linux环境下锁定重要文档避免误删涉及到多种技术手段与策略组合运作, 包括但不限于利用chatter指挥官固化文档状态至只读模式、运作ACL精准调整访问权利列表、编排自动化流程简
146 20
|
3月前
|
Linux
Linux环境下的UDEV机制及其与守护进程的关联
实际使用时管理员需要熟悉编写合适udev rules去满足特殊需求;同时也需要注意避免编写过度复杂导致无法预料结果rules.UDEVD虽然稳健但错误配置可能导致无法预料问题因此需谨慎处理相关配置工作.
143 16
|
3月前
|
存储 Linux
Linux环境下删除大文件后磁盘空间未释放问题诊断流程。
以上诊断流程涉及Linux底层机制与高级管理技能结合之处,并需要管理员根据实际环境灵活调整诊断策略与解决方案。
262 8
|
4月前
|
Linux 数据安全/隐私保护 iOS开发
推荐Linux环境下效能优良的双向文件同步工具
综合上述条件,对于Linux环境下的双向文件同步需求,Unison 和 Syncthing 是两个非常出色的选择。它们都有良好的社区支持和文档资源,适用于不同规模的环境,从个人使用到商业部署。Unison 特别适合那些需要手动干预同步过程、需要处理文件冲突解决的场景。而 Syncthing 更加现代化,适合需要自动、实时的数据同步与备份的环境。对于选择哪一个,这将取决于个人的使用场景和具体需求。
510 16
|
4月前
|
安全 应用服务中间件 网络安全
在Linux环境部署Flask应用并启用SSL/TLS安全协议
至此,你的Flask应用应该能够通过安全的HTTPS协议提供服务了。记得定期更新SSL证书,Certbot可以帮你自动更新证书。可以设定cronjob以实现这一点。
330 10
|
3月前
|
Ubuntu 安全 Linux
Ubuntu 24.10 发行版登场:Linux 6.11 内核、GNOME 47 桌面环境
Ubuntu 24.10 还带来了 GNOME 47,增强了性能和稳定性,并引入了新功能。此版本的 Ubuntu 还默认在采用 Nvidia 显卡的硬件上切换到 Wayland,并在支持的硬件上默认使用开源的 Nvidia 560 内核模块。 另外需要注意的是,Ubuntu 24.10 是稳定版本,但作为非 LTS 版本,仅支持 9 个月。
|
3月前
|
安全 Linux 网络安全
Linux系统初步设置本地Git环境和生成SSH密钥的步骤。
现在您的Linux系统已经配置好了Git环境,并创建并添加了SSH密钥,可以安全地与远端仓库进行交互,无论是克隆、推送还是拉取操作。此过程确保了数据传输的安全并使版本控制流程更为顺畅。使用Git时应考虑定期更新并管理您的凭据,以确保安全性。
481 0
下一篇
oss云网关配置