Yuhang Zheng
ARM平台获取CPUID的方法

目前工作中需要获取LS10xx平台的CPUID,然后网上搜到了一些方法,在这里先简单记录一下。

CPUID寄存器内容:

字段名:Implementer(venter 销售ID)|Variant(大版本号) | Architecture(架构版本)| Part Num(产品代码)|Revision(小版本号)

基址偏移量: [31-24] | [23-20] | [19-16] | [15-4] | [3-0]

下面直接上操作,以LS1046为例

1、使用cat /proc/cpuinfo命令可以看到

root@localhost:~# cat /proc/cpuinfo
processor       : 0
BogoMIPS        : 50.00
Features        : fp asimd evtstrm aes pmull sha1 sha2 crc32 cpuid
CPU implementer : 0x41
CPU architecture: 8
CPU variant     : 0x0
CPU part        : 0xd08
CPU revision    : 2

processor       : 1
BogoMIPS        : 50.00
Features        : fp asimd evtstrm aes pmull sha1 sha2 crc32 cpuid
CPU implementer : 0x41
CPU architecture: 8
CPU variant     : 0x0
CPU part        : 0xd08
CPU revision    : 2

processor       : 2
BogoMIPS        : 50.00
Features        : fp asimd evtstrm aes pmull sha1 sha2 crc32 cpuid
CPU implementer : 0x41
CPU architecture: 8
CPU variant     : 0x0
CPU part        : 0xd08
CPU revision    : 2

processor       : 3
BogoMIPS        : 50.00
Features        : fp asimd evtstrm aes pmull sha1 sha2 crc32 cpuid
CPU implementer : 0x41
CPU architecture: 8
CPU variant     : 0x0
CPU part        : 0xd08
CPU revision    : 2

按照上面的规则换算下来就是

Implementer        |Variant    | Architecture    |Part Num    |Revision
0x41            0            f                d08            2
LS10xx安全架构和安全启动

一、信任架构概述

QoriQ平台的信任架构可以使开发者仅仅靠运行”授权软件程序“来保护您设计的产品,并提供工具在运行环境的生命周期内不间断的检测硬件的安全状态,在运行时环境中检测到的异常会触发硬件状态更改,从而导致系统锁定对先前加密数据的访问或重启硬件。

所有具有信任架构的QorlQ Layerscape 设备都支持以下两种启动模式:

  • 正常启动(不信任环境)
  • 安全启动

预引导加载程序 pre-boot loader(PBL)允许您在正常引导或安全引导之间进行选择。有两种方法可以命令PBL启动安全启动过程:

  • 对正在运行的系统的安全意图 intent to secure(ITS)保险丝进行编程
  • 在原型设计之初就在RCW中设置启用安全启动 secure boot enable(SB_EN)位

在安全启动模式下,数字签名的启动映像会在启动期间进行验证。验证期间的失败要么使CPU进入自旋循环(具有ITS的系统),要么继续引导到非安全状态(具有SB_EN的环境)。

使用信任架构需要一些强制性最低配置可选配置

强制性最低配置和程序包括代码签名对安全熔断器处理器(SFP)中的某些字段进行编程

可选配置包括对一些增强功能的支持,例如篡改检测(tmp_detect)运行时完整性检查(RTIC)安全调试密钥撤销和安全数据存储(加密的二进制数据)

二、安全启动:最低要求

安全启动过程包括对现有软件必要的准备工作对安全启动过程使用的熔丝进行编程

在安全启动模式下,SoC的CPU是从一段包含内部安全启动代码 internal secure boot code(ISBC)的不可修改的内部启动ROM开始启动的。

ISBC的功能是去验证一段被称为外部安全启动代码 external secure boot code(ESBC)的可修改代码。

ESBC可以是一个与引导设备(U-Boot、设备树、内核、rootfs)相关的连续内存空间中的单个集成镜像,也可以是存在于软件镜像链的第一阶段中可以单独验证和调用的程序。第二阶段也称为信任链。使用信任链时,您可以为链中的每个镜像使用单个密钥对,或为不同的镜像使用不同的密钥对。

为简单起见,本文档使用单个密钥对对安全启动中涉及的所有镜像进行签名。

使用fw_printenv修改uboot环境变量

最近遇到一个问题,有客户想要使用fw_printenv命令,在文件系统下查看和修改uboot环境变量。

网上搜索了一下相关的内容,发现fw_printenv真是一个好东西。

首先是fw_printenv工具的编译:

fw_printenv工具的源码在uboot源码目录下的tools/env/目录下,可以使用以下命令直接编译得到

make env ARCH=xxx CROSS_COMPILE=yyy
#其中xxx和yyy根据自己的交叉编译环境来配置

编译完成之后,就在tools/env下生成fw_printenv的可执行文件,将其拷贝到文件系统中就可以。

其次是fw_env.config文件的配置:

fw_env.config文件在文件系统的/etc目录下,记载着mtd分区、uboot环境变量的位置、大小等内容。

在uboot源码的tools/env/fw_env.config中也有一个简单的示例,具体的修改方法见fw_env.config文件中的说明及/tools/env/README文件。

对于LS1046来说,fw_env.config文件中的内容如下:

# MTD device name       Device offset   Env. size       Flash sector size
/dev/mtd0               0x300000          0x2000          0x40000

其中Device offset,Env size和Flash sector size应该分别对应于uboot源码目录中include/configs/xxxx.h相关文件中的

CONFIG_ENV_OFFSET,CONFIG_ENV_SIZE和CONFIG_ENV_SECT_SIZE三个宏定义

以include/configs/ls1046ardb.h为例,我们可以看到

#define CONFIG_ENV_SIZE                 0x2000          /* 8KB */
#define CONFIG_ENV_OFFSET               0x300000        /* 3MB */
#define CONFIG_ENV_SECT_SIZE            0x40000         /* 256KB */
网站自动签到的操作

前几天在网上找Steam VR游戏的时候,无意间找到了一个网站七星猫,然后发现上面的游戏基本上就是三个游戏币一个(一块钱一个游戏币),三十个游戏币可以直接VIP会员,全网站免费下载了,价格还不错。我购买了一个H3CVR的汉化版,下载之后游玩还可以,这个资源我已经找了很久了,网上基本上找不到免费的汉化的版本,哪怕是付费的也是相当的难找。

大概浏览了一下这个网站,上面的资源还是比较丰富的,PC和VR游戏都有很多,以后想找游戏的时候可以先在这里看看了。

在这个网站的侧边栏,我发现有签到的功能,每次签到给0.1个游戏币,这样算算每个月就能免费领一个游戏呢,10个月之后都能免费VIP了,想想白嫖还真是让人很兴奋呢。

不过每天如果手动签到也是太麻烦了,我想起来之前在网上找的用python写的什么值得买和glados的自动签到,代码我也看过,没什么难的,那何不自己做一个七星猫的自动签到脚本呢?

首先先看一下glados的自动签到脚本吧

import json
import requests
from requests import post

payload = "{\"token\":\"glados_network\"}"
headers = {
  'authority': 'glados.rocks',
  'accept': 'application/json, text/plain, */*',
  'dnt': '1',
  'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.80 Safari/537.36',
  'content-type': 'application/json;charset=UTF-8',
  'origin': 'https://glados.rocks',
  'sec-fetch-site': 'same-origin',
  'sec-fetch-mode': 'cors',
  'sec-fetch-dest': 'empty',
  'referer': 'https://glados.rocks/console/checkin',
  'accept-language': 'zh-CN,zh;q=0.9',
  'cookie': Cookie
}

if __name__ == '__main__':
    checkinUrl = 'https://glados.rocks/api/user/checkin'
    resp = requests.post(checkinUrl, headers=headers, data = payload)
    message = 'GLaDOS梯子签到 : \n\n' + json.loads(resp.text).get('message')
    print(message)

很简单不是么?点击签到按钮之后,也仅仅是向某个签到的url发送了一个特定的headers和data的数据而已,注意这里的data数据是一个json字符串。

那就仿照着这个来写一下七星猫的自动签到脚本吧,找一下它的签到的url和发送的数据的headers和data。

可调整大小的串行控制台窗口

在使用串口登录Linux嵌入式板卡时,只需要设置好相应的比特率和串口号,然后再打开调试串口并登录,就像使用 telnet 或 ssh 一样方便。

但是我们发现有一种情况,当你一旦使用像是vim的编辑器的时候 ,无论其实际大小,它都假定你的终端窗口只有 24 行高。

image-20211103094604863

即使在退出编辑器后,不知何故窗口都将被改变,它的窗口都会冻结在24行,底下的串口部分留空,这种情况下当输入长命令的时候它就会出现错位,无法看到命令的全部内容,很是难受

image-20211103094337626

后来通过网上找资料,发现这个和stty设置的行和列的大小有关,我们可以通过stty size命令来查看当前窗口的行和列的大小

forlinx@ubuntu:~$ stty size
24 80

当然我们也可以手动设置将行和列的值改大一点

forlinx@ubuntu:~$ stty rows 58 cols 237
forlinx@ubuntu:~$ stty size
58 237

设置完成之后,我们再使用vim命令去编辑文件的时候就可以看到效果了。

这个最终的问题是,在使用串口登录系统的时候,屏幕没有像 ssh、rsh 或 telnet 等远程登录程序那样传递终端大小信息的协议。那么,如何在登录时自动去设置终端大小呢?

我在网上找到了两个方法:

第一个是一个bash的脚本,可以命令为resize,这个只在运行的时候起作用,可以调整窗口的大小

old=$(stty -g)
stty -echo
printf '\033[18t'
IFS=';' read -d t _ rows cols _
stty "$old"
stty cols "$cols" rows "$rows"

第二个是一个命令,这个可以在每次运行命令的时候都进行窗口的大小的调整,不过有一个小问题就是会影响命令执行的速度

trap 'resize > /dev/null' DEBUG

亲测这两个都可以使用,可以把这些语句加到.profile里面。

以下是参考链接:

https://qastack.cn/unix/16578/resizable-serial-console-window

https://shallowsky.com/blog/tags/embedded/

风蚀的城堡

我曾经住在一个城堡里,一直都认为自己很厉害,长这么大经历了很多艰难的事情并一路走了过来,我一直以为这都是自己的本事。

后来我才知道,并非是我的本领高强,而是城堡的坚固保护才让我免于经受挫折与风雨。

可惜我并没有修缮城堡的能力,只能目睹它在岁月中被流年的风尘逐渐侵蚀,但是我一直侥幸它足够坚固,坚固到能支撑到永远。

在这时光的流转中,我慢慢的不敢再回头看它,我知道每次回头看到的,都将是一个更为摇晃的世界,我以为闭上眼睛,时光就会停滞。

可是,我终于在某一天听到了倒下的声音,童话的城堡已经开始崩塌~~曾经保护我的超人也开始离去和老去,在这支离的城堡中,有好多熟悉的房间开始变成了我再也无法触及的回忆之地。

我没有办法再躲在里面,我也得快快成为一个能保护自己的大人,盖一栋新的更坚固的小房子。

当城堡倒塌的时候,我一直想尽办法让自己迷失在当下的时间里,一直拼命向前看想忘记过去的记忆。想沉溺于一切都是梦的幻想里,告诉自己一切仍旧,一切都没有发生,一切仍如那个熟悉的过去。

终于有一天,当我有勇气后头看,那城堡的一角散落在地的残垣,曾经的记忆在脑海中浮现,那么多欢乐与幸福,终究还是要与自己永远的告别。

唯有岁月,是无法挽留的是么?也总有人逐渐消失于世界,带着那些难忘的记忆,一并融化在模糊的雾气里。

未来的礼物

你总是期望什么事情来带来改变,而那个事情却迟迟未来,说好了顺其自然,但是又是什么原因让自己焦躁不安?

就像是炸弹上的倒计时的滴滴声,无时无刻不萦绕耳边挥之不去,让人坐立不安。

是谁在催促自己,还是自己给自己定下的时间界限?为什么要这么着急呢?或者,为什么这个事情就一定是必须要完成的呢?

如果假设一个最坏的结果并且接受它不好么?这样生活就再也没有那个事情的困扰,那所有的事情也不会变得更坏,生活就可以在好好计划中再被重新安排。

想逃离,却逃离不去,想挣脱,却被紧紧包裹,仿佛那个事情就是全部的意义,而我现在要做的是将那个意义从我生命中剥离,为什么,变成了这个样子呢?

我最终还是活在了别人的期望里,想要完美的样子,却把自己搞得一团乱麻。既然一切都有最好的安排,那也许是上天依然觉得我还没有准备好么?还无法迎接那个事情的到来,也没有能力来引导另一个灵魂来享受这个世界的旅程,也许是这样的吧。

在无法处理自己的情绪之前,在无法管理自己的期望之前,在无法解决要在现实中的争取和妥协之前,在无法好好的在无序的混乱中快速清醒之前,上天明白到底什么时候你才能接得住这个沉甸甸的礼物,与其早早的交付到自己手中并毁掉它,还不如等待更长的时间留给经历过挣扎之后不再迷失的自己。毕竟是那么沉重,那么沉重的恩赐,如何也要更小心一点才对呢。

你期望那个事情来给你带来成长和生活中的改变,却不知也许它也在焦急的等待着一个更成熟更可靠和更稳重的自己能让它安心的到来,是时间未到对么?或许是自己才应该是好好的努力不让它等待的太久失望的离开。

不要再像一个小孩子一样幼稚,也不要再轻浮的口无遮拦,做一个更成熟和自律的自己才对么?想要进入大人的世界,像一个孩子还怎么能行呢?也许只有当自己真正的能够享受生活的时候,能够好好的管理自己的时候,才是真正它真正想要到来的时候。

IC卡扇区解读

介绍

每张IC卡都有16个扇区,包括1个公共区和15个数据区。每个扇区有4个块,每个块占16字节。

第0扇区的块0为厂商代码,已经固化。包括芯片序列号UID,ATQA和SAK

每个扇区的块3为控制块,用来存放密码和控制权限 ,不能用来存储数据。

每个扇区的块0,块1,块2可以用来存储数据(扇区0的块0除外)。

块3的前6个字节为KeyA,后6个字节为KeyB。中间的4个字节为存储控制。

每个扇区可以通过它包含的密钥A或者密钥B单独加密

扇区图

在这里插入图片描述

IC卡加解密

非加密卡和加密卡的区别就是,非加密卡中所有扇区的KEYA和KEYB数值都是默认值FFFFFFFFFFFF;而加密卡中,其中有扇区的KEYA和KEYB不等于FFFFFFFFFFFF,部分扇区加密的卡称半加密卡,所有扇区都加密的卡称全加密卡
在这里插入图片描述

ubuntu更新错误

ubuntu更新报错如下:

root@localhost:~# apt-get update
Err:1 http://us.ports.ubuntu.com/ubuntu-ports bionic InRelease
  Temporary failure resolving 'us.ports.ubuntu.com'
Err:2 http://ports.ubuntu.com/ubuntu-ports bionic-security InRelease
  Temporary failure resolving 'ports.ubuntu.com'
Err:3 http://ppa.launchpad.net/ondrej/php/ubuntu bionic InRelease
  Temporary failure resolving 'ppa.launchpad.net'
Err:4 http://us.ports.ubuntu.com/ubuntu-ports bionic-updates InRelease
  Temporary failure resolving 'us.ports.ubuntu.com'
Reading package lists... Done
W: Failed to fetch http://us.ports.ubuntu.com/ubuntu-ports/dists/bionic/InRelease  Temporary failure resolving 'us.ports.ubuntu.com'
W: Failed to fetch http://us.ports.ubuntu.com/ubuntu-ports/dists/bionic-updates/InRelease  Temporary failure resolving 'us.ports.ubuntu.com'
W: Failed to fetch http://ports.ubuntu.com/ubuntu-ports/dists/bionic-security/InRelease  Temporary failure resolving 'ports.ubuntu.com'
W: Failed to fetch http://ppa.launchpad.net/ondrej/php/ubuntu/dists/bionic/InRelease  Temporary failure resolving 'ppa.launchpad.net'
W: Some index files failed to download. They have been ignored, or old ones used instead.

原因是dns没有配置,解决办法 加入dns服务器地址:

vi /etc/resolv.conf

添加

nameserver 202.96.134.133
nameserver 8.8.8.8

如果提示只读,用sudo运行,即:

sudo vi /etc/resolv.conf

运行完重启系统解决

偶感

雪莲的纯洁在于它选择绽放在了荒无人际的冰域,以自己独一的冷漠与清高向人们诠释了何谓真正的纯洁。其实,我终于明白,所谓的纯洁其实是需要极大的勇气,甘心并且坚持拒绝繁华,拒绝任何可能玷污心灵的向往。

任何繁华的指向都是虚无,因为世界上没有什么可以永远鲜艳的存在,极致背后总会是失落的痛苦。所以告诉自己,要淡化所有的追逐。可以有生活的梦想,但不要让自我成为梦想的附属。我只求每天都是自己,每天都能感受到自我的存在,心的跳动与永不枯竭的泪湖。

我时时告诉自己,要懂得区分幻想与现实。我知道,没有什么可以永远存在于自己的世界里,自己所遇到的,所了解的,所熟知的,终究会成为陌生的东西。所有的色彩都经不起时间的冲刷,所有的一切都会成为记忆的琥珀,尘封在已过往的岁月流年里。

现实中我更喜欢用幻想编制虚无的美丽,看那绽放在记忆中绚丽的七彩。然而,我会知道。无论自己有多么喜欢,那依旧是幻影,终会随时间减淡。无论是什么,我会喜欢,但绝不会迷恋。我会很清醒的知道,不会妄想将幻想带进现实的世界里。而我,也必须要为现实做出某种努力,比如说:学习。

我想,现在的自己已经达到了理想中的状态。所以,自己应该感觉到平和与幸福。

自己已经很好了,卓绝的认知与无悔的坚守。这些都让自己很好的成长。所以我不想再改变什么,也不想再接触其他的神秘。我只求永远保持这种感觉到生命的尽头。

任何时候都不要妄想用满足了结自己的向往。一个人的向往与追逐是一个填不满的无底洞。其实,我们都不知道自己想要的最终是什么,仅仅是靠一个名为梦想的东西指引着不断前行。我们的目的到底在哪里?难道人生注定只是一个漫游?有时候,真的真的不要轻易满足自己,不断满足背后是更为辛苦煎熬的追逐。人性对繁华的贪恋,真的好可怕,有时候,连自己的意志都克制不了……

自己拒绝自己想要的,这是一种多么残酷的本领,因为世人都习惯放纵,很少有人愿意与自己斗争,编造种种可悲的理由来为自己的堕落寻找借口,以侥幸的想法来为自己开脱责任。

人的价值,在遭遇诱惑的一瞬间被决定。