当前位置: 首页 > article >正文

linux概念详解

用户守护进程

用户空间守护进程是一些在后台运行的长期服务程序,提供系统级服务。

下面举一些例子。

网络服务:

        如sshd(SSH服务)、httpd(HTTP服务)。

        sshdsshd 守护进程会在后台运行,并等待来自网络的SSH连接请求。

        httpdhttpd 守护进程负责处理和响应来自客户端(如浏览器)的HTTP请求。常见的Web服务器如Apache、Nginx都是这种类型的守护进程。

        ftpd:FTP守护进程,提供文件传输协议(FTP)服务,允许用户通过FTP协议上传和下载文件。

系统日志:

        如syslog,记录系统和应用程序日志。又如cron,定期执行预定的任务。

  syslog 守护进程会不断地在后台监视系统日志文件,并进行日志记录。

        cron:定期执行计划任务。cron 守护进程在后台持续运行,根据预设的计划任务表(crontab)定期执行命令或脚本。例如,每天定时备份数据或每周更新系统。

库文件

  1.介绍

            库文件是技术大牛写的代码,我们可以引用这些文件到我们的代码中。

             文件分为静态库和动态库。

             所谓静态库,在编译时便和和其他代码一起编译成一个可执行文件了。

             而动态库是在其他代码运行时被加载进去的。

2.库文件的形式

  • 静态库文件:在Linux系统中,静态库通常是以 .a 结尾的文件。

  • 动态库文件:在Linux中,动态库通常是以 .so 结尾的文件

3. 如何使用静态库和动态库

     静态库的使用
  1.  创建静态库:你可以使用 ar 工具将多个目标文件打包成一个静态库文件。

    ar rcs libexample.a example1.o example2.o

  2. 编译时链接静态库:在编译程序时,通过 gccg++-l 选项链接静态库。例如,如果要使用 libexample.a 库,可以这样编译:

    gcc -o myapp myapp.c -L/path/to/libs -lexample

    这里的 -L 用于指定静态库的路径;  -l 用于指定要链接的库(去掉前缀 lib 和文件扩展名 .a)。

  3. 生成可执行文件:编译后,myapp 将包含静态库的代码。

   动态库的使用
  1. 创建动态库:通过 gcc 生成共享库文件(.so 文件),例如:

    gcc -shared -o libexample.so example1.o example2.o

  2. 编译时链接动态库:在编译程序时,通过 gcc-l 选项链接动态库。例如:

    gcc -o myapp myapp.c -L/path/to/libs -lexample

    动态库的编译方式与静态库类似,但是生成的文件是 .so 格式。

  3. 运行时加载动态库:运行时,操作系统会根据 LD_LIBRARY_PATH 环境变量查找并加载动态库。

    export LD_LIBRARY_PATH=/path/to/libs:$LD_LIBRARY_PATH
    ./myapp

4.静态库和动态库各自缺点

        由1可知,只要有n个代码要使用静态库,这n个代码都会将静态库复制到他们的内存。而动态库可以被多个程序共享,即 程序需要时,操作系统才会将它加载到内存。 这样的区别有无优劣?

===》.他们的优点我就不说了,他们的不足如下:

        静态库的缺点有:

  1. 如果有多个程序都使用同一个静态库,那么每个程序都会将该库的代码复制到自己的内存中。这会导致内存的浪费,内存使用效率较低。

  2. 静态库的代码会被嵌入到每个可执行文件中,这使得最终的可执行文件比较大。

  3. 如果静态库的代码需要更新,必须重新编译所有使用该库的程序。

        动态库的缺点有:

  1. 程序在运行时依赖操作系统加载动态库。如果动态库的路径不正确或库文件丢失,程序将无法启动,给系统带来依赖问题。

  1. 虽然现代操作系统会优化动态库的加载,但动态库仍然需要在运行时由操作系统加载,这可能会导致一定的延迟,特别是在程序启动时。

  2. 不同的程序可能依赖于相同库的不同版本,这会导致版本冲突。这种情况需要特别小心版本控制和兼容性。

5.使用静态库与动态库的选择

        静态库适用于需要高性能和独立运行、不需要频繁更新的程序,但会导致内存和存储浪费,且不便于库的更新。

        动态库适用于需要节省内存、减少存储空间、易于更新和共享的场景,但依赖外部库文件,可能引起依赖问题(即有些程序需要保持完全独立,不依赖于外部的库文件;以及动态库丢失的影响)

        对于大多数应用程序,动态库通常是更常见和灵活的选择,尤其是在开发大型应用程序时,可以通过共享库提高资源利用率并减少重复代码。但是在一些独立的、小型的或对启动性能要求较高的程序中,静态库可能更为合适。

系统调用

常见的系统调用包括:

        文件操作:

        open():打开文件。 read():从文件读取数据。 write():向文件写入数据。

        close():关闭文件。

        进程管理:

        fork():创建子进程。 exec():执行新的程序。 wait():等待子进程结束。 exit():终止进程。

        内存管理:

        mmap():映射内存区域。 munmap():解除内存映射。

        设备管理:

        ioctl():控制设备。 poll():监视文件描述符事件。

        网络操作:

        socket():创建网络套接字。 bind():绑定地址到套接字。

         listen():监听连接。 accept():接受连接。

Linux操作系统的典型体系结构:

        硬件层,内核,外设驱动程序,文件系统 ,系统调用接口,用户空间。

内核的组成

        我们可以简单的将内核分为内核核心部分各种内核模块,这是对内核结构的一种常见分类方式。

        1.内核核心部分,内核的核心部分通常包括以下几个部分:

  • 进程管理:调度和管理系统中的进程。

    内存管理:管理系统的内存,包括虚拟内存和物理内存。

    硬件抽象层(HAL):提供与硬件设备的交互接口。

    系统调用接口:为用户空间提供与内核的交互接口。

        2.各种内核模块,例如驱动程序。文件系统。 网络协议模块 ,其他功能模块等等。

        所谓 内核模块就是说这样的一个程序片段能够被加载到内核中,并可以在运行时动态地与内核互动。

        插述:虽然说文件系统和内核的核心部分是分开的,但是 Linux等操作系统中,文件系统是通过内核模块来实现的。这些文件系统模块(如ext4、NTFS、FAT等)是在内核中加载并执行的,实际上是内核的一个子系统。

        另外关于内核态和用户态的切换:

        系统调用是用户程序请求内核服务的主要方式,

        而中断是硬件设备向CPU发出的信号。

驱动设备

        最常见的三种驱动设备类型通常是字符设备、块设备和网络设备。

驱动程序

        1) 每个Linux驱动程序通常是一个内核模块,所谓 内核模块就是说这样的一个程序片段能够被加载到内核中,并可以在运行时动态地与内核互动。

        2)驱动程序用于控制特定类型的硬件设备 。 驱动程序可以在系统运行时动态加载或卸载。

        3) 内核通过函数调用的方式直接调用驱动代码。

        举个应用驱动程序的例子, 例如,当你插入一个USB设备时,相应的USB驱动程序模块会被加载到内核中,设备可以开始工作。一旦不再需要,可以卸载该模块,释放系统资源。

内核源码树

        内核源码树其实就是一个经过配置编译之后的内核源码。.

        在编写驱动代码的时候,我们需要用到系统内核的头文件,所以要具备这一份内核的源码。

文件系统和根文件系统

文件系统介绍

        在linux中无疑需要文件系统。常见的文件系统有:

        ext系列文件系统: 例如 ext4(第四扩展文件系统), 它是许多Linux发行版的默认文件系统。

        NTFS 是Windows操作系统的主要文件系统

        VFAT,它是FAT文件系统的扩展,主要用于较小的存储设备,如USB闪存驱动器、SD卡等 。

什么是挂载

        什么是挂载?我们可以理解为一个文件系统挂载到某一目录下,该目录下就存放了对于文件系统的东西 。

        挂载的时候,我们得选择一个空目录。

        例如,我有一个USB设备,它上面有一个ext4格式的文件系统。我们要对它进行挂载,得先创建一个 /mnt/usb 目录,再执行以下命令:

 mount /dev/sdb1 /mnt/usb 

        之后,该目录下的内容就会变成USB设备中存储的数据 。

        从而,我们就可以 通过访问 /mnt/usb 来访问USB设备中的内容。

文件系统介绍

        RootFS(根文件系统)是指在 Linux 系统启动时,第一个被挂载的文件系统。

        在Linux中,文件系统以树形结构组织,根文件系统位于树的最顶端,挂载点是“/”。

        根文件系统包含系统运行所需的核心文件和目录,如:

  • /bin:基础命令和工具,如ls、cp等。

  • /sbin:系统管理命令,仅限管理员使用,如ifconfig、reboot等。

  • /etc:系统配置文件,如网络配置、用户信息、系统服务等。

  • /lib:共享库文件,系统程序运行时需要的动态链接库。

  • /dev:设备文件,代表硬件设备,如硬盘、终端等。

  • /mnt:挂载点,用于临时挂载其他文件系统。

        根文件系统的作用有:

  • 启动系统:根文件系统包含启动操作系统所需的文件。在系统启动时,Linux内核会从存储设备加载根文件系统,然后根据根文件系统中的初始化脚本(如rcS或init)启动系统服务和进程。

  • 提供关键文件和命令:因为根文件系统存储了系统的核心文件和命令(如/bin和/sbin目录)。

什么是内核移植

        什么叫内核移植?

        内核移植就是 将 Linux 内核从一个硬件平台移植到另一个硬件平台的过程。而不同硬件平台有不同的架构和设备(如 ARM、x86、MIPS 等), ,因此要使 Linux 内核能够在新的硬件平台上运行,必须针对新平台进行相应的调整和修改。 例如:

        1.我们需要根据目标硬件平台的架构 来修改 修改内核代码以支持新的 CPU 和硬件组件。

        2.因为新平台上的硬件设备(如串口、网卡、显示屏、存储设备等)可能与原平台有所不同         ,所以我们需要移植或编写新的设备驱动程序,使内核能够与这些设备进行交互。

        3.在移植过程中,需要根据目标平台配置内核参数,编译适合该硬件平台的内核映像。

        4.另外,内核启动程序(如 U-Boot)需要进行配置和修改,以便正确地加载和启动新移植的内核。

什么是内核映像文件

        什么是内核映像文件,为什么要将内核代码编译成为内核映像文件?

====》

        1.内核代码的映像文件(Kernel Image) 是指经过编译后、包含操作系统内核代码的可执行文件。

        2.我们将内核代码编译成一个映像文件可以提高启动速度,并减少内存占用。另外就是内核映像文件的格式便于引导加载程序(如GRUB)读取和加载 。而且, 更新内核时,我们只需要替换这个内核映像文件,而不必修改系统中的每个单独文件。

        内核映像文件通常包含一个核心内核部分以及指向外部内核模块的接口。从而这些外部的内核模块可以在运行时动态加载,扩展内核的功能,如支持新硬件、文件系统等。

        不同的计算机有不同的计算机架构(如x86、ARM等), 可能需要不同的内核映像格式 ,通过 将内核编译成不同格式的映像文件 ,可以高效的适配这些不同的架构,从而 Linux内核 移植工作能够更加简便。

linux启动

        在前面我们介绍了 启动过程中,引导加载程序会从启动设备(硬盘、USB等)加载内核映像文件到内存中,然后将控制权交给内核。即启动内核后, 内核会初始化硬件并加载系统组件。

        还会加载根文件系统并执行初始化脚本,如/etc/rc.d/etc/inittab等,启动系统的服务和进程。

        一旦内核初始化完成,系统进入用户空间,开始正常运行。


http://www.kler.cn/a/548021.html

相关文章:

  • 前端构建工具
  • 聊聊 IP 地址和端口号的区别
  • 1219:马走日
  • 深入解析A2DP v1.4协议:蓝牙高质量音频传输的技术与实现
  • 上海正控ZK880 变频器基本操作
  • MongoDB 基本操作
  • 鸿蒙HarmonyOS NEXT开发:优化用户界面性能——组件复用(@Reusable装饰器)
  • 宏基传奇swift edge偶尔开机BIOS重置
  • Linux网络 | 多路转接Poll
  • NO.18十六届蓝桥杯备战|循环嵌套|乘法表|斐波那契|质数|水仙花数|(C++)
  • 深度学习-114-大语言模型应用之提示词指南实例DeepSeek使用手册(三)
  • docker搭建redis-cluster
  • FPGA简介|结构、组成和应用
  • MYSQL批量UPDATE的两种方式
  • AI自动驾驶:2025有戏,Uber受益先于特斯拉
  • 在 Kubernetes (K8s) 环境中,备份 PostgreSQL 数据库
  • AI在网络安全中的应用:构建智能防护体系
  • 《Python高性能计算实战:从NumPy并行化到分布式Dask集群》
  • 案例-02.部门管理-查询
  • 2024-arXiv-Alpha2:使用深度强化学习发现逻辑公式化Alpha