当前位置: 首页 > 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等,启动系统的服务和进程。

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

相关文章:

linux概念详解

用户守护进程 用户空间守护进程是一些在后台运行的长期服务程序,提供系统级服务。 下面举一些例子。 网络服务: 如sshd(SSH服务)、httpd(HTTP服务)。 sshd:sshd 守护进程会在后台运行&#x…...

easyexcel快速使用

1.easyexcel EasyExcel是一个基于ava的简单、省内存的读写Excel的开源项目。在尽可能节约内存的情况下支持读写百M的Excel 即通过java完成对excel的读写操作&#xff0c; 上传下载 2.easyexcel写操作 把java类中的对象写入到excel表格中 步骤 1.引入依赖 <depen…...

fetch() 与 XMLHttpRequest 的差异

fetch() 与 XMLHttpRequest 的差异 fetch() 的功能与 XMLHttpRequest 基本相同&#xff0c;都是向服务器发出 HTTP 请求&#xff0c;但有三个主要的差异。 &#xff08;1&#xff09;fetch()使用 Promise&#xff0c;不使用回调函数&#xff0c;因此大大简化了写法&#xff0…...

【java面向对象的三大特性】封装、继承和多态

目录标题 一、封装&#xff08;Encapsulation&#xff09;&#xff1a;二、继承&#xff08;Inheritance&#xff09;&#xff1a;三、多态&#xff08;Polymorphism&#xff09;&#xff1a;1. 多态的三个必要条件&#xff1a;2.多态的具体实现&#xff1a;3.多态的使用场景&a…...

c# textbox 设置不获取光标

[DllImport("user32",EntryPoint "HideCaret")] private static extern bool HideCaret(IntPtr hWnd); //需引入命名空间using System.Runtime.InteropServices; private void Txt_RecInfo_MouseDown(object sender, MouseEventArgs e) { …...

算法13-BFPRT算法

一、BFPRT 算法概念 BFPRT 算法&#xff08;Blum-Floyd-Pratt-Rivest-Tarjan 算法&#xff09;是一种用于在无序数组中快速找到第 k 小&#xff08;或第 k 大&#xff09;元素的高效算法。它的时间复杂度为 O(n)&#xff0c;在最坏情况下也能保证线性时间复杂度。BFPRT 算法的…...

android studio下载安装汉化-Flutter安装

1、下载android studio官方地址&#xff1a;&#xff08;这个网址可能直接打不开&#xff0c;需要VPN&#xff09; https://developer.android.com/studio?hlzh-cn mac版本分为X86和arm版本&#xff0c;电脑显示芯片是Inter的就是x86的&#xff0c;显示m1和m2的就是arm的 …...

Seaweedfs(master volume filer) docker run参数帮助文档

文章目录 进入容器后执行获取weed -h英文中文 weed server -h英文中文 weed volume -h英文中文 关键点测试了一下&#xff0c;这个-volume.minFreeSpace string有点狠&#xff0c;比如设置值为10&#xff08;10%&#xff09;&#xff0c;它直接给系统只留下10%的空间&#xff0…...

嵌套调用实现数组元素逆序存放

主函数调用reverse_array(int ptr[],int cnt)函数&#xff0c;该函数在调用inplace_swap(int *x,int *y)函数时&#xff0c;把两个不同的地址送给inplace_swap(int *x,int *y)函数&#xff0c;实现这两个位置处元素的交换。 令*xa,*yb 则*y *x^*y执行后&#xff0c;*xa,*ya^b…...

【工业安全】-CVE-2022-35555- Tenda W6路由器 命令注入漏洞

文章目录 1.漏洞描述 2.环境搭建 3.漏洞复现 4.漏洞分析 4.1&#xff1a;代码分析  4.2&#xff1a;流量分析 5.poc代码&#xff1a; 1.漏洞描述 漏洞编号&#xff1a;CVE-2022-35555 漏洞名称&#xff1a;Tenda W6 命令注入 威胁等级&#xff1a;高危 漏洞详情&#xff1…...

Spark 和 Flink

Spark 和 Flink 都是目前流行的大数据处理引擎&#xff0c;但它们在架构设计、应用场景、性能和生态方面有较大区别。以下是详细对比&#xff1a; 1. 架构与核心概念 方面Apache SparkApache Flink计算模型微批&#xff08;Micro-Batch&#xff09;为主&#xff0c;但支持结构…...

Jupyter lab 无法导出格式 Save and Export Notebook As无法展开

本来尝试jypyter lab如何导出HTML带有侧边导航栏&#xff0c;一顿操作后发现还是没实现。 又突然发现导出其他格式地功能不能用了&#xff0c;浏览器里Save and Export Notebook As展开按钮为灰色打不开。 经典想实现的没实现还把原先的搞坏了。 看了jupyter lab的运行信息发…...

C#(Winform)通过添加AForge添加并使用系统摄像机

先展示效果 AForge介绍 AForge是一个专门为开发者和研究者基于C#框架设计的, 也是NET平台下的开源计算机视觉和人工智能库 它提供了许多常用的图像处理和视频处理算法、机器学习和神经网络模型&#xff0c;并且具有高效、易用、稳定等特点。 AForge主要包括: 计算机视觉与人…...

【LeetCode: 611. 有效三角形的个数 + 排序 + 双指针】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…...

每日十题八股-补充材料-2025年2月15日

1.TCP是如何保证消息的顺序和可靠的&#xff1f; 写得超级好的文章 首先肯定是三次握手和四次挥手保证里通讯双方建立了正确有效的连接。 其次是校验和、序列号&#xff0c;ACK消息应答机制还有重传机制&#xff0c;保证了消息顺序和可靠。 同时配合拥塞机制和流量控制机制&am…...

国内已经部署DeepSeek的第三方推荐

大家好&#xff0c;我是苍何。 最近DeepSeek爆火&#xff0c;我也说点心里话&#xff0c;其实就我们普通人而言&#xff0c;要想用好 DeepSeek&#xff0c;其实无非就是要利用好工具为我们自己提效。 比如你是搞编程的&#xff0c;你就得学会如何用 DeepSeek 更快速的辅助你编…...

理解WebGPU 中的 GPUDevice :与 GPU 交互的核心接口

在 WebGPU 开发中&#xff0c; GPUDevice 是一个至关重要的对象&#xff0c;它是与 GPU 进行交互的核心接口。通过 GPUDevice &#xff0c;开发者可以创建和管理 GPU 资源&#xff08;如缓冲区、纹理、管线等&#xff09;&#xff0c;并提交命令缓冲区以执行渲染和计算任…...

APlayer - APlayer 初识(APlayer 初识案例、APlayer 常用事件)

一、APlayer APlayer 是一款轻量级、功能丰富的 HTML5 音频播放器 二、APlayer 初识案例 1、案例演示 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthde…...

c++中什么时候应该使用final关键字?

在C中&#xff0c;final关键字是自C11标准引入的重要特性&#xff0c;主要用于类继承和虚函数重写机制的约束。下面从技术原理、使用场景和最佳实践三个维度进行系统分析&#xff0c;并给出工业级代码示例。 目录 一、技术原理深度解析 二、关键使用场景分析 1. 类级别的fi…...

2025年2月15日(虚拟环境-deepseek)

好的&#xff0c;用户之前已经询问过如何在树莓派上安装venv&#xff0c;现在他们的问题是“如何使用”。我需要回顾之前的对话&#xff0c;看看之前是否已经涵盖了使用的部分&#xff0c;或者用户需要更详细的使用步骤。 首先&#xff0c;查看之前的回答&#xff0c;发现用户…...

PyTorch Lightning LightningDataModule 介绍

LightningDataModule 是 PyTorch Lightning 提供的数据模块,用于统一管理数据加载流程(包括数据准备、预处理、拆分、批量加载等)。它的核心作用是将数据处理逻辑与模型解耦,提高代码的可复用性和可读性。 1. LightningDataModule 的作用 ✅ 封装数据预处理:数据下载、清…...

Windows环境下使用Ollama搭建本地AI大模型教程

注&#xff1a;Ollama仅支持Windows10及以上版本。 安装Ollama 去 ollama官网 下载对应平台及OS的安装包。 运行安装包&#xff0c;点击“安装”按钮即可开始安装。Ollama会自动安装到你的 C:\Users\<当前用户名>\AppData\Local\Programs\Ollama 目录上。 安装完成后&…...

2024年认证杯SPSSPRO杯数学建模A题(第二阶段)保暖纤维的保暖能力全过程文档及程序

2024年认证杯SPSSPRO杯数学建模 A题 保暖纤维的保暖能力 原题再现&#xff1a; 冬装最重要的作用是保暖&#xff0c;也就是阻挡温暖的人体与寒冷环境之间的热量传递。人们在不同款式的棉衣中会填充保暖材料&#xff0c;从古已有之的棉花、羽绒到近年来各种各样的人造纤维。不…...

算法19(力扣244)反转字符串

1、问题 编写一个函数&#xff0c;其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。 不要给另外的数组分配额外的空间&#xff0c;你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。 2、示例 &#xff08;1&#xff09; 示例 1&a…...

DeepSeek 助力 Vue 开发:打造丝滑的卡片(Card)

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 Deep…...

ESP32 arduino + DeepSeek API访问

此项目主要使用ESP32-S3实现一个AI语音聊天助手&#xff0c;可以通过该项目熟悉ESP32-S3 arduino的开发&#xff0c;百度语音识别&#xff0c;语音合成API调用&#xff0c;百度文心一言大模型API的调用方法&#xff0c;音频的录制及播放&#xff0c;SD卡的读写&#xff0c;Wifi…...

最新国内 ChatGPT Plus/Pro 获取教程

最后更新版本&#xff1a;20250202 教程介绍&#xff1a; 本文将详细介绍如何快速获取一张虚拟信用卡&#xff0c;并通过该卡来获取ChatGPT Plus和ChatGPT Pro。 # 教程全程约15分钟开通ChatGPT Plus会员帐号前准备工作 一个尚未升级的ChatGPT帐号&#xff01;一张虚拟信用卡…...

SQLMesh 系列教程4- 详解模型特点及模型类型

SQLMesh 作为一款强大的数据建模工具&#xff0c;以其灵活的模型设计和高效的增量处理能力脱颖而出。本文将详细介绍 SQLMesh 模型的特点和类型&#xff0c;帮助读者快速了解其强大功能。我们将深入探讨不同模型类型&#xff08;如增量模型、全量模型、SCD Type 2 等&#xff0…...

三维重建(十二)——3D先验的使用

文章目录 零、最近感受和前言一、使用能够快速得到重建初始化的方法1.1 Colmap(多视角)1.2 深度估计(单视角)二、已知形状模板2.1 人脸2.2 人体2.3 动物三、刚性与非刚性约束(变形约束)3.1 刚性变形3.2 非刚性变形四、统计(深度学习)先验——从大量(3D)数据中提取信息…...

渗透利器:YAKIT 工具-基础实战教程.

YAKIT 工具-基础实战教程. YAKIT&#xff08;Yak Integrated Toolkit&#xff09;是一款基于Yak语言开发的集成化网络安全单兵工具&#xff0c;旨在覆盖渗透测试全流程&#xff0c;提供从信息收集、漏洞扫描到攻击实施的自动化支持。其核心目标是通过GUI界面降低Yak语言的使用…...