- 博客(109)
- 资源 (2)
- 收藏
- 关注
原创 新年新展望
展望一下2024年准备输出的内容,一个是对ISO26262的解读(方便参与功能安全认证工作的小伙伴能快速了解功能安全,也方便相关小伙伴能顺利快速通过考试),一个是Linux内核的详细解读(方便对Linux内核源码有阅读渴望的小伙伴,能够深入浅出的对内核有个全面的认识)。去年其实是收获颇丰的一年,除了工作中各项工作都得到了很大的推进,个人生活中也有很多变化,其中还拿到了功能安全工程师的证书,以及功能安全经理的证书。
2024-02-09 12:39:15 267
原创 ARM Cortex-A系列编程指南之ARMv8 A -- 第六章 A64指令集
多数写应用程序的开发者不需要写汇编程序,但是当需要高度优化的代码的时候,汇编代码就变得很有用。这种情况包括写编译器代码,或者需要实现低层级特性但是C语言中又没有;启动代码、设备驱动、或者开发操作系统时也需要。会阅读汇编代码,也会对调试C语言时有帮助,特别是了解C语言和这些指令直接的映射关系。6.1 指令助记符A64的汇编语言重载实现了指令助记符,并根据操作数寄存器的名字来进行区分。比如ADD指令,有不同的参数,我们只需要记住ADD这个指令,汇编器会自动根据参数(操作数)来选择正确的调用:ADD
2022-01-03 23:22:23 1094
原创 ARM Cortex-A系列编程指南之ARMv8 A -- 第五章 ARMv8指令集介绍
ARMv8体系结构增加了64位指令集,是对现存的32位指令集的补充,被叫做A64(运行在AArch64运行状态下)。运行在AArch32运行状态下的指令集是A32和T32。如果想详细了解A64的汇编语言,可以参考Documentation – Arm Developer,《Arm Compiler armasm User Guide Version 6.12》。5.1 ARMv8指令集5.1.1 区分32位和64位A64指令在A64指令集的指令有2种形式,或者32位,或者64位。1)寄存
2022-01-02 21:46:14 1661
原创 ARM Cortex-A系列编程指南之ARMv8 A -- 第四章 ARMv8寄存器
1、通用寄存器AArch64运行环境提供了31个64bit的通用寄存器:X0~X31,同时他们也都有32bit的形式:W0~W31,他们对应映射到64bit寄存器的低32位。读取W寄存器,将会只读X的低32位;写W寄存器,将会将X的高32位写为0。也就是说设置W0为0xFFFFFFFF,结果设置X0为0x00000000FFFFFFFF。2、AArch64特殊寄存器除了31个核心寄存器外,还有一些特殊寄存器。在AArch64运行状态,异常返回的状态,保存在每个异常等级的.
2021-12-12 22:47:22 1788
原创 ARM Cortex-A系列编程指南之ARMv8 A -- 第三章 ARMv8基础
1、异常等级ARMv8处理器运行时,运行在4种异常等级的其中一个等级。和ARMv7的特权等级类似,在AArch64运行状态,异常等级决定了特权等级。EL0~EL3,数字越高,异常等级越高。EL0 普通用户应用 EL1 操作系统内核 EL2 Hypervisor EL3 低层级固件(包括Secure Monitor) 一般情况下,应用程序、操作系统内核、Hypervisor,占有一个单独的异常等级。但是有个例外,就是像KVM这样的在内核中的Hyperviso
2021-12-06 23:50:11 1223
原创 ARM Cortex-A系列编程指南之ARMv8 A -- 第二章 ARMv8 A架构和处理器
从1985年开始ARM架构经历了如下阶段:ARMv4及早期版本 早期的使用ARM32bit指令集 ARMv4T ARM32bit指令集的基础上,追加了Thumb16bit指令集。 这是第一个被广泛授权的ARM架构。 ARM7TDMI®和ARM9TDMI®处理器。 ARMv5TE The ARMv5TE architecture added improvements for DSP-type operations, sa.
2021-12-05 23:25:34 2624
原创 ARM Cortex-A系列编程指南之ARMv8 A -- 第一章 简介
ARMv8既包括32bit运行状态(execution state),又包括64bit运行状态。ARMv8可以对64bit宽的寄存器进行操作,但是也向后兼容ARMv7的软件(32bit的),也就是说ARMv7的软件(32bit的)可以在ARMv8上运行。通常用“AArch64”来表示64bit运行状态,“AArch32”来表示32bit运行状态(几乎和ARMv7是一样的)。因为ARMv8的很对概念,在ARMv7中都有,所以不是所有详细的概念都在这里包含了。对ARMv7架构的介绍,可以参考《ARM®
2021-11-30 23:26:55 808
原创 ARM Cortex-A系列编程指南之ARMv8 A -- 前言
2013年,ARM发布了64bit ARMv8架构。这是2007年ARMv7以来,ARM架构的重大变更,也是自ARM架构被创建以来最基础,影响也最深远的变更。写这份指南的作者,绝大部分也是《Cortex-A Series Programmer’s GuideCortex-A Series Programmer’s Guide》的作者。这份指南是如下资料的补充:每个处理器的《Technical Reference Manuals (TRMs)》、具体设备和板子的相关资料、《ARM Architectu
2021-11-30 22:29:49 339
原创 ARM Cortex-A系列编程指南之ARMv8 A
此系列文章是对《ARM® Cortex®-A Series Programmer's Guide for ARMv8-A》的重点解读,目的是对ARMv8 A的官方编程指南进行解读和重点内容整理,方便网友和自己深入使用。其下载路径在:Documentation – Arm Developer=========================================================================注意:本文为本人原创,版权所属为个人所有,欢迎转载,但是转载
2021-11-30 22:12:55 801
原创 Linux内存那些事 -- OOM
1、介绍OOM killer(Out Of Memory killer)是Linux内核的一个机制,该机制会在内存分配失败的时候被触发,然后根据配置来决定是下一步策略:或者引起系统panic而重启,或者将一些bad的进程kill掉。2、OOM相关参数OOM的参数可以通过应用层来进行设置,这些接口一般都在/proc/sys/vm下。参数 说明 可选值 可选值说明 panic_on_oom 用来控制当内存不足时是否启用OOM 0 内存不足时,启动 OOM
2021-08-08 16:34:55 843
原创 Linux内存那些事 -- VSS、RSS、PSS、USS
1、背景如果一个进程内存消耗太多,那么会导致整个系统内存紧张,而出现OOM等。所以我们经常会需要统计整个系统各个进程内存消耗的情况。一般对一个进程的内存的表示有4种方式:VSS、RSS、PSS、USS,那么什么时候应该用哪种方式统计呢?我们需要先了解他们的差别:VSS- Virtual Set Size 虚拟耗用内存(包含共享库占用的全部内存,以及分配但未使用内存)RSS- Resident Set Size 实际使用物理内存(包含共享库占用的全部内存)PSS- Proportional S
2021-08-07 09:42:12 2027
原创 GCC详解-Binutils工具之c++filt
1、介绍C++的name mangling遵循一定的规则,因此是可逆的,即通过符号还原出原来的函数定义。c++filt就是这样的一个工具。2、例子直接上例子。我们写一个C++程序:#include <stdio.h>class A{public: int a_func(int a, int b) { return a+b; } int a_func(int a)
2021-07-25 19:49:54 867
原创 GCC详解-gcc之-Wl选项
1、介绍-Wl后面的东西是作为参数传递给链接器ld的。比如:gcc -Wl,aaa,bbb,ccc最后会被解释为:ld aaa bbb ccc2、-Wl,-Map=xxx.txt 生成map文件如下会生成map文件mymap.txt。gcc -Wl,-Map=mymap.txt -g main.c -o main3、-Wl,-Bstatic 和 -Wl,-Bdynamic 指定链接动态库或者静态库-Wl,-Bstatic -laaa -lbbb -lccc.
2021-07-25 18:34:28 10892 1
原创 GCC详解-Binutils工具之addr2line
1、介绍addr2line是一个可以将指令的地址和可执行映像转换为文件名、函数名和源代码行数的工具。可以通过帮助看下其使用情况:$ addr2line -hUsage: addr2line [option(s)] [addr(s)]Convert addresses into line number/file name pairs.If no addresses are specified on the command line, they will be read from std..
2021-07-25 18:07:14 1088
原创 GCC详解-Binutils工具之objdump
1、介绍objdump是用查看目标文件或者可执行的目标文件的构成的工具。2、参数 选项 详细选项 描述 -a --archive-headers 显示档案库的成员信息,类似 ls -l 将 lib*.a 的信息列出。 -b bfdname --target=bfdname 指定目标码格式。这不是必须的,objdump 能
2021-07-25 17:32:20 613
原创 GCC详解-Binutils工具之nm
1、介绍nm用来列出目标文件中的符号,用以定位和分析执行程序和目标文件中的符号信息和它的属性。它可以和readelf、objdump、addr2line工具配合使用。1.1 参数总结 选项 描述 -A 同选项 --print-file-name -a 同选项 --debug-syms -B 同选项 --format=bsd。这是默认设置
2021-07-25 11:42:17 1763
原创 GCC详解-Binutils工具之strip
1、介绍strip经常用来去除目标文件中的一些符号表、调试符号表信息,以减小静态库、动态库和程序的大小。其基本用法:strip xxx或者strip xxx -o yyy2、优缺点优点:strip后占空间小缺点:strip后不方便调试,addr2line等不能使用针对缺点的应对策略:strip前的库用来调试, strip后的库用来实际发布, 他们两者有对应关系。 一旦发布的strip后的库出了问题, 就可以找对应的未strip的库来定位。3、适用范围3.1 动态库
2021-07-25 09:55:34 2810
原创 GCC详解-Binutils工具之strings
1、介绍strings 工具在对象文件或二进制文件中查找可打印的字符串。这里的字符串是指:4个或更多可打印字符的任意序列,以换行符或空字符结束。当然,这里的4可以通过-n指定和修改。2、常用用途我们知道了strings的用法后,那么我们什么情况下才会用它呢?其实这么几个地方可能会经常用到:2.1 快速确认版本比如程序里有个版本定义:char version[] = "aaa_xxx_v0.1",那么可以通过strings xxx.binary | grep version
2021-07-24 23:08:47 512
原创 GCC详解-Binutils工具之size
1、size工具介绍size工具会列出程序文件中各段的大小。我们可以查看帮忙:$ size --helpUsage: size [option(s)] [file(s)]Displays the sizes of sections inside binary filesIf no input file(s) are specified, a.out is assumedThe options are: -A|-B --format={sysv|berkeley} Sel...
2021-07-24 22:39:57 1094
原创 GCC详解-gcc之创建动态库静态库及其使用
1、动态库1.1 创建动态库创建库文件的头文件mylib.h,内容为:int myfun(int a);创建库文件的源文件mylib.c,内容为:#include <stdio.h>#include "mylib.h"int myfun(int a){ return a;}使用如下命令生成我们的共享库libmy.so:gcc -fPIC -shared mylib.c -o libmy.so1.2 使用动态库创建main.c,...
2021-07-24 22:23:05 1052
原创 GCC详解-Binutils工具之readelf
1、介绍readelf从ELF 格式的目标文件显示信息。readelf和objdump提供的功能类似,但是它显示的信息更为具体,并且它不依赖BFD库(BFD库是一个GNU项目,它的目标就是希望通过一种统一的接口来处理不同的目标文件)2、ELF格式的文件ELF(Executable and Linking Format)是一个定义了目标文件内部信息如何组成和组织的文件格式。内核会根据这些信息加载可执行文件,内核根据这些信息可以知道从文件哪里获取代码,从哪里获取初始化数据,在哪里应该加载共享库,
2021-07-24 17:45:14 1107
原创 GCC详解-gcc
1、背景1.1 gcc介绍如上一篇介绍的,gcc执行编译程序和连接程序以产生需要的输出;而g++是gcc 的一个版木,默认语言设置为 C++,而且在连接的时候自动包含标准 C++ 库。所以,简单来讲,我们可以使用gcc将代码,编译成可以执行的程序。以C/C++为例,我们可以总结下gcc能做如下的事情:输出预处理后的C/C++源程序(展开头文件和替换宏) 输出C/C++源程序的汇编代码 输出二进制目标文件 生成静态库 生成可执行程序 转换文件格式1.2 gcc编译过程如图所示,
2021-07-24 10:41:22 2478
原创 GCC详解-总览
1、GCC是什么早期 GCC 的全拼为 GNU C Compiler,即 GUN 计划诞生的 C 语言编译器,显然最初 GCC 的定位确实只用于编译 C 语言。但经过这些年不断的迭代,GCC 的功能得到了很大的扩展,它不仅可以用来编译 C 语言程序,还可以处理 C++、Go、Objective -C 等多种编译语言编写的程序。与此同时,由于之前的 GNU C Compiler 已经无法完美诠释 GCC 的含义,所以其英文全称被重新定义为 GNU Compiler Collection,即 G
2021-07-18 08:08:19 3835
原创 跟我一起写Shell脚本之二十三--标准输入和输出,以及重定向
1、什么是标准输入和输出当我们执行一个shell命令行时,一般会自动打开三个标准文件1)标准输入文件(stdin),通常对应终端的键盘;2)标准输出文件(stdout),默认对应终端的屏幕;3)标准错误输出文件(stderr),默认对应终端的屏幕。命令从标准输入文件中得到输入数据,将正常输出数据输出到标准输出文件,而将错误信息送到标准错误文件中。因为Linux里一切皆是文件,所以标准输入和输出也不例外,也是文件。是文件就有文件描述符,这三个标准文件的文件描述符是固定的:1)标准输入文件
2021-07-17 18:19:29 925
原创 POSIX介绍
1、POSIX简单介绍POSIX(Portable OperatingSystem Interface)标准定义了"POSIX兼容"的操作系统所必须提供的服务。是为了统一UNIX-like 的OS对外的接口,方便OS之上的应用在各种OS上移植运行,而产生的一套标准OS API。glibc 就是是完全按照POSIX 的标准制作的。2、PSE51EEE 1003.13是针对嵌入式领域制定的标准,根据范围的大小又分为4个不同的Profile,PSE51, PSE52, PSE53和PSE54。
2021-07-12 21:49:43 1595
原创 glibc所包含的各个库
1、glibc所包含的各个库介绍废话少说,直接介绍glibc包含了哪些库: Library component Content Inclusion guidelines ld (This library component is not itself a library. Instead, ld.so is an executable invoked by the ELF binary format loader to l
2021-07-12 21:20:28 2214
原创 C标准、C标准库、C++标准、C++标准库
1、C标准C标准主要有三个版本:C89、C99、C11,他们之间的关系可以借用这张图来表示:C 标准主要由两部分组成:描述C的语法,和描述C标准库。C标准库定义了一组标准头文件,每个头文件中包含一些相关的函数、变量、类型声明和宏定义。要在一个平台上支持C语言,不仅要实现C编译器,还要实现C标准库,这样的实现才算符合C标准。不符合C标准的实现也是存在的,例如很多单片机的C 语言开发工具中只有C编译器而没有完整的C标准库。2、C标准库2.1 GNU/Linux版本的实现glibc是Lin
2021-07-11 19:07:20 1065
原创 man命令详解
1、简介 我们都知道,在linux里如果查看帮助的话,可以用man命令。但是如果在man后面加一个数字,可以查看具体的范围。数字 意义 1 用户命令 2 系统调用 3 C语言库函数 4 设备或特殊文件 5 文件格式和规则 6 游戏及其他 7 宏、包及其他杂项 8 系统管理员相关的命令 2、例子...
2021-07-10 23:14:34 2976
原创 跟我一起写Shell脚本之二十二--常用命令(xargs)
1、介绍 od是Octal Dump的简写,用于将指定文件内容以八进制、十进制、十六进制、浮点格式或ASCII编码字符方式显示,通常用于显示或查看文件中不能直接显示在终端的字符。 其语法如下:od [<选项><参数>] [<文件名>] 详细命令选项介绍:-A,--address-radix=RADIX: 指定地址(文件offset)用什么基数显示,包括: d 十进制 o 八进制(系统默认值) ...
2021-07-06 22:16:39 319
原创 跟我一起写Shell脚本之二十一--常用命令(od)
1、介绍 od是Octal Dump的简写,用于将指定文件内容以八进制、十进制、十六进制、浮点格式或ASCII编码字符方式显示,通常用于显示或查看文件中不能直接显示在终端的字符。 其语法如下:od [<选项><参数>] [<文件名>] 详细命令选项介绍:-A,--address-radix=RADIX: 指定地址(文件offset)用什么基数显示,包括: d 十进制 o 八进制(系统默认值) ...
2021-07-04 20:57:58 827
原创 跟我一起写Shell脚本之二十--常用命令(cut)
1、介绍 cut命令也是我们写脚本时经常用到的命令,主要用来显示文件或者标准输入的每一行,从xxx1到xxx2的内容。常用方法可以总结到一张表里:语法 说明 cut [-nb] [file] -b是以字节为单位进行分割,但是遇到多字节字符的时候有可能会出现乱码。所以加上-n选项就可以解决。 cut [-c] [file] -c是以字符为单位进行分割 cut [-df] [file] -f是以域为单位进行分割。 -d指定分割域的方法 ..
2021-06-27 10:10:47 491
原创 跟我一起写Shell脚本之十九--常用命令(tail)
1、介绍 tail也是我们经常在脚本中用到的一个命令,它和head类似,但是如名字所示,它主要用来显示文件的结尾部分内容。我们可以用man tail查看下它的介绍:NAME tail - output the last part of filesSYNOPSIS tail [OPTION]... [FILE]...DESCRIPTION Print the last 10 lines of each FILE to standar...
2021-06-25 23:01:36 2810
原创 跟我一起写Shell脚本之十八--常用命令(head)
1、介绍 head也是我们经常在脚本中用到的一个命令,主要用来显示文件的开头部分内容。我们可以用man head查看下它的介绍:NAME head - output the first part of filesSYNOPSIS head [OPTION]... [FILE]...DESCRIPTION Print the first 10 lines of each FILE to standard output. With mor...
2021-06-25 20:02:53 4147
原创 跟我一起写Shell脚本之十七--常用命令(sed)
1、介绍sed也是我们在写脚本时经常用到的一个非常强大的命令。sed是一个非交互流式文本编辑器,可以对文本文件进行增、删、改、查等操作,支持按行、按字段、按正则匹配文本内容,非常灵活和方便,特别适合于大文件的编辑。sed在处理文本时会逐行读取文件内容,读到匹配的行就根据指令做操作,不匹配就跳过。sed能同时处理多个文件多行的内容,可以不对原文件改动,把整个文件输入到屏幕,可以把只匹配到模式的内容输入到屏幕上。还可以对原文件改动,但是不会再屏幕上返回结果。2、语法sed的语法有两种
2021-05-16 21:55:46 206
原创 跟我一起写Shell脚本之十六---命令(wc)
今天我们来了解下wc命令的用法。1、基本用法wc命令是用来统计文件的行数、字节数等。其用法如下:wc [-lcmw] [file...]-l 统计行(line)数-w 统计字(word)数-c 统计字节(character)数我们写个脚本试验下:#!/bin/bashif [ $# -gt 0 ]; then filename=$1else filename="027_function1.sh"fiecho `wc $file
2021-05-06 20:43:26 1941
原创 跟我一起写Shell脚本之十五---写文件
1、创建一个新文件并写入内容我们写脚本如下:#!/bin/bashecho "Begin to write our own file"if [ $# -lt 1 ]; then filename="myfile1"else filename=$1ficat>$filename<<EOFfirst line2nd linehahahahhohhohoEOF<<EOF 表示当遇到EOF时结束输入。执行结果
2021-05-05 11:01:42 7598
原创 跟我一起写Shell脚本之十四---函数
1、定义当有多条语句会被重复使用时,我们可以考虑封装成一个函数。函数的语法有如下两种:函数名(){ xxx}或者function 函数名(){ xxx}2、简单例子我们写个简单的函数的例子027_function1.sh:function myfunc(){ echo "my function" "$1"}myfunc aamyfunc bbmyfunc cc执行结果(用bash可以,但是用sh会报错):$ ...
2021-04-27 21:27:21 137
原创 跟我一起写Shell脚本之十三---循环(4 for 文件循环)
for循环大体可以分为如下3种类型:字符循环,数字循环,文件循环。今天我们了解文件循环,直接上例子:1、文件循环例子1写脚本025_for_file1.sh#!/bin/bashfor file in $(ls /sys)do echo $file;done 执行结果:$ sh 025_for_file1.shblockbusclassdevdevicesfirmwarefshypervisorkernelmodulepowe...
2021-04-26 20:41:45 169
原创 跟我一起写Shell脚本之十二---循环(3 for 数字循环)
for循环大体可以分为如下3种类型:字符循环,数字循环,文件循环。今天我们了解数字循环,直接上例子1、数字循环例子一 写脚本022_for_dig1.sh:#!/bin/bashfor i in $(seq 10 20)do echo $i; echo $(expr $i + 100); echo $(($i + 200));done 执行结果:$ sh 022_for_dig1.sh1011021011111...
2021-04-25 20:14:10 949
原创 跟我一起写Shell脚本之十一---循环(2 for 字符循环)
for循环大体可以分为如下3种类型:字符循环,数字循环,文件循环。今天我们了解字符循环,直接上例子:1 字符循环例子1写脚本018_for_char1.sh#!/bin/bashfor i in aa bb cc dd eedo echo $idone 执行结果$ sh 018_for_char1.shaabbccddee2 字符循环例子2写脚本019_for_char2.sh#!/bin/bashmyinput="111...
2021-04-20 22:14:51 314
基于directshow的播放器
2010-02-22
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人