自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(994)
  • 资源 (4)
  • 问答 (1)
  • 收藏
  • 关注

原创 Linux系统软件工程师/嵌入式Linux应用开发工程师 知识体系构建 500篇(持续更新)

今年受疫情影响,企业经营必不可免地受到冲击,企业在选人用人方面比以往都更加谨慎,招聘也更加苛刻。hr都试图用最低的成本去招最优秀的人才。本人从事嵌入式软件开发多年,结合自己的经验,推出了《嵌入式软件工程师技术面专题》,预计会有40篇,分成硬件协议、多进程多线程编程、网络编程、linux基础、C/C++等几大模块,每一篇在末尾都总结了相关提问,其中有些知识,即使是工作了两三年的同学也未必都懂,所以社招的同学也可以看,对于找工作绝对有帮助。**不打无准备之战,提前做好准备,方可立于不败之地**。欢迎大家订阅,只

2020-09-13 11:12:01 48349 72

原创 Linux C/C++ or 嵌入式面试之《多进程多线程编程系列》(3) 守护进程

守护进程(daemon),是一种运行在后台 的特殊进程,它独立于控制终端 ,并周期性地执行某项任务或等待处理某些发生的事件。守护进程是个特殊的孤儿进程,这种进程脱离终端,为什么要脱离终端呢?之所以脱离于终端是为了避免进程被任何终端所产生的信息所打断,其在执行过程中的信息也不在任何终端上显示。由于在 Linux 中,每一个系统与用户进行交流的界面称为终端,每一个从此终端开始运行的进程都会依附于这个终端,这个终端就称为这些进程的控制终端,当控制终端被关闭时,相应的进程都会自动关闭。但是守护进程却能突破这种限制

2020-08-17 09:21:18 3103 4

原创 Linux C/C++ or 嵌入式面试之《多进程多线程编程系列》(4) 进程同步和通信的方式有哪些?

占个坑

2020-08-16 16:27:48 10688 3

原创 Linux C/C++ or 嵌入式面试之《多进程多线程编程系列》(15) 内核空间、用户空间、内核态、用户态

占个坑

2020-08-16 16:18:39 14675 2

原创 Linux C/C++ or 嵌入式面试之《多进程多线程编程系列》(13) 请你描述下进程虚拟内存空间布局

对于这个问题,面试官可能拿出一张白纸,让你尝试画出linux下进程的虚拟内存空间布局,然后=再让你简述下每个分区的作用,可能会挑几个重点分区,例如堆区、栈区来进行深入展开,考察你对堆栈的理解等等。文章目录1 内核空间2 栈(stack)3 内存映射段(mmap)4 堆(heap)5 BSS段6 数据段(Data)7 代码段(text)8 保留区问题提问在多任务操作系统中,每个进程都运行在属于自己的内存沙盘中。这个沙盘就是虚拟地址空间(Virtual Address Space),在32位模式下它是一个4

2020-08-16 16:00:34 1460 2

原创 Linux C/C++ or 嵌入式面试之《多进程多线程编程系列》(1) 进程和线程的基本概念与区别

占个坑

2020-08-15 12:59:17 2704 2

原创 Linux C/C++ or 嵌入式面试之《网络编程系列》(4) tcp四次断开若干问题

占个坑

2020-08-15 12:52:33 14404 2

翻译 apt remove vs apt purge:ubuntu软件包卸载

apt remove 和 apt purge 都做同样的事情,那就是卸载软件包。这是两者之间的唯一区别。让我分享一个使用 apt remove 和 apt purge命令删除 mplayer 应用程序的实际示例。在这两种情况下,您都必须从用户的主目录中删除剩余的配置文件,并运行 apt autoremove 以消除任何剩余的依赖项。如果您以错误的方式配置了应用程序并希望从头开始,则 apt purge 命令是前进的方法。但是在各种论坛中,您可能会遇到使用 apt purge 命令完全删除应用程序的建议。

2023-01-30 19:32:37 9

翻译 Linux再次在所有500强超级计算机上运行!

Linux可能正在努力争取一个体面的桌面市场份额,但它绝对统治着超级计算机的世界。Linux是选择的超级计算机操作系统。根据,Linux 现在运行在世界上所有最快的 500 台超级计算机上。之前的数字是498,因为剩下的两台超级计算机在2017年左右运行Unix。是一个独立的项目,于1993年启动,旨在对超级计算机进行基准测试。它每年发布两次有关他们已知的前 500 台最快的超级计算机的详细信息。您可以访问网站并根据各种标准(例如国家/地区,操作系统类型,供应商等)过滤。

2023-01-17 01:28:16 34

原创 内核解读之内存管理(12)进程虚拟内存管理 vm_area_struct 与反向映射

在32位的系统上,线性地址空间可达到4GB,这4GB一般按照3:1的比例进行分配,也就是说用户进程享有前3GB线性地址空间,而内核独享最后1GB线性地址空间。由于的引入,每个进程都可拥有3GB的虚拟内存,并且用户进程之间的地址空间是互不可见、互不影响的,也就是说即使两个进程对同一个地址进行操作,也不会产生问题。在前面介绍的一些分配内存的途径中,无论是伙伴系统中分配页的函数,还是slab分配器中分配对象的函数,它们都会尽量快速地响应内核的分配请求,将相应的内存提交给内核使用,而内核对待用户空间显然不能如此。

2023-01-12 22:06:27 221

转载 内核解读之内存管理(7)页分配器伙伴系统介绍

high参数就是用于该目的,当pcp中的内存高于high时,其会将一部分内存释放回buddy的free_area中,当然若pcp中的内存不足,也会从free_area中分配部分内存。例如对于上图的node 0节点,若需要分配非DMA的普通内存,则其先尝试从从node 0的normal zone分配,若分配不成功,则继续尝试从node 0的DMA zone分配,若依然不成功,则fallback到node 1中分配,依次类推。伙伴系统是linux的页框分配器,负责系统物理内存的分配工作。

2023-01-09 00:06:58 24

原创 内核解读之内存管理(4)内存管理三级架构之page

初始值为-1,如果只被一个进程的页表映射了,该值为0. 如果该page处于伙伴系统中,该值为PAGE_BUDDY_MAPCOUNT_VALUE(-128),内核通过判断该值是否为PAGE_BUDDY_MAPCOUNT_VALUE来确定该page是否属于伙伴系统。引用计数,表示内核中引用该page的次数, 如果要操作该page, 引用计数会+1, 操作完成-1. 当该值为0时, 表示没有引用该page的位置,所以该page可以被解除映射,这往往在内存回收时是有用的。最新版本的page结构体精简了好多。

2023-01-07 15:21:37 265

原创 内核解读之内存管理(3)内存管理三级架构之内存区域zone

而0xffff,8000,0000,0000以上的128T为系统空间地址, 这远大于当前我们系统中的内存空间, 因此所有的物理地址都可以直接映射到虚拟地址, 不需要高端内存的特殊映射。NUMA结构下, 每个处理器CPU与一个本地内存直接相连, 而不同处理器之前则通过总线进行进一步的连接, 因此相对于任何一个CPU访问本地内存的速度比访问远程内存的速度要快, 而Linux为了兼容NUMA结构, 把物理内存相依照CPU的不同node分成簇, 一个CPU-node对应一个本地内存pgdata_t。

2023-01-05 21:14:02 110

原创 内核解读之内存管理(5)内存模型

还是用于进程的页表?如果物理内存空间是一个连续的,没有空洞的地址空间,那么这种计算机系统的内存模型就是Flat memory,如图所示,我们将内存分成一页一页的Page frame,描述page frame的结构体page组成一个数组mem_map,通过将地址转换成页帧号(即该地址对应的page在page数组中的索引)可以取得该地址对应的page,就可以访问任何一页物理内存。如果是极致sparse内存模式,用一个page的大小来存放一个root的所有mem_section,也就是一个root有。

2023-01-04 22:49:10 137 1

原创 内核解读之内存管理(9) 第一个mm_struct

每个进程或内核线程都由一个任务描述数据结构(task_struct)来管理,每个task_struct中有个struct mm_strcut数据结构指针,用来管理任务的虚拟地址空间。而内核本身作为一个进程,也有对应的mm_struct。上面有个重要成员pgd,它记录了全局页目录项的地址,全局页目录项占据了一个page,swapper_pg_dir是在内核镜像链接脚本vmlinux.ld.S里定义的。init_mm是全系统第一个mm_struct,它记录了内核进程的内存信息。

2023-01-04 00:30:42 43

原创 内核源码解读之内存管理(10)percpu_page_set分析

在内核启动之初per_cpu机制还没有初始化,用于动态分配per_cpu变量的空间还没有分配,所以定义了一个静态的per_cpu变量boot_pageset,用以暂时管理内存域的per_cpu缓存。high记录了per_cpu缓存中页帧的上限,如果超过这个值就将释放 batch个页帧到伙伴系统中去,如果per_cpu中没有可分配的页帧就从伙伴系统中分配batch个页帧到缓存中来。per_cpu缓存中的页帧的page就挂接在struct list_head lists中。

2023-01-03 23:55:47 135

原创 内核解读之内存管理(2)内存管理三级架构之内存结点node

结合NUMA的架构,Linux抽象出了三级内存管理架构:内存节点node、内存区域zone和物理页框page。在NUMA模型中,每个CPU都有自己的本地内存节点(memory node),而且还可以通过QPI总线访问其他CPU下挂的内存节点,只是访问本地内存要比访问其他CPU下的内存的速度高许多,一般经过一次QPI要增加30%的访问时延。

2023-01-03 19:55:08 341

原创 内核解读之内存管理(1)CPU体系架构UMA和NUMA

所以,SMP 又称为 UMA(Uniform Memory Access,一致性存储器访问),其中,一致性指的就是在任意时刻,多个处理器只能为内存的每个数据保存或共享一个唯一的数值。上图的 NUMA Topology 有 2 个 NUMA node,每个 node 有 1 个 socket,即 pCPU, 每个 pCPU 有 6 个 core,1 个 core 有 2 个 Processor,则共有逻辑 cpu processor 24 个。多节点的设计有效提高了存储器的带宽和处理器的扩展性。

2023-01-03 16:31:04 260 2

原创 内核解读之内存管理(0)开篇介绍

内存管理是linux内核比较重要的一个模块,其实也是任何操作系统里的一个核心专题。在实际的开发工作中,经常会遇到和内存牵扯的问题,比如内存泄露啊,内存越界等。如果你的技术仅仅只是停留于业务层面,对内核的东西一无所知,遇到这些问题往往是束手无策的。我们从事嵌入式linux开发的,应用程序跑在linux操作系统上,你总不能对程序的运行载体一无所知吧。网上有很多关于内存管理的博客,零零散散,对对错错,并不系统,我在阅读了大概上百篇博客之后,结合最新版本(6.x)的内核源码,写了这个系列的文章。

2023-01-03 14:42:05 527

原创 lscpu查看cpu信息

超线程技术利用特殊的硬件指令,把两个逻辑内核模拟成两个物理芯片,让单个处理器都能使用线程级并行计算,进而兼容多线程操作系统和应用软件,减少CPU的闲置时间,提高CPU的运行效率。Bogo 意思是“假的,伪造的”,之所以说是假的,是因为在计算 BogoMIPS 的值时,CPU 一直在单一的执行 NOP (空操作),而不是随机执行指令集中的任意指令,所以不能以此作为 CPU 的性能指标。举例来说,如果某个服务器”2 路 4 核超线程”,也就是 2 个插槽,4 核心,默认为 2 thread,也就是 2。

2023-01-02 23:49:01 592

转载 什么是数字签名?

5、把上一步得到的两份摘要进行比较,如果两份摘要相等,说明文件经过用户A签名之后,在传输的过程中没有被更改;若不相等,说明文件在传输过程中被更改了,或者说已经不是原来的文件了,此时用户A的签名失效。4、用户B收到A传过来的信息后,首先将其中的文件也采用单向散列函数处理得出一份128位摘要,然后使用A的公钥对收到的加密的摘要进行解密得到另一份128位摘要。上面例子传输过程中,用户A使用数字签名时给用户B发送了一个数据包,数据包中包含了A的公钥、文件和加密的摘要。(binding);,得到的**“加密的摘要”

2023-01-01 12:02:57 19

转载 shell从入门到精通(32)优秀的shell编程习惯和规范

名称长的变量尽量使用小写字母+下划线的方式进行命名,如home_dir常量的定义推荐使用大写字母+下划线进行命名,如HOME_DIR在引用变量时为了避免不必要的麻烦,尽量使用${变量名}的方式进行引用变量名引用的坑的样例#!

2022-12-19 18:12:48 38

原创 去除string中的换行符

使用正则表达式匹配结果\n然后将匹配的字符串替换为"" (空字符串)。

2022-12-08 22:52:48 151

转载 SSH之known_hosts文件

A通过ssh首次连接到B,B会将公钥1(host key)传递给A,A将公钥1存入known_hosts文件中,以后A再连接B时,B依然会传递给A一个公钥2,OpenSSH会核对公钥,通过对比公钥1与公钥2 是否相同来进行简单的验证,如果公钥不同,OpenSSH会发出警告, 避免你受到DNS Hijack之类的攻击。。1、Linux环境2、Windows环境打开资源管理器,在地址栏输入 %USERPROFILE%\ssh 或 %USERPROFILE%.ssh 回车​​​​​host文件内容格式:ip

2022-12-08 13:23:09 48

原创 deb包安装/卸载/升级时,preinst, postinst, prerm, postrm的执行顺序

因需要将自己的应用打包为deb包,在考虑到安装、卸载、升级不同场景下进行测试,总结DEBIAN路径下的控制文件执行顺如preinst->postinstprerm->postrmprerm->postrm->postrmprerm->preinst->postrm->postinst

2022-12-08 11:38:35 70

原创 为何df和du看到的空间占用大小不一致

常见的df和du不一致情况就是文件删除的问题。当一个文件被删除后,在文件系统 目录中已经不可见了,所以du就不会再统计它了。然而如果此时还有运行的进程持有这个已经被删除了的文件的句柄,那么这个文件就不会真正在磁盘中被删除, 分区超级块中的信息也就不会更改。这样df仍旧会统计这个被删除了的文件。

2022-12-08 10:49:08 65

原创 tx2通过命令进入复位模式

sudo reboot --force forced-recovery

2022-12-08 10:10:37 29

原创 udev日志调试

开启udev日志udev_log:syslog记录日志的级别,默认值是 err。如果改为 info 或者 debug 的话,会有冗长的 udev 日志被记录下来。重启udevdsudo systemctl restart systemd-udevd

2022-12-06 18:01:04 107

转载 error: jump to case label

二、说明从上面的代码中可以看出,因为switch中没有单独的区域块来限定变量i的声明周期,所以变量的作用域是初始化点到switch的结尾处。这里由于我们无法确定其他case中是否会使用到这种变量,使用之前变量是否被初始化,所以编译器会报错。例如:test值为2,直接执行case 2的话,未定义变量就会出异常。这也是编译器报错的原因。经过检验发现,。三、修改方法1、【缩小作用域】将case 1的代码用{ }括起来,设定清楚变量i的作用域,避免其他case访问2、【扩大作用域】将变量i放到switch外

2022-12-06 17:47:58 86

原创 -Wnon-virtual-dtor持有虚函数却不是虚析构

-Wnon-virtual-dtor (C++ and Objective-C++ only)Warn when a class has virtual functions and an accessible non-virtual destructor itself or in an accessible polymorphic base class, in which case it is possible but unsafe to delete an instance of a derived c

2022-12-06 11:28:21 106

原创 -Wreorder成员未按顺序初始化

-Wreorder (C++ and Objective-C++ only)Warn when the order of member initializers given in the code does not match the order in which they must be executed. For instance:struct A {int i;int j;A(): j (0), i (1) { }};The compiler rearranges the member i

2022-12-06 11:25:12 84

转载 rwx权限对于目录和文件的具体含义

权限对于具体文件的含义文件上存储具体数据的地方,包括一般文件,数据库文件,二进制可执行文件等。因此权限对于文件的意义上这样都r: 可读权限,表示可以读取该文件的内容w:可写权限,表示可以编辑,新增或者修改该文件的内容(** 但是不包括删除文件 **),其实新增文件需要对文件所在目录有相应的权限x: 可执行权限,表示该文件可以被执行对于文件来说,权限都是针对其内容而言的,与文件名存在与否没有关系权限对于目录的含义目录是存放文件信息的地方,包括文件名等。对于目录而言r:可读权限,表示读取该目录结构

2022-12-05 22:22:20 92

原创 non-trivial designated initializers not supported

the order of initialization needs to be in the exact order of declaration.FOO foo = {.a = 1, .b = 2}; // OKFOO foo1 = {.a = 1}; // OKFOO foo2 = {.b = 2, .a = 1}; // Error sorry, unimplemented: non-trivial designated initializers not supporte

2022-12-05 13:46:25 283

转载 sed 正则表达式

sed是强大,高效的处理正则表达式。一些复杂的任务,可以解决简单的正则表达式。任何命令行专家都知道正则表达式的威力。本教程介绍了标准的正则表达式,POSIX类的正则表达式和元字符。考虑我们有一个文本文件 books.txt 将被处理,它有以下内容:标准的正则表达式行开始 (^)​ 插入符号(^)符号用于一行的开始匹配。下面的例子打印所有的启动与模式“the”行。​ 执行上面的代码,会得到如下结果:行尾 ($)​ 行尾是由美元符号($)符号表示。下面的例子打印“Coelho”结尾的行。​ 执行上

2022-12-05 10:15:15 36

转载 -fpermissive部分错误降低为警告--谨慎使用

该选项最好不要使用,因为会降低对于代码检查的严格性。该选项会将不一致代码的诊断从错误降级为警告。

2022-12-01 16:29:52 42

转载 git基础教程(48)git终结篇大总结

merge命令把不同的分支合并起来。如上图,在实际开放中,我们可能从master分支中切出一个分支,然后进行开发完成需求,中间经过R3,R4,R5的commit记录,最后开发完成需要合入master中,这便用到了merge。远程仓库的内容可能被分布在多个地点的处于协作关系的本地仓库修改,因此它可能与本地仓库同步,也可能不同步,但是它的内容是最旧的。你所处的分支变化了,或者产生了新的提交点,HEAD就会跟着改变。涉及到协作,自然会涉及到分支,关于分支,大概有展示分支,切换分支,创建分支,删除分支这四种操作。

2022-12-01 16:18:48 38

原创 /etc/passwd文件各个字段详解

因此,现在许多Linux系统(如SVR4)都使用了shadow技术,把真正的加密后的用户口令字存放到/etc/shadow文件中,只有超级用户才拥有该文件读权限,这就保证了用户密码的安全性,而在/etc/passwd文件的口令字段中只存放一个特殊的字符,例如“x”或者“*”。在大多数系统中,各用户的主目录都被组织在同一个特定的目录下,而用户主目录的名称就是该用户的登录名。用户登录后,要启动一个进程,负责将用户的操作传给内核,这个进程是用户登录到系统后运行的命令解释器或某个特定的程序,即Shell。

2022-11-11 00:15:18 133

原创 shell从入门到精通(0)什么是shell

Linux中的shell,是指一个面向用户的命令接口,接收用户输入的命令,并对命令进行处理,处理完毕后再将结果反馈给用户。shell的英文含义是“壳”,它是相对于内核来说的,因为它是建立在内核的基础上,面向于用户的一种表现形式,比如我们看到一个球,见到的是它的壳,而非核。Shell 程序本身的功能是很弱的,比如文件操作、输入输出、进程管理等都得依赖内核。

2022-11-10 01:13:38 101

原创 git基础教程(47)设置全局.gitignore

首先在任意位置创建一个文件作为全局的.gitignore, 我这里命名为.gitignore_global。

2022-11-09 10:09:16 199

原创 2022-2023全网最新linux系列教程100集--Linux目录结构你了解吗

linux目录结构你清楚吗。

2022-11-08 13:30:01 201 6

AOA Linux实现 ,含TCP转发

AOA Linux实现 ,含TCP转发

2022-03-17

HI3519AV100最新SDK smaple

海思最新SDK 程序 版本V2.0.1.0 最新

2019-03-29

RTP协议在嵌入式网络摄像机中的设计及实现.pdf

rtp,网络摄像头开发,描述了rtp推流,h264编码,v4l2视频流获取

2018-04-27

v4l2读取摄像头

v4l2读取摄像头,能在linux下编译,生成yuv文件,可以指定文件帧数

2018-01-30

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除