
Arm-Linux技术漫谈
文章平均质量分 53
随便聊聊 Arm-Linux 技术
Aitel@
三尺微命,一介书生。
展开
-
eFuse技术
1. 概念eFuse的概念最早来源于2004年IBM工程师的发现。该发现表明:与更旧的激光熔断技术相比,电子迁移(EM)特性可以用来生成小得多的熔丝结构。EM熔丝可以在芯片上编程,不论是在晶圆探测阶段还是在封装中。采用I/O电路的片上电压(通常为2.5V),一个持续200微秒的10毫安直流脉冲就足以编程单根熔丝。通过运用eFuse技术,允许计算机芯片的动态实时重新编程。抽象地说计算机逻辑通常是“蚀刻”或“硬编码”到芯片上,在芯片完成后不能改变。通过使用eFuse技术,芯片制造商可以允许..转载 2022-04-02 15:52:37 · 4954 阅读 · 0 评论 -
NVM, PROM, OTP, eFuse傻傻分不清楚
1. 什么是NVM?NVM: Non-Volatile Memory,非易失性存储器NVM 的特点是存储的数据不会因为电源关闭而消失,像 Mask ROM、PROM、EPROM、EEPROM、NAND / NOR 闪存 (Flash Memory) 等传统 NVM,以及,目前许多正在研发的新型态存储器,如磁性存储器 (MRAM)、阻变存储器 (RRAM)、相变存储器 (PRAM)、铁电存储器 (FeRAM) 等等都属于 NVM。所以NVM的概念很大。从可编程次数来看,NVM可以分为3类:MTP:转载 2022-04-02 15:48:56 · 3126 阅读 · 0 评论 -
安全加密 - 秘钥和算法关系
密钥和加密算法之间关系按照密码学原则:所有算法都是公开的,只有密钥是保密的,攻击者无法破解密文的算法才是好的算法。明文+加密密钥,经过加密运算 得到 密文。 密文+解密密钥,经过解密运算 得到明文。大部分密码算法,加密运算和解密运算是完全一样的,只是所用秘钥不同。对称加密,加密解密的秘钥相同。非对称加密,加密解密的秘钥不同。...转载 2022-04-02 11:37:50 · 1524 阅读 · 1 评论 -
浅析安全启动(Secure Boot) —写得很好
前言安全启动的根本目的是为了防止消费者从软硬件层面对产品的部分关键系统进行读写、调试等高权限的操作。以限制消费者的能力,来达到保护产品的商业机密、知识产权等厂家权益的目的。当然,厂家是不会这样宣传 Secure Boot 的。他们的文案通常都是通过这项技术保护用户的隐私,防止恶意软件修改系统软硬件等等。不过不论如何,随着 ARM 架构的广泛授权,基于 TrustZone 的 Secure Boot 也越来越普遍了。本文是通过我自己对市面上的一些基于 ARM TrustZone 的 Sec...转载 2022-04-01 18:45:45 · 20030 阅读 · 5 评论 -
使用dd命令快速生成大文件或者小文件的方法
1. dd命令可以轻易实现创建指定大小的文件,如dd if=/dev/zero of=test bs=1M count=1000在当前目录下会生成一个1000M的test文件,文件内容为全0(因从/dev/zero中读取,/dev/zero为0源),但是这样为实际写入硬盘,文件产生速度取决于硬盘读写速度,如果欲产生超大文件,速度很慢。2.在某种场景下,我们只想让文件系统认为存在一个超大文件在此,但是并不实际写入硬盘dd if=/dev/zero of=test bs=1M cou..转载 2022-03-24 18:09:08 · 10371 阅读 · 0 评论 -
linux 命令 pushd popd cd 的区别
与linuxcd命令相似,用pushd实现在不同目录间切换 在命令行模式下,当你工作在不同目录中,你将发现你有很多时间都浪费在重复输入上如果这些目录不在同一个根目录中,你不得不在转换时输入完整的路径名,这难免让人有些难以忍受但你可以用以下的一个或两个步骤来避免所有多余的输入:用命令行解释器中的历史记录,或者用命令行函数pushd 用命令行解释器中的历史记录的好处是只需按很少的键在命令行中用向上的箭头来查找你用过的命令,直到你找到,然后按回车键如果你所切换的两个目录在整个驱动器的子目录结构中很接.转载 2022-03-24 16:32:51 · 278 阅读 · 0 评论 -
echo >”和“echo >>”的区别
> 输出重定向>> 输出追加重定向---------------------------------------------------------------------------------------------------------------------echo hello A将字符串hello A输出到屏幕---------------------------------------------------------------------------转载 2022-03-24 16:29:06 · 472 阅读 · 0 评论 -
使用 module_param 和 module_param_array 向内核驱动传递参数
对于如何向模块传递参数,Linux kernel 提供了一个简单的方法。宏定义kernel# include/linux/moduleparam.hmodule_param(name, type, perm);// 用于模块传递参数module_param_array(para , type , &n_para , perm); // 用于模块传递多个参数,传递的是数组name:既是用户看到的参数名,又是模块内接受参数的变量type: 表示参数类型,是下...原创 2021-12-29 19:40:18 · 701 阅读 · 0 评论 -
“gpio_direction_output” 和 “gpio_set_value”之间的使用关系
在linux驱动中常常会碰到:gpio_set_valu(port_num, 0/1)或 gpio_direction_output (port_num,0/1)这两者有什么关系呢gpio_set_value(port_num,0/1) 一般只是在这个GPIO口的寄存器上写上某个值,至于这个端口是否设置为输出,它就管不了! 而gpio_direction_output (port_num,0/1),在某个GPIO口写上某个值之后,还会把这个端口设置为输出模式。因此,有人也许就会建议,把gpi转载 2021-12-29 18:24:51 · 1287 阅读 · 0 评论 -
linux宕机时Oops分析及问题定位
以下面这个例子说明(下面这个例子就是造一个野指针所引发的错误):/* * test-debug-scr.c * * Copyright (C) 2012 - 2021 Reuuimlla Limited * * Adapt to support xxx */#include <linux/types.h>#include <linux/kernel.h>#include <linux/delay.h>#include <linux/id原创 2021-12-29 16:20:57 · 3561 阅读 · 0 评论 -
SPI的4种采样模式
极性 和 相位 的两两组合,构成了SPI的4种工作模式。极性一般表示为CPOL(Clock POLarity),相位一般表示为CPHA(Clock PHAse)。 CPOL(极性) CPHA(相位) MODE0 0 0 MODE1 0 1 MODE2 1 0 MODE3 1 1 CPOL: SPI空闲时的时钟信号电平(1:高电平, 0:低电平)CPH...原创 2021-12-29 08:18:11 · 5398 阅读 · 0 评论 -
linux中vmlinux, zImage, Image的区别
一、Linux内核镜像格式这几种文件都是Linux内核镜像格式,Linux内核有多种格式的镜像,包括:vmlinux、Image、zImage、bzImage、uImage、xipImage、bootpImage等.kernel镜像格式:vmlinuxvmlinuz是可引导的、可压缩的内核镜像,vm代表VirtualMemory.Linux支持虚拟内存,因此得名vm.它是由用户对内核源码编译得到,实质是elf格式的文件.也就是说,vmlinux是编译出来的最原...转载 2021-12-23 08:19:38 · 1885 阅读 · 0 评论 -
ARM的37个寄存器
(一)概述ARM处理器含有37个寄存器,这些寄存器包含以下两类:31个通用寄存器:包括程序计数器PC等,都是32位长度的寄存器。 6个状态寄存器 *37个寄存器中30个为“通用型”,1个固定用作PC,一个固定用作CPSR,5个固定用作5种异常模式下的SPSR。如下图:下图是 7种工作模式下每个模式下的寄存器列表:(二)CPSR程序状态寄存器主要记住高四位:1. 条件标志位-N: Negative result from ALU-Z...转载 2021-12-18 17:35:15 · 4885 阅读 · 0 评论 -
ARM体系的七种工作模式 和 两种工作状态
一、ARM体系的CPU有以下7种工作模式 用户模式(usr) 大多数程序运行于用户模式 特权模式 系统模式(sys) 运行具有特权的操作系统任务 异常模式 中断模式(irq) 快速中断模式(fiq) 必须进快处理中断请求,并离开这个模式 管理模式(svc) 操作系统使用的保护模式 数据访问终止模式(abt) 数据或指令预取终止时进入该模式 未定义指令终止模式(und) 未定...原创 2021-12-18 17:27:32 · 6543 阅读 · 0 评论 -
I2C总线仲裁机制
先说结论:遵循3个机制“线与”机制。多主机时,总线具有“线与”的逻辑功能,即只要有一个节点发送低电平时,总线上就表现为低电平。 SDA回读机制。总线被启动后,多个主机在每发送一个数据位时都要对自己的输出电平进行检测,只要检测的电平与自己发出的电平一致,就会继续占用总线。 低电平优先机制。由于线与的存在,当多主机发送时,谁先发送低电平谁就会掌握对总线的控制权。=====================================================================原创 2021-12-07 21:10:42 · 8749 阅读 · 3 评论 -
Linux completion完成量说明
completion是内核中的一种同步机制,该机制主要借助等待队列实现同步,该同步机制是一种简单的同步机制。下面简要分析下该同步机制的实现(本次源码基于linux 3.10)。一、结构体说明struct completion { unsigned int done; wait_queue_head_t wait;};主要包括等待队列头以及完成量统计值done变量。而针对等待队列头的结构体,主要包含自...转载 2021-12-04 15:20:47 · 157 阅读 · 0 评论 -
Linux内核编译之“.version”文件说明
最近做一个项目在移植内核的时候,发现方案公司提供的Linux内核里边有一个文件“.version”文件和我这边基础版本的内核源码里边的“.version”文件不一致,打开发现这个文件里边是一个数字,方案公司源码里边该数字是“161”,我这边对应文件数字为“104”。 看文件名字应该是和Linux内核版本有关,但是版本差异这么大,是方案公司提供的内核版本和我们要求的不一致吗?因为我们是要求方案公司在我们要求的内核版本上开发驱动的,如果内核版本差异较大,可能会存在相应隐患,故我...转载 2021-12-03 17:53:56 · 1110 阅读 · 0 评论 -
linux内核系统调用的SYSCALL_DEFINE分析
今天跟sys_mount系统调用发现在2.6.36内核下没有直接定义sys_mount而是用SYSCALL_DEFINE5来定义,于是在网上搜了一下找到了下面的资料(红字部分为网上资料):CVE-2010-3301是其中一个。这个漏洞的成因是,在64位的内核上执行32位的系统调用时,作为传递系统调用号的%rax高32位未被清零处理,而且在进行比较的时候直接使用的%eax,导致高32位被忽略: cmpl $(IA32_NR_syscalls-1),%eax j...转载 2021-12-02 08:41:57 · 729 阅读 · 0 评论 -
Buildroot的Package管理
buildroot在编译之前会根据.config 文件来检查output/build/package 的6个文件,做相应的步骤:.stamp_configured, 此文件表示已经配置过 .stamp_downloaded, 此文件表示源码已经下载过,没有此文件会重新下载 .stamp_patched, 此文件表示已经打过补丁 .stamp_extracted 此文件表示已经压过 .stamp_builted 此文件表示源码已经编译过 .stamp_target_installed 此文件表示原创 2021-11-30 11:50:15 · 1944 阅读 · 1 评论 -
使用Buildroot构建文件系统
简介 Buildroot是Linux平台上一个构建嵌入式Linux系统的框架。整个Buildroot是由Makefile脚本和Kconfig配置文件构成的。你可以和编译Linux内核一样,通过buildroot配置,menuconfig修改,编译出一个完整的可以直接烧写到机器上运行的Linux系统软件(包含boot、kernel、rootfs以及rootfs中的各种库和应用程序)。发行版:http://buildroot.net/downloads/历史版本:http://buildr...原创 2021-11-30 11:46:54 · 914 阅读 · 0 评论 -
选择适合的摄像头
摄像头定焦镜头有4mm/ 6mm/ 8mm/12mm的区别下面图片是安装了200万摄像机,在同一位置,采取不同的摄像机焦距,照射一样的距离情况下的对比图。原创 2021-10-14 10:52:46 · 274 阅读 · 0 评论 -
关于system和vendor分区中的ko文件
在Android O之后的版本中,很多ko被从kernel中提取出来,移动到system分区和vendor分区中保存。那么系统启动在服务加载之前首先需要把内核驱动模块全部加载起来才可以,所以system分区和vendor分区必须要先挂载起来。...原创 2021-11-24 11:18:50 · 2218 阅读 · 0 评论 -
关于/etc/init.d/中inittab文件中mount -t proc proc /proc的理解
mount 命令的标准用法是:mount -t type device dir对于 proc 文件系统来说,它没有实体设备。而在内核代码中,proc_mount函数根本没有处理 dev_name 这个参数,所以传什么都没有影响。只影响你的 mount 命令打印输出。static struct dentry *proc_mount(struct file_system_type *fs_type, int flags, const char *dev_name, void *data原创 2021-11-17 15:30:39 · 725 阅读 · 0 评论 -
uboot使用的内核镜像文件uImage头部64字节信息解析
(1)以下面的uImage为例:(2)该文件大小和创建日期如图所示:(3)该uImage由UE打开后如图所示:(4)其头部的64个字节信息如图:(5)对应的image_header结构体:(6)结合下图对每项结构体成员所对应的值说明(选择其中一部分):“__be32 ih_magic” 成员为镜像魔数。该成员的值为:0x27051956,应该为uImage的头部开始值,根据这个值,判断是否为uImage。“__be32 ih...原创 2021-11-01 17:17:53 · 5006 阅读 · 0 评论 -
根据cpuid固定mac的方法
使用#cat /proc/cpuinfo这条指令查看核心板的cpuid的值。 我所使用的核心板的cpuid值如下:Revision : 0000Serial : 8cc079914918101203c根据cpuid 经md5之后,作为固定MAC。将mac.sh的脚本放到文件系统/root目录下。mac.sh脚本内容如下:#!/bin/bashserialnum=`cat /proc/cpuinfo|grep "Serial"|...原创 2021-11-01 16:48:30 · 590 阅读 · 0 评论 -
make VERBOSE=1
make编译选项VERBOSE=1,可以让编译时的打印信息更加详细,方便查找问题。原创 2021-10-28 10:05:32 · 1674 阅读 · 0 评论 -
linux终端下更改printk的打印级别
1、查看当前控制台的打印级别# cat /proc/sys/kernel/printk该文件有4个数字值,它们根据日志记录消息的重要性,定义将其发送到何处,上面显示的4个数据分别对应如下:控制台日志级别:优先级高于该值得消息将被打印到到控制台;默认的消息日志级别:将用该优先级来打印没有优先级的消息;最低的控制台日志级别:控制台日志级别可被设置的最小值(最高优先级);默认的控制台日志级别:控制台日志级别的缺省值。以上的数值设置,数值越小,优先级越高。上面这个4个值的定义在原创 2021-10-19 17:07:11 · 5365 阅读 · 1 评论 -
Linux kernel启动log显示时间戳
1、前言在嵌入式Linux内核启动的log输出的时候,通常会有相应的时间戳,但是有的嵌入式开发板厂商在移植和适配Linux内核时,并没有进行配置该功能,本文将简单介绍如何修改defconfig配置,启用Linux kernel启动log显示时间戳的功能。2、添加时间戳显示宿主机:Ubuntu 16目标板:Hi3516dv300开发板Kernel版本:linux-4.9.37接下来介绍如何添加Linux内核配置:进入到Kernel源码根目录:$ cd linux-4.9.3转载 2021-10-19 16:47:39 · 2939 阅读 · 0 评论 -
linux下查看app/bin文件的浮点类型(软浮点/硬浮点)
在控制台对app/bin文件使用readelf查看elf文件信息:readelf -a xxx信息中有关于文件的浮点类型:在文件的header字段,找到Flags,如下:软浮点:Flags: 0x5000402, Version5 EABI, soft-float ABI, <unknown>硬浮点:Flags: 0x5000402, Version5 EABI, ...原创 2021-10-18 11:42:08 · 852 阅读 · 0 评论 -
linux CPU主频配置
CPU主频相关信息root@am335x-evm:/sys/devices/system/cpu/cpu0/cpufreq# lsaffected_cpus scaling_cur_freqcpuinfo_cur_freq scaling_drivercpuinfo_max_freq scaling_governorcpuinfo_min_freq scaling_max_fr转载 2021-10-12 14:20:31 · 3924 阅读 · 0 评论 -
linux编译RTL8188EUS wifi模块驱动到内核
AP模式1、 加载已经编译好的wifi驱动,一般驱动模块厂家已经写好:insmod /modules/wlan.ko2、 启动wlan0模块:ifconfig wlan0 up3、 设置wlan0的IP:ifconfig wlan0 192.168.1.1124、 hostapd工具的编译进入hostapd源码文件夹: cd /RTL8188EUS_linux_v4.1.4_6773.20130222//wpa_supplicant_host...转载 2021-09-30 15:01:20 · 1120 阅读 · 0 评论 -
Base64编解码原理
(1). Base64字符的组成部分Base64所用字符: 0,1,2 ….9 A,B,C,D…Z a,b,c,d…z + /对应ASCII: 48,49…58,65,66…90,97,98…122, 43,47(2). 10个数字,26个大写字母,26个小写字母,1个+,一个 / 刚好64个字符(3). Base64是将每3个字符转化为4个字符,即(3*8bit=4*6bit),如果文本结尾不足3个字符,对转化为6为字符后,后面剩余的二进制位可能是2位或者4位(因为是N%6...原创 2021-09-30 14:27:58 · 860 阅读 · 0 评论 -
串口调试终端加上登陆名和密码
方法一:修改/etc/inittab。将 ::respawn:/sbin/getty -L ttyS000 115200 vt100 -n root -I "Auto login as root ..."改为 ::respawn:/bin/login方法二:修改/etc/inittab。将 ::askfirst:-/bin/sh 改为::askfirst:-/bin/login,再将 ::respawn:/sbin/getty -L ttyS000 115200 vt10...原创 2021-09-07 17:37:39 · 1293 阅读 · 0 评论 -
Ubuntu设置默认arm-linux-gcc交叉编译环境
(1). 修改环境变量,把交叉编译器的路径加入到PATH,设置成默认交叉编译器。有三种方法,一般使用方法一和方法二。我一般使用编译器为:arm-linux-gnueabihf-gcc /arm-linux-gnueabihf-g++我的编译器路径为:/usr/arm/ext-toolchain/bin方法一:修改/etc/bash.bashrc文件#vim /etc/bash.bashrc在最后加上:export PATH=$PATH:/usr/arm/ext-toolchai.原创 2021-09-17 11:31:40 · 2771 阅读 · 0 评论 -
嵌入式平台使用microcom串口工具
嵌入式平台下,在平时调试时难免用到串口调试工具。如果系统集成了minicom软件,那就方便些。但一般很多系统通常不会集成minicom软件,因为minicom依赖于libncureses。在busybox中有一个简单的串口工具microcom,一般用来调试4G模块时相当方便。用法:终端输入microcom -t 5000 -s 115200 /dev/ttyUSB1其中:-t 5000 是代表超时时间,单位ms; -s 115200 是波特率参数;/dev/ttyU.原创 2021-09-04 17:42:51 · 1740 阅读 · 0 评论 -
关于ttyS0: 1 input overrun(s)错误
对于这个错误,网上的回答大多千篇一律,我找到两种有代表性的回答。第一种linux串口长期工作时,出现提示:ttyS0: 1 input overrun(s)说明串口已经输入溢出,这时候我们应该将串口的缓冲区进行清除。在发送命令前,清除缓冲区在接受数据后,清除缓冲区清除命令:tcflush(fd, TCIOFLUSH);当然fd是你串口open时返回的int,这个fd必须有意义(>0);TCIOFLUSH的意思是清除输入输出缓存。——————————————————原创 2021-09-08 09:01:24 · 4324 阅读 · 0 评论 -
linux调试串口改为普通串口使用
一、介绍一般一个linux开发板的串口0默认作为调试串口使用,也就是linux的shell调试终端,如果要作为普通串口使用需要相应的设置,这里以应用层修改的方法介绍怎么使用二、使用方法1、切换调试终端到其他串口//将shell切换到其他串口终端int change_cosole(char *tty){ int fp = 0; fp = open(tty, O_RDONLY); if(fp == -1) { printf("切换调试串口失败原创 2021-09-07 17:43:30 · 3624 阅读 · 0 评论 -
linux串口对0x11、0x13、0x0d特殊字符的处理
一般linux串口编程中,对c_iflag(termios成员变量)这个变量都没有进行有效的设置。在传送ASCII码时没什么问题,但在传送二进制数据时遇到0x0d,0x11和0x13却会被丢掉。不用说也知道,这几个肯定是特殊字符,被用作特殊控制了。0x0d 回车符CR0x11 ^Q VSTART字符0x13 ^S VSTOP字符关掉ICRNL和IXON选项即可解决:c_iflag &= ~(ICRNL | IXON);ICRNL 将输入的CR转换为NLI..原创 2021-09-07 18:49:05 · 2225 阅读 · 0 评论 -
项目开发中linux系统下,守护进程的设计思路
项目开发中linux系统下,守护进程的设计思路原创 2021-09-03 17:32:29 · 127 阅读 · 0 评论 -
linux下查看与设置串口(或串口终端)信息和属性
可以用stty指令,查看或设置某个串口的波特率等信息。在控制台输入:stty -F /dev/ttySn -a #ttySn为要查看的串口用stty设置串口参数: stty -F /dev/ttyS0 ispeed 115200 ospeed 115200 cs8该命令将串口1(/dev/ttyS0)设置成115200波特率,8位数据模式。一般情况下设置这两个参数就可以了,如果显示数据乱码,可能还需要设置其它参数,使用man查看stty...原创 2021-09-07 11:27:44 · 39293 阅读 · 0 评论