Linux
文章平均质量分 67
Linux内核及应用
雪*夹雨夹*雪
这个作者很懒,什么都没留下…
展开
-
链接库文件体积优化工具篇:bloaty
笔者之前参与过一个嵌入式智能手表项目,曾经碰到过这样一个问题:手表的flash大小只有2M,这意味着只能在上面烧录2M大小的代码。随着开发不断进行,代码越写越多,编译出来的bin也越来越大。最后bin大小超过了2M, 就没法烧写了,很尴尬。最后只能想办法精简代码,当然这是在不影响功能的前提下精简代码。那如何精简代码呢?我们自然会想到先看看哪里的代码最多,比如使用的各个so的大小,so里边哪个源文件最大,源文件里边哪一个函数最耗空间等等,先做一个统计分析,然后再看一下怎么优化。那这个统计如何进行呢?原创 2024-05-26 23:18:10 · 485 阅读 · 0 评论 -
存储器管理单元MMU概述
在ARM系统中,存储器管理单元MMU主要完成以下工作:● 虚拟存储空间到物理存储空间的映射。在ARM中采用了页式虚拟存储管理。它把虚拟地址空间分成一个个固定大小的块,每一块称为一页,把物理内存的地址空间也分成同样大小的页。页的大小可以分为粗粒度和细粒度两种。MMU就要实现从虚拟地址到物理地址的转换。● 存储器访问权限的控制。● 设置虚拟存储空间的缓冲的特性。页表(Translate Table)是实现上述这些功能的重要手段,它是一个位于内存中的表。原创 2024-04-14 17:27:03 · 610 阅读 · 0 评论 -
linux实时性分析
操作系统的实时性是指执行一个特定任务的时间是确定的和可预测的,这个任务执行时限需要考虑任何的情况,包括最恶劣的情况。或者说操作系统能够在规定的时间点内完成指定的任务操作,一旦超过这个时间点会对整个系统带来不可估量的后果,也就是指任务执行的及时性。这里以车辆紧急制动为例,这个任务的响应时间就是车载系统收到紧急制动指令到真正实施紧急制动这个动作所需的时间,我们当然希望这个时间是确定的而且是及时的,即需要保证在最恶劣的情况下也能保证在一定的时间内完成,否则车企可能就要上热搜了。原创 2023-04-16 22:39:28 · 1385 阅读 · 1 评论 -
OSAL操作系统抽象层
背景我们知道操作系统可以简单的分为内核和上层应用。其中内核是用来管理计算机的各种硬件资源和软件资源,比如内存资源,cpu资源,网络资源,还有各种外设资源等等。而应用程序就是调用计算机的各种资源来完成特定的任务,比如需要申请内存来保存数据,需要申请网卡资源来发送数据等等。当然应用程序需要某个资源时需要向内核发出申请。而内核会向应用程序提供一些接口来申请资源,这些接口称之为系统调用。当然一般应用开发不会直接调用系统调用,因为使用不方便,一般调用的是各种标准库的接口,比如glibc.标准库对系统调用进行了封装,原创 2021-10-10 19:30:57 · 6533 阅读 · 0 评论 -
linux共享内存的使用
介绍Linux共享内存接口及使用示例原创 2022-12-25 18:16:13 · 1430 阅读 · 0 评论 -
多线程并行归并排序算法实现
排序优化工程实现原创 2022-12-08 10:04:45 · 281 阅读 · 0 评论 -
TCP/IP 错误号
Linux, UNIX 系统上的常见 TCP/IP 错误符号原创 2022-12-05 15:32:29 · 1030 阅读 · 0 评论 -
我所理解的CPU中断
什么是中断假设你在玩王者荣耀,突然一个电话过来…, 这就是中断!对CPU来说就是:CPU在执行某一段程序的时候收到某些特定信号转而去执行另一段特定程序的过程。那为什么需要中断呢?原因是CPU不能闷着头啥也不管一个劲的只管执行代码,还得和连接在主板上的其它硬件打交道。经常和CPU保持联系的硬件有键盘、鼠标、磁盘,还有网卡等。如果没有中断那就意味着你猛敲键盘电脑都没反应,这显然不是你想要的结果。注意一点就是上图中,当CPU收到一个中断请求转去执行中断处理程序之后,不一定会返回继续执行原来的程序A,有可原创 2022-03-06 16:37:09 · 4193 阅读 · 6 评论 -
非标准编译器属性扩展
作为C标准的扩展,一些编译器允许函数、变量或类型使用一些非标准属性。GNU编译器集合(GCC)和LLVM/Clang使用__attribute__语法来指定这些属性。不同的编译器可能支持不同的属性,也有可能使用完全使用不同的语法。NetBSD代码通常应避免直接使用__attribute__或其它一些特定编译器提供的类似语法。但是NetBSD的在<sys/cdefs.h>头文件中提供了以下一些属性宏,这些属性宏能够自动拓展到对应编译器的语法。 __dead原创 2021-08-26 18:00:02 · 243 阅读 · 0 评论 -
C/C++,linux,数据库学习网站博客推荐
C++/C1,cppreference中文版英文版这个是学习C++非常好的一个网站,对于C++基本所有的特性都有非常详细的说明,还有一个很厉害的地方就是上面有很多代码示例,而且这些示例都是能够在线编译,在线运行的。也可以把自己的代码放上去运行。2,微软文档微软文档微软文档C++微软官网有很多技术文档,微软对C++的共享是很大,他们的各种文档做得非常好。对于C++文档而言是比较全面规范,比较权威,还有很多示例,各种图表也不错。除了C++,还有C#,.NET等很多其它文档Li原创 2021-08-16 11:51:45 · 113 阅读 · 0 评论 -
Linux读写锁
读写锁和互斥锁类似,但是读写锁允许更高的并行性。互斥锁要么是锁住状态,要么是不加锁状态,而且一次只有一个线程可以对其加锁。考虑这样一种场景,多个线程对一个文件进行读写操作,线程操作前先加锁,通常对文件的只读操作不会改变文件的状态,因此可以允许多个线程同时读取文件。如果使用互斥锁是做不到这一点的,这时候读写锁就上场了。读写锁就是用来解决这个问题的,读操作可以共享,写操作是排他的,可以有多个线程同时在读,但同一时间只能有一个线程写,同时线程写的时候不允许其它线程读。读写锁可以有三种状态:读模式加锁状态,写模原创 2021-08-12 20:22:31 · 288 阅读 · 0 评论 -
linux kfifo移植到应用层
最近由于项目需要在两个线程之间传递数据,就想到了内核的kfifo无锁队列,于是移植到应用层。为了使用更加方便,添加了拆包功能。原生的kfifo是字节流类型,改造之后变成了数据报类型。就是说接收方获取数据的时候要么是获取到一个完整的数据报,要么就什么都没获取到。不会有粘包问题。头文件:#ifndef _NO_LOCK_QUEUE_H_#define _NO_LOCK_QUEUE_H_#include <stdlib.h>#include <stdio.h>#in..原创 2021-08-10 21:27:43 · 748 阅读 · 0 评论 -
pipe管道和socket套接字的一些区别
pipe和socket都是比较常用的IPC方式,最近在项目中遇到IPC选型的问题,所以对这两种IPC方式进行了一些测试对比。socket分类socket可以按域,按类型,按协议来进行分类按域分类:域 描述 AF_INET ipv4因特网域 AF_INET6 ipv6因特网域 AF_UNIX Unix域(本地套接字) AF_UPSPEC 未指定 按类型分类:类型 描述 SOCK_DGRAM 固定长度的,无连接的,不可靠的报文原创 2021-08-09 12:09:29 · 4195 阅读 · 0 评论 -
Zlib 库使用示例
示例一:头文件:#ifndef COMPRESS_H#define COMPRESS_H#include <zlib.h>class LogCompress {public: LogCompress(); virtual ~LogCompress(); virtual int Compress(Bytef *data, uLong dlen) = 0; uLong zdlen = 0; unsigned char *zdata = nullpt原创 2021-07-29 20:03:41 · 972 阅读 · 1 评论 -
简单字符串正则表达式匹配实现代码
代码来源于Redis源码,能匹配简单的正则表达式,支持“*”,“?”,"[],"\\"#include <ctype.h>#include <string.h>/* Glob - style pattern matching. */int stringmatchlen(const char* pattern, int patternLen, const char* string, int stringLen, int nocase){ wh原创 2021-07-17 18:23:07 · 153 阅读 · 0 评论 -
Tizen sdb shell命令
语法和命令sdb [option] <command> [parameters]您可以通过在 [option] 中输入以下内容来指定 <command> 的目标:-d:将 <command> 发送到连接的设备,如果还有其他设备,则返回错误。-e:将 <command> 发送到正在运行的模拟器实例,如果还有其他实例,则返回错误。-s <serial number>:通过<serial number>向目标发送<c原创 2021-07-12 18:07:11 · 510 阅读 · 0 评论 -
使用UNIX域套接字传递pipe管道fd进行跨进程读写的一个例子
server:#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<sys/types.h>#include<sys/socket.h>#include<errno.h>#include<sys/un.h> #define SOCK_FILE "./chenxh" //通信的socket文件int create_local_原创 2021-06-03 18:16:50 · 850 阅读 · 0 评论 -
linux 携程库ucontext
在类System V的环境中,可以通过定义在<ucontext.h>头文件中的两个数据结构:mcontext_t 和ucontext_t ,以及四个接口,getcontext(), setcontext(), makecontext(), swapcontext(),来实现用户级别的上下文切换。mcontext_t类型是机器相关的且不透明。 这ucontext_t类型是至少具有以下内容的结构 :typedef struct ucontext_t { ...原创 2021-02-24 23:18:48 · 576 阅读 · 0 评论 -
从进程和线程的创建过程来看进程和线程的区别
在用户空间我们可以通过fork()函数来创建一个新的进程。fork()是一个glibc标准库函数,在内核里边会有一个系统调用与之对应--sys_fork()。同样的,我们是通过pthread_create()来创建一个线程,内核中对应的系统调用是clone()。现在通过分析sys_fork()和clone()的异同来看进程和线程的区别。本文是基于5.0版本的Linux内核。首先看一下sys_fork(),定义在kernel\fork.c文件中:SYSCALL_DEFINE0(fork){#if原创 2021-02-23 00:42:10 · 764 阅读 · 0 评论 -
Linux系统调用执行过程解析
系统调用和库函数系统调用是用户空间应用程序和内核提供的服务之间的函数接口。所有的操作系统都提供多种服务的入口点,应用程序通过这些入口点向内核请求服务,这些入口点就是系统调用。在glic标准库中会为每个系统调用设置一个具有同样名字的的函数,这些函数就是库函数。用户进程用标准C调用序列来调用这些标准库函数,然后标准库函数又用操作系统所要求的技术调用相应的内核服务。简单说就是标准库函数是系统调用的封装,主要是为了方便用户程序使用。以内存空间分配函数malloc为例,在glibc标准库的实现中是使用了一个...原创 2021-02-06 01:30:59 · 361 阅读 · 0 评论 -
任务切换:进程切换,线程切换的区别
开始之前,我们暂时先简单的定义一个概念,CPU任务,是指在CPU中运行的一段程序。根据任务的大小,粒度不同,一个任务可以是一个进程,一个线程,或者是一个中断处理程序等。一台冯诺依曼体系结构的计算机是有这五个部门构成:运算器、控制器、存储器、输入设备、输出设备。其中运算器、控制器组成CPU。而输入输出设备和任务切换基本没什么关系,所以可以简单的认为任务切换主要包括CPU切换和内存切换(地址空间)两部分。而在每个任务运行前,CPU 都需要知道任务从哪里加载、又从哪里开始运行,也就是说,需要系统事先帮它设原创 2021-01-31 21:14:03 · 1921 阅读 · 0 评论 -
epoll API解析及在redis中的应用
本文主要参考https://man7.org/index.html这个Linux/unix线上操作手册。epollepoll API的功能和select,poll等多路io复用接口类似,是用来监听多个文件描述是否有io事件发生。epoll API的核心概念是epoll实体,从用户空间的的角度来看,epoll实体是操作系统内核的一个数据结构,可以先简单的认为它包含有两个链表:interest list,或者叫epoll set,即epoll监听事件集合,是用来保存epoll实体所有监听的文件..原创 2021-01-30 16:51:27 · 259 阅读 · 0 评论 -
Linux信号处理程序的一个应用—定位故障
当程序突然暴毙崩溃之后我们首先要查明白三件事: 1,程序什么时候死的; 2,程序死在哪里(哪个函数,哪行代码); 3,怎么死的。 为了查明白这三件事情最常用的方法是: 1,取出内核在程序临终前生成的core文件,core文件就是程序将死之时留下的遗言; 2,通过反汇编工具和core还原案发现场。 关于core dump的详情见连接--[wiki](https://wiki.archlinux.org/index.php/Core_dump) 预知后事如何请听下回讲解...原创 2021-01-08 00:23:17 · 286 阅读 · 0 评论