关于arm64:arm架构安装dockercompose

先装置好Docker华为云arm架构装置Docker arm架构下装置docker-compose官网地址: https://github.com/docker/com...官网没有提供arm架构的包 本人去找arm架构的docker-compose包,或评论留言给我,发给大家我这里用的是1.23.0-rc3版本: docker-compose-Linux-aarch64 #拷贝到/usr/local/bin/目录cp docker-compose-Linux-aarch64 /usr/local/bin/docker-compose#可执行权限chmod +x /usr/local/bin/docker-compose#查看版本docker-compose version#显示如下docker-compose version 1.23.0-rc3, build 7bd4291fdocker-py version: 3.5.0CPython version: 3.6.7OpenSSL version: OpenSSL 1.1.0f 25 May 2017

September 4, 2022 · 1 min · jiezi

关于arm64:华为云arm架构docker启动redis报错<jemalloc>-Unsupported-system-page-size

Harbor官网没有提供arm架构的包,须要本人编译,我编译好harbor-1.9.1之后,启动. 依赖的Redis启动失败,始终在重启,解决办法:本人在arm架构机器上构建redis镜像 先装置Docker华为云arm架构装置Docker 查看redis启动状况docker ps#始终在重启 Restartinggoharbor/redis-photon:v1.9.1 "redis-server /etc/r…" 6 minutes ago Restarting (139) 19 seconds ago goharbor/redis-photon:v1.9.1 查看日志报错如下:<jemalloc>: Unsupported system page size本人在arm架构上构建redis镜像留神: 须要在arm架构的机器下来构建如果本人构建失败,或不想构建,能够留言找我要镜像包 #下载源代码git clone https://github.com/docker-library/redis.gitcd redis/5/#构建出新的镜像docker build -t arm64v8/cetos_redis:5.0.9 . #改成harbor的镜像docker tag arm64v8/cetos_redis:5.0.9 goharbor/redis-photon:v1.9.1 #而后在启动胜利参考博客:http://www.python88.com/topic...https://bbs.huaweicloud.com/f...

August 28, 2022 · 1 min · jiezi

关于arm64:arm架构安装Rancher并导入k8s集群解决Error-no-objects-passed-to-apply

Rancher介绍Rancher 2.0-2.4版本 是一个开源的企业级容器治理平台。通过Rancher,企业再也不用本人应用一系列的开源软件去从头搭建容器服务平台。Rancher提供了在生产环境中应用的治理Docker和Kubernetes的全栈化容器部署与治理平台。 Rancher 2.5版本 是为应用容器的公司打造的容器治理平台。Rancher 简化了应用 Kubernetes 的流程,开发者能够随处运行 Kubernetes(Run Kubernetes Everywhere),满足 IT 需要标准,赋能 DevOps 团队。 Rancher长处 基础设施编排容器编排与调度利用商店企业级权限治理我应用Rancher次要目标: 它的k8s集群治理,监控状态治理,和界面操作都比Dashboard插件弱小arm架构装置Rancher#查看Linux内核版本uname -r 4.18.0-80.7.2.el7.aarch64#或者应用 uname -a#rancher的官网镜像默认是: rancher/rancher:latest 是x86架构的#arm64架构应用: rancher/rancher:v2.5.8-linux-arm64docker pull rancher/rancher:v2.5.8-linux-arm64docker pull rancher/rancher:v2.5.5-linux-arm64#在k8s的Master上执行,启动Rancher#如果您应用的 Rancher 2.5.x 及更新版本,须要开启特权模式装置 Rancher,请执行以下命令:docker run -d --privileged --restart=unless-stopped \ -p 80:80 -p 443:443 \ --privileged \ rancher/rancher:v2.5.8-linux-arm64导入k8s集群稍等一会,等启动胜利后浏览器拜访:https://192.168.0.5/ 设置admin的明码,如: admin右下方抉择语言: 简体中文 增加集群---应用现有的 Kubernetes 集群--导入输出集群名称:k8s-beyond 执行导入命令,报错: 证书有效kubectl apply -f https://192.168.0.5/v3/import... 抉择最初一个导入命令,绕过证书查看curl --insecure -sfL https://192.168.0.5/v3/import... | kubectl apply -f - 报错: Error: no objects passed to apply 在执行一次命令就好了 ...

August 20, 2022 · 1 min · jiezi

关于arm64:arm架构安装RabbitMQ并升级erlang解决Requires-erlang->-232

arm架构装置RabbitMQ#查看Linux内核版本uname -r 4.18.0-80.7.2.el7.aarch64#或者应用 uname -a#查看erlang版本,输出erlerl#显示如下:Erlang/OTP 24版本,我这里是降级后的版本了,原本版本比拟低Erlang/OTP 24 [erts-12.0] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:1]Eshell V12.0 (abort with ^G)1> #yum间接装置RabbitMQ,如果erlang版本比拟低,装置的RabbitMQ的版本也会比拟低yum install -y rabbitmq-server#如果装置高版本的RabbitMQ报错Error: Package: rabbitmq-server-3.8.16-1.el7.noarch (rabbitmq_rabbitmq-server) Requires: erlang >= 23.2 Available: erlang-R16B-03.18.el7.aarch64 (epel) erlang = R16B-03.18.el7 You could try using --skip-broken to work around the problem You could try running: rpm -Va --nofiles --nodigest#提醒erlang的版本太低,必须大于erlang >= 23.2卸载erlang并降级erlangErlang官网装置地址: https://www.erlang-solutions.... rpm包装置#卸载erlangyum -y remove erlang-*#官网下载rpm包 #抉择对应的零碎,如: Centos#抉择零碎对应的版本,如:CentOS7 (arm64位) 下载: esl-erlang_24.0.1-1_centos_7_arm64.rpm#Rpm包装置sudo rpm -ivh esl-erlang_24.0.1-1_centos_7_arm64.rpmyum装置erlang#卸载erlangyum -y remove erlang-*#按官网的提醒操作#应用存储库装置wget https://packages.erlang-solutions.com/erlang-solutions-2.0-1.noarch.rpmrpm -Uvh erlang-solutions-2.0-1.noarch.rpm#旧的存储库wget https://packages.erlang-solutions.com/erlang-solutions-1.0-1.noarch.rpmrpm -Uvh erlang-solutions-1.0-1.noarch.rpm#手动增加存储库条目rpm --import https://packages.erlang-solutions.com/rpm/erlang_solutions.asc#增加到“/etc/yum.repos.d/”目录文件中vim erlang_solutions.repo[erlang-solutions]name=CentOS $releasever - $basearch - Erlang Solutionsbaseurl=https://packages.erlang-solutions.com/rpm/centos/$releasever/$basearchgpgcheck=1gpgkey=https://packages.erlang-solutions.com/rpm/erlang_solutions.ascenabled=1#查看erlang可装置版本yum list |grep erlangyum list erlang --showduplicates | sort -r#装置erlang,也可装置指定版本yum install -y erlang#装置erlang指定版本yum install erlang-24.0-1.el7.aarch64RabbitMQ官网装置应用PackageCloud装置RabbitMQ是最简略的装置形式,依照官网文档来就能够了。官网地址:https://www.rabbitmq.com/inst... ...

August 20, 2022 · 2 min · jiezi

关于arm64:解决华为云鲲鹏arm架构运行IoTDB经常自动挂掉

InfluxDB和IotDB介绍与性能比照 Linux MacBook Docker装置IoTDB及应用 解决华为云鲲鹏服务器arm架构运行IoTDB常常主动挂掉起因: 华为云鲲鹏服务器arm架构运行IoTDB短少一些lib库 IoTDB有些底层依赖包,机器上的版本太低了,cp一个高版本的就行了 留神: arm架构应用arm64的包,不要用amd64包 #查找依赖包sudo find / -name "libstdc++.so.6*"#复制依赖包sudo cp somewhere/libstdc++.so.6.0.25 /usr/lib64/如果libstdc++.so.6.0.25包不存在 ----centos7.6没有, 系统升级成centos8就有了 解决libstdc++.so.6: version `GLIBCXX_3.4.21' not found解决办法参考:https://www.cnblogs.com/sddai... 下载对应版本:https://ubuntu.pkgs.org/18.04... #下载下来之后,用如下命令开始解压ar -x libstdc++6_7-20170302-1_i386.debtar xvf data.tar.xz ls usr/lib/aarch64-linux-gnu/#将下面的最新动静库(lib/i386-linux-gnu)libstdc++.so.6.0.23复制到/usr/lib64目录下,cp libstdc++.so.6.0.23 /usr/lib64cp usr/lib/aarch64-linux-gnu/libstdc++.so.6.0.21 /usr/lib64#切换工作目录至/usr/lib64:cd /usr/lib64#删除原来软连贯:rm -rf libstdc++.so.6#将默认库的软连贯指向最新动静库:ln -s libstdc++.so.6.0.23 libstdc++.so.6#认动静库降级实现。从新运行以下命令查看动静库:strings /usr/lib64/libstdc++.so.6 | grep GLIBC华为云鲲鹏服务器arm架构装置openjdk, 应用oracle的jdk会报错参考:https://www.huaweicloud.com/k... yum install java-1.8.0-openjdk

August 18, 2022 · 1 min · jiezi

关于arm64:第一季视频更新代码分析7之ARM64启动汇编和内存初始化

咱们在上一期节目中和大家介绍了ARM64内存治理方面的硬件常识,那么这一期节目接着介绍ARM64内存治理相干的内容:ARM64启动汇编和页表初始化等内容。咱们在代码剖析第一期节目时候介绍过ARM32的启动汇编,有不少小伙伴心愿笨叔讲ARM64的启动汇编,因为当初基本上很多公司都用ARM64了,原来用ARM32的都大部分切换到ARM64了。另一方面,ARM64曾经成了支流,比方华为鲲鹏用ARM64做服务器,其余手机芯片公司比方MTK,展讯等早曾经应用了ARM64了,当初传说OPPO也筹备自研手机芯片,很多嵌入式零碎也都迁徙到ARM64了,所以,群里很多小伙伴,要求笨叔在讲一遍ARM64的启动汇编代码,笨叔也是盛情难却,不好意思回绝大家的申请,基本上有求必应。笨叔在强调一下,笨叔录视频,一方面为了记录下来,另一方面也是兴趣爱好使然,咱们录的代码剖析视频是不在另外免费的。对的,您没听错,笨叔录制的Linux 5.0的手把手代码剖析视频,是不另外再免费的,只有订阅了旗舰篇视频课程,就能够收费收看Linux 5.0手把手剖析视频课程。 咱们这期节目,有两个重点,一是介绍ARM64汇编,另外一个是考查 在汇编初始化阶段,内存是如何映射的。 录制视频是一种兴趣爱好笨叔录制视频是一种兴趣爱好。咱们的奔跑吧的视频,和别家视频不一样,咱们只收了很少的钱,然而呢,咱们录制了很多视频,咱们当初第一季曾经录制好的视频就超过40小时。前面还会收费给大家来录制基于Linux 5.0内核的内存治理代码剖析视频。对的,您没有听错,前面录的Linux 5.0源代码剖析视频是不再免费的。这是寰球第一家也是惟一一家Linux 5.0源代码手把手剖析的视频。可能有的读者会问了,笨叔,你们录这么多视频,免费这么低,这是为啥。其实很简略,咱们不靠卖视频生存,咱们都有正当的工作,可能很多小伙伴都晓得了,笨叔在上海一家小公司当小fae,另外笨叔业余时间也在钻研股票,钻研巴菲特,所以,咱们不靠卖视频赚钱。咱们录视频纯正是为了兴趣爱好。有的小伙伴说了,居然录视频不是为了赚钱,那为什么不收费?咱们晓得,一旦收费,就很少有敌人真的认真去看视频了,而且岂但很少人看,还有一些喷子来喷,所以,有喷子来喷的话,咱们也要设置门槛,欢送来喷,然而你先付999。所以,咱们设置肯定门槛,给真正有须要的敌人来观看。如果你感觉笨叔录的视频对你工作有帮忙,你也不在乎那点小钱,对吧。咱们也真挚呐喊一下,正在看这个视频的小伙伴,能够帮忙举荐一下。 代码剖析7 - ARM64启动汇编和内存初始化依照常规,咱们先上这一期节目中面试常见的必考题。 什么是一个段的加载地址和运行地址?读懂Linux内核的链接脚本文件。从Uboot跳转到内核时,为什么指令高速缓存能够关上而数据高速缓存必须敞开?在Linux内核启动汇编代码中,为什么要建设恒等映射的?在ARM64 Linux内核启动过程中,除了建设恒等映射,那为什么还要把内6. 核映射映射到内核空间里?为什么在ARM64 Linux内核启动汇编中创立2个页表,即idmap_pg_dir和init_pg_dir,只创立一个页表行不行?点解?笨叔在这一期视频中,是手把手把ARM64的启动汇编代码都给您解说了一遍,这样的视频,只有笨叔这里有哟! 有趣味的小伙伴能够订阅奔跑吧旗舰篇视频节目,点击“浏览原文”订阅哟! 蓝色奔跑吧第二版曾经交稿笨叔历时1年新订正的蓝色奔跑吧曾经交稿,第二版会新增很多新内容,而且大部分内容是从新重构的,第二版齐全基于Linux5.0 + ARM64/x86_64来编写的。书稿在3月初曾经交稿,请大家急躁期待。想看Linux 5.0的代码解说,能够订阅旗舰篇视频课程,笨叔会在视频里具体和大家剖析5.0代码的实现。 第二版具体目录请登录“奔跑吧linux社区”微信公众号,输出“奔跑吧第二版”索取。 全新的一套奔跑卷题目,有趣味同学能够登录“奔跑吧linux社区”微信公众号,输出“奔跑卷”索取。 本书预计2020年隆冬出版,到时候笨叔约大家吃西瓜,看奔跑吧!

April 2, 2022 · 1 min · jiezi

关于arm64:特工队-动态修改计算机系统调用

咱们最近录制一期特工队节目,寰球独家的视频节目,全程2.5小时,这个视频节目是围绕这样一个试验来进行的。咱们在这期视频节目中重点介绍: ARM64体系结构中的内存治理 ARM64的页表治理 ARM64 的Linux内核如何walk through页表 ARM64的Linux内核零碎调用是如何实现的? 如何面对宕机?本试验讲会面临4次不同的宕机。 详细分析宕机的log 利用kdump来手撕宕机问题 笨叔保障,在寰球的视频网站和培训机构上也找不到这样有深度和广度的视频,只有笨叔的旗舰篇视频有哟!喜爱的连忙点本文最初面的“浏览原文”来订阅吧。 这个试验是酱杨紫的: “假如你是一名平安人员,正在执行一项机密工作,这项机密工作就是要深刻到敌军的作战指挥核心的计算机里装置一个窃听的程序,简略来说就是把计算机的零碎调用动静替换掉。假如你的共事曾经帮你把敌军计算机的root明码给破解了,接下来就看你如何动静批改零碎调用了。留神:编写的内核模块不能让敌军的计算机重启、crash/panic,否则就裸露行踪,秘密行动失败。 1)编写一个内核模块。 试验环境:ARM64体系结构,Linux 5.0内核。 要求替换零碎调用表(sys_call_table)中某一项零碎调用,替换成本人编写的零碎调用处理函数(例如:my_new_syscall()),在新的零碎调用函数中打印一句“hello, I have hacked this syscall”,而后再调用回原来的零碎调用处理函数。 比方以ioctl零碎调用为例,它在零碎调用表中的编号就是__NR_ioctl。那么须要批改零碎调用表sys_call_table[__NR_ioctl]的指向,让其指向my_new_syscall()函数,而后在my_new_syscall()函数中打印一句话,调用原来的sys_call_table[__NR_ioctl]指向的处理函数。 2)卸载模块时候把零碎调用表复原原样。 3)用clone零碎调用来验证你的驱动,clone零碎调用号是__NR_clone。 ” 这个试验来自一个理论的我的项目,最开始是笨叔的VIP微信群里一个敌人在国庆节期间问笨叔的一个问题。他们说这个问题困扰了他们良久,他们的试验平台是某鹏的ARM64服务器芯片,怎么折腾总是死机,于是救助与笨叔。笨叔看了看他们的代码,喝了一杯二锅头的工夫就把这个问题fix了。起初,笨叔感觉这个问题对学习linux驱动和内核的小伙伴很有帮忙,特地是对加深了解ARM64的体系结构,ARM64内存治理、零碎调用、如何面对死机等问题,于是,笨叔在那个VIP敌人的问题根底上做了批改和形象,做成一个试验share给大家。 笨叔让小笨笨同学来做这个试验。 风华正茂的小笨笨同学 笨叔先给小笨笨介绍一些ARM64体系结构的常识。 小笨笨开始入手写内核模块了,花了一个下午,写好了一个驱动模块。 然而呢,这个驱动一跑起来就死机,而且整个过程会有4次不同的宕机。 第一次宕机,小笨笨同学就懵了。。。 在笨叔的指导下,fix了第一次宕机。 从新编译好内核模块之后,一跑,又马上第二次宕机了。 小笨笨同学这可傻眼了,在笨叔给他解说了零碎调用的一些基本原理之后,马上fix了第二次宕机。这回小笨笨同学把ioctl零碎调用号改成clone号,从新编译好内核模块之后,一跑,又马上第三次宕机了。 小笨笨同学这回哭了,叔叔,我不玩了~~~~ 我把小笨笨同学哄着:小笨笨,不怕,咱们来仔细分析死机log,你看看,你只把第一个page的只读属性改成了可写,然而呢,因为clone零碎调用号是220,每个零碎调用号在零碎调用表sys_call_table中占8个字节,然而呢,这个表没有依照page大小对齐来寄存的,所以呢,这个clone可能寄存到了第2个page里,你发现了吗?小笨笨同学。 小笨笨同学看了看笨叔,叔,如同是这么回事。叔,你真帅! 小笨笨很快就批改好了代码,上机一跑,如同不宕机了。 笨叔:小笨笨,你这个驱动写的好不错,然而呢,咱们须要在卸载模块的时候,把零碎调用表复原原样。 小笨笨马上去批改卸载模块函数,上机一跑,又宕机了~~,这回小笨笨真的哭了:叔,真的好难啊,为啥我一批改,就死机。 小伙伴,你有趣味和小笨笨一起来玩这个试验吗? 笨叔录制了2个多小时的高清视频来具体解说这个试验,有趣味的同学能够点击“浏览原文”来订阅笨叔的旗舰篇合集视频。 另外咱们精心制作了400多页的试验领导手册,独家供给,收费提供大家下载。 下载方法: 登录“奔跑吧linux社区”微信公众号,在微信公众号里输出“试验领导手册”即可。

April 2, 2022 · 1 min · jiezi

关于arm64:笨叔点滴16那些狗日的面试必考题中断管理篇

“ 刚刚接了个电话:“你好,方便面是吗?” 我愣了一下,认为是恶作剧,而后就回了句 “哦,我不是,我是火腿肠!” 而后就把电话挂了!躺下来好一会儿我才推敲过去,她如同说的是: “你好,不便,面试吗?”” 作为程序猿,除了加班、生老病死,还有一个事件是逃不掉的?那就是面试了,除非你爹是王xx,或者马xx。大家有时候感觉面试很恶心,然而为了一口饭,又不得不去面试,面试就是这么一件很神奇的事件。 然而如果咱们换一个角度去思考,面试其实是一个高手对招和见招拆招的中央,面试者和面试官其实就是互相比拼,面试官 总想问一些问题要难倒面试者,面试者尽可能去满足面试官的需要,某种意义上就是取悦面试官。有时候大家互相鄙视一把,有一次小明同学去一家出名IT公司面试,问了小明啥是时钟中断,小明说,就是手表不跑了,问啥是缺页中断,小明说,咋手表坏了,还缺液?液压能源手表?要加几号油?面试官感觉小明同学太差,小明同学感觉面试官太low。面试完了大家敌对握握手,转身来到时候心里互相说了一句“USB”。有时候技术面试聊的很high,却始终等不到offer,只因人群中你和他眼神不对。这里不是说不尊重面试官,咱们始终认为面试是一件神圣的事件,只是咱们在漫长的职业生涯中或多或少会经验一些乏味奇葩的面试经验。大家能够在评论区留言,说出你面试的趣闻或者奇葩乏味的事件。 不论如何,咱们作为一个虔诚的求职者来说,还是须要把职位相干的知识点好好温习一下,最好把一些问题能在脑海里想通透,这样面试的时候就能超水平施展,争取拿到现实的offer。 那对于Linux相干的职位,比方Linux驱动开发,内核开发,嵌入式开发,anroid零碎开发等等开发和测试的职位,当初招聘的岗位还是很多的,而且薪水也是很给力的。毕竟当初是人工智能、物联网、可穿戴设施以及云计算云服务等都是热门行业,这些产品要落地都少不了和Linux相干的职位。那中断治理是Linux零碎中一个不可或缺的模块,面试的时候是肯定会被问到。 笨叔总结了中断治理相干的20个必考的面试题目,这些题目来自当年被虐过的题目以及理论工程项目中遇到的问题。因而,咱们这期节目的主题就是: 那些狗日的面试题目(中断治理篇) 更多精彩题目请见第二季旗舰篇视频节目。 咱们心愿大家通过面试题目这样形式来把中断治理这些知识点能买通打透,真正做到买通“任督六脉”,笑对面试,笑对人生。 如果大家想听听笨叔是如何解读这20道中断面试题目标,记得订阅第二季《奔跑吧Linux内核》配套视频节目 - 过程、中断以及锁机制三合一哟! 旗舰篇三大特色: 额定减少外围代码的导读,真正做到自主可控。 综合翻新试验,笨叔率领大家在树莓派上玩一个小OS。 面试宝典: 那些年咱们被虐过的面试题目。

April 2, 2022 · 1 min · jiezi

关于arm64:笨叔点滴15ARMv8里异常处理哪些蛇神牛鬼-2

“ 一个行者问老和尚:“您得道前,做什么?”老和尚:“砍柴担水做饭。”行者问:“那得道后呢?”老和尚:“砍柴担水做饭。”行者又问:“那何谓得道?”老和尚:“得道前,砍柴时惦记着挑水,挑水时惦记着做饭;得道后,砍柴即砍柴,担水即担水,做饭即做饭。” ” 很多时候平庸的日子不平庸。 上一次咱们讲到ARM v8的异样向量表(上一期节目点击这里)。咱们以data abort这个异样为例子。假如data abort产生在EL1这个异样级别里。它会从异样向量表里跳转到el1_sync这个汇编函数里。 第270行的kernel_entry是一个汇编的宏,用来保留产生异样现场,把相干CPU寄存器保留到EL1的栈里,这里和ARM32的代码相似,会有一个栈框,这栈框的大小是S_FRAME_SIZE,该栈框大小是一个软件定义的,而非硬件定义,也就是说你能够实现一个和Linux实现不一样的栈框。 接下来读取esr_el1j寄存器的值。ESR_EL1寄存器全称exception syndrome register,能够参考ARM v8手册第D10.2.36章内容。这个寄存器有点相似ARM v7中的DFSR寄存器。这个寄存器的具体定义在D10.2.39章。 在这个寄存器里,EC域保留了异样的类型(exception class)。对于current EL的data abort,能够看手册的定义,当EC== 100101的时候就是示意以后EL产生了data abort异样。 这个值和代码里273行的ESR_ELx_EC_DABT_CUR的定义是吻合的,它定义在arch/arm64/include/asm/esr.h文件中。 所以依据274行代码会跳转到el1_da汇编函数里。这个函数也是在entry.S文件里。 首先去读取far_el1寄存器。这个寄存器是在第D10.2.40章里。这寄存器保留了导致异样产生的虚拟地址,那咱们操作系统就能够读取这个寄存器来持续后续的异样解决,它很相似ARM V7中的DFAR寄存器。 第二步是开启中断。 第三步跳转到do_mem_abort函数里。 这个函数有三个参数,其中第一个和第二参数须要留神,第一个参数是异样产生时候那个谬误的虚拟地址,即读取的FAR_EL1寄存器,第二参数是ESR_EL1寄存器。不过第二个参数有不少花头。 ESR_EL1寄存器的bit 26~31比特位是Exception class,bit 0 ~24是ISS域,它会依据 exception class的不同 而有不同的解读,也就是说,Exception class不同,ISS域的编码是 不一样的。对应Data abort这个类型来说,ISS的编码是在ARM v8手册的2460页里。见上面这个图。 其中bit 0~5是批示具体产生了那种类型的data abort。咱们以level 3的页表转换谬误为例(translation fault level 3),咱们看到在DFSC域里,它是000111,也就是7号。 咱们看一下Linux内核代码,在arch/arm64/mm/fault.c文件中有一个fault_info[ ]的数组,咱们看看7号是对应是神马? 咱们惊奇发现fault_info[ ]数组里7号就是level 3的translation fault,对应的处理函数是do_page_fault函数,见第386行代码。大家能够从0开始来数这个数组。 咱们通过两期的笨叔点滴来go through了一遍ARM V8上产生异样的台前幕后,心愿对大家有所帮忙。更多精彩内容敬请关注笨叔的第二季《奔跑吧Linux内核》配套视频。 第二季来啦 大家期待的第二季视频来了,咱们这次是过程治理、锁机制以及中断治理三合一,加量不加价。旗舰篇还是原价1199,当初特价999。 高级篇: 笨叔和大家彻底理清过程治理、锁机制以及中断治理相干的概念。比如说: ...

April 2, 2022 · 1 min · jiezi

关于arm64:笨叔点滴14-ARMv8里异常处理哪些蛇神牛鬼

“ 小明同学在一次计算机的实验课里,怎么也出不来试验后果。 小明:老师,老师,这个怎么老是404啊? 老师:你把这个配置文件的某某项填空就行 小明乐不可支的批改配置文件。 过了一会,小明又嘟囔不行。 老师:你把配置文件发给我。 。。。 老师:小明同学,滚。。。,我让你填空就行,就怎么给我填了一个“空”字 ” 昨天的笨叔点滴里和大家go through一下ARM v7手册和Linux内核代码里异样解决局部的哪些事儿。有小伙伴微信上和笨叔叔说,今晚能不能介绍一下ARMv8上的异样解决,我说好啊,这要看我家小笨笨明天早晨乖不乖了,乖的话,笨叔的空余工夫就多一些。 话说ARM v8是和一个ARM v7齐全不兼容的架构,然而又偏偏把 ARM v7融入了ARM v8里,说不出什么感觉,至多还没有让笨叔感觉到拍案称绝,但至多64位和32位能够比拟完满的交融,兴许是为了往后兼容吧,毕竟软件生态最重要。另外一点,ARMv8架构做的越来越成熟了,齐全有大家闺秀的风范,齐全有能力和其余的架构比一比,这一点从ARM v8的汇编代码能够窥探进去,简洁老练! ARMv8的最新手册是V8.3版本,全程有6666页,大家一看6666预计都吓坏了,其实大家不必放心,且来听笨叔给你剖析剖析: 这6666页里有很多内容和ARMv7是反复的,第F和G章是讲ARM v7。另外,ARM的芯片手册是把所有的运行模式都揉在一块来形容,比方我做的零碎不必虚拟化,不必secure monitor,那剩下的有用内容就不是很多了。若再把ARM v7和介绍指令集的章节去掉,那这6666页就没有这么恐怖了,对吧? 01 咱们来打开ARM v8手册第D.1章,第一页就通知你ARM v8有哪些EL,EL是exception level的意思,翻译成中文兴许叫异样等级,咱们下文还是简称EL等级吧,和芯片手册和代码同步。ARM芯片手册通常应用ELn来示意第n个异样等级。 这里有4个EL,其中EL0是用户态,EL1是内核态也就是特权模式,EL2是虚拟化的hypevisor模式,EL3是平安monitor。是不是和x86的ring0~ring3很像呢?这是向x86前辈致敬吗?哈哈~~ 在第D1.2.5章里,介绍了异样次要是分成2大类。一类是同步,另外一类是异步。 这里次要是说,同步异样是: 导致异样产生的起因是执行了某个指令 异样返回地址就指明了是因为执行了那个“陷阱”指令导致的 这个异样产生是准确的。 那啥是异步异样呢: 这个异样的产生不是因为执行了某个指令而中的陷阱 异样返回地址没法指明是中了哪条指令的陷阱 这个异样产生是不准确的 如果笨叔再用本人的话来翻译一下就是,所谓的同步异样就是说中了指令的陷阱,这样的,这些异样的产生是比拟精准的。而异步异样是和运行的指令没有关系,因为它是被中圈套。如果用打猎来说的话,你在地里挖个陷阱来打猎,这是同步异样,任何猎物只有跑到这里就中圈套。如果你追着这猎物射箭,对于猎物来说,它什么时候被杀中,它是不晓得的,它又不能说 NG重来:笨叔,咱们重来,我在后面跑,你从新射我。 所以,咱们在ARMv7里说的那些异样,比方data abort等,就很吻合这里说的同步异样,而IRQ和FIQ中断就很吻合异步异样,ARMv8里还有System Error也是属于异步异样。 在D1.10章里蕴含了很多和异样相干的内容。比方当一个异样产生了之后,ARM处理器做了那些事件? 下面这一大段都是形容异样产生了,ARM处理器做了那些事件。这好比之前那个打猎的例子,不论是刻舟求剑式的还是射箭式的,中了都要去解决现场吧,万一你的猎物被第三者偷走了,咋办? 下面的步骤,笨叔简略总结一下: 处理器的状态保留到对应(target)的异样等级的SPSR_ELx寄存器里 返回地址保留到对应的异样等级的ELR_ELx寄存器里 PSTATE寄存器里的DAIF域都设置为1。PSTATE寄存器是ARM v8里新增的寄存器。 如果是同步异样,那么到底什么起因导致的呢?请君看ESR_ELx寄存器。 设置一下栈指针,指向对应异样等级里的栈。 迁徙到对应的异样等级,而后跑到异样向量表里。 总的来说,这个过程和ARM v7的差不了太多。 接下来,咱们看一下异样向量表,到底和ARM v7的有啥不一样。 在第D1.10.2章里就形容异样向量表了。 这里第一句话是说,这个向量表会占用一大段间断的空间,这是什么鬼呢?咱们稍后再解释。 第二段说,每个EL等级里都有一个对应的VBAR寄存器,用来指向异样向量表的基地址。那你肯定会疑难,那怎么放呢? 第三段说,异样向量表里必须蕴含同步异样,Serror,IRQ和FIQ这种信息。 在第D.1.10.2章里有一个表D1-7,这个表,预计很多人看了间接晕倒,太艰涩难懂了。 ...

April 2, 2022 · 1 min · jiezi

关于arm64:笨叔点滴13哪些异常处理的事儿

“ 老师在讲ARM课程:小明,你来说说中断和缺页中断有啥区别? 小明:他们不是一个妈生的 老师:小明同学,滚。。。 ” 昨天咱们和大家聊了一下中断处理函数里遇到缺页中断的那些事儿,咱们只探讨了do_page_fault()这条内核解决门路,基本上这条解决门路曾经蕴含了次要和最难了解的场景,当然对于简略的do_translation_fault()/do_sect_fault()这条门路咱们认为代码比较简单,很好了解,所以就疏忽了。 那咱们明天来重新认识一下ARM v7上的异样解决的那些事儿。要意识ARM v7上的异样解决,咱们天然离不开ARM官网的手册了。这个大家在ARM官网上下载就行,一共2600多页,不过不必放心,ARM v8手册一共6666页,是不是有点恐怖? ARM v8的,咱们当前有机会再和大家介绍吧。 01 打开ARM v7手册,在第B1.8章里就开始介绍异样解决了。一开始就给大家介绍异样向量表。 大家须要注意的是,ARM的芯片手册的介绍是把几个模式都揉在一起介绍的,如Hyp模式,Monitor模式,Secure模式,non-secure模式,这样会让初学者看起来有点凌乱,若把这几个模式独自章节兴许更好一些。假如咱们只关注Linux kernel运行的场景,那咱们关注non-secure模式就好了。这里显示异样解决次要有预取abort,data abort和undefined abort。其实和缺页中断相干的是data abort和预取abort。 还有一个向量表安放的问题,传统的向量表能够放在0x0或者0xffff_0000这两个地位,当然设置SCTL寄存器的V域,能够依照程序猿的要求来比拟随便的安放这个向量表的地位。 而后在第B.1.8.3章里介绍了如果一个异样产生了,ARM处理器会做了那些事件。 上图让笨叔翻译一下的话就是这样的: 硬件啊,你首先要确定要触发那个异样?预取abort还是data还是undefined,这个不应该是咱们程序媛来拍脑袋 保留产生异样那个现场的CPSR到 异样模式的SPSR寄存器 保留返回地址(return address)到LR寄存器 设置CPSR.M域到相应的模式,并切换到该模式。设置相应的mask bits,避免异样嵌套 PC指向向量表的对应的中央,而后go 异样产生的时候是跑在异样模式的。ARM很奇怪,每个模式都有本人的堆栈,和中断一样。通常硬件就帮你带到了异样模式里,然而异样模式的堆栈大小无限啊,没有方法保留所有的上下文,那怎么办?通常软件是在异样模式里晃了一下就跑到SVC模式去的。 上面笨叔以runninglinuxkernel_4.0这个git tree代码为例,比方当初data abort产生了,代码会跳转到异样向量表里的vector_dabt里。(arch/arm/kerne/entry-armv.S) 在下面代码中1188行代码,vector_stub是一个宏。有的小伙伴会问了,为啥这个宏最初的一个参数是8,而vector_irq是4呢?这个问题大家还是要依赖ARM v7手册啊,谁让它是咱们的衣食父母呢。在第B1.8.3章里有这么一个表,意思是说在每个异样产生的时候,LR寄存器寄存的值是产生异样那个点的地址加上了一个offset,因为流水线的起因。然而咱们OS里保留的LR须要减去这个offset,咱们在vector_stub宏代码里能够看到。 vector_stub宏代码如下: 笨叔大抵把它分成4局部来了解就简略多了。第一局部减掉方才说的offset失去真正的LR返回地址,第二局部保留异样产生时 LR和SPSR寄存器到 异样的栈里,第三局部切换到SVC模式,第4局部判断异样产生是在用户态还是内核态,而后别离跳转到_dabt_svc和_dabt_usr外面。 vector_stub这个宏的具体每一行代码的解释能够看《奔跑吧linux内核》第621页。 上面以_data_svc为例。 svc_entry和svc_exit都是宏,具体代码剖析见《奔跑吧linux内核》第5.1.4节内容。 对应ARM v7处理器,最初会跑到v7_early_abort这个汇编函数里, 第16和17行啥意思呢? 这外面波及到两个寄存器别离是FSR和FAR,咱们先看芯片手册的第B3.13.1章,这里就介绍了当产生异样,咱们怎么能晓得发了啥事呢?因为硬件是能精确get到异样产生的起因和地址的,然而咱们程序猿不晓得,所以须要通过寄存器的形式来通知咱们,对吧? 这里巴拉巴拉的和你说了,有一个叫做FSR寄存器寄存了异样状态信息,还有一个叫做FAR寄存器寄存了异样产生的地址。这两个寄存器别离形容在哪里呢?能够看第B4.1.51和第B4.1.52节,外面有这两个寄存器详细描述。 其中最重要的是FS寄存器域,留神了,这里FS域是有两局部组成的,一个是BIT [0~3]和BIT[10],是不是有点奇葩呢。代码是这样的。 至多咱们是对应上的。那读出来的FS域有啥用呢?大家看手册的第B3.13.3章,这里有一个表来形容FS域的用法。 这表里定义了好多种缺页异样的类型,比方有translation fault,access fault,domain fault,permission fault等。 do_DataAbort()函数如下,大家能够重点看第547行,这里fsr_fs()方才提过了,fsr_info定义成一个table。 ...

April 2, 2022 · 1 min · jiezi

关于arm64:arm64汇编之寻址

[addr]示意寻址,蕴含在[]号之内的必然有一个寄存器,这个寄存器的值是一个内存地址,称之为Base Register,能够了解为c语言外面的一个指针,Base Register在寻址之前或者之后都能够进行一些运算操作,操作后果能够更新到Base Register,也能够不更新到Base Register,寻址形式分为四种:1.最简略模式:Base Register模式,可类比于: *(ptr)<->value,上面的x1不会变 ldr示意将内存中的值读取到寄存器中,ldr的右操作数肯定是内存地址的ldr x0, [x1] /* [x1] -> x0 */取x1的值为地址,取该内存地址的值,赋值给x0寄存器2.尾部带感叹号!带模式,称之为Pre-Index寻址模式,可类比于:*(++ptr)<->value上面的x1会先更新,而后用来寻址取值 str示意将寄存器中的值寄存到内存地址str x2, [x1,x2,LSL#2]!/* x1 = x1 + x2 << 2; x2->[x1]; */先计算出x1,用来寻址,会扭转x1,而后将x2的值存储在内存地址为x1的地址3.单纯的[REG]的模式:Post-Index寻址模式,可类比于:*(ptr++)<->value上面的x1先寻址,在更新x1 ldr x3, [x1],x2,LSL#2这有点相似于base register的变种先取地址为x1的值赋值给寄存器x3,而后在批改x1=x1+x2 << 24.其余的模式:Offset寻址模式,可类比于*(ptr +xxx) <-> value上面的x1不会更新 str x2,[x1,x2,LSL#2]将寄存器x2的值寄存到 地址为x1+x2 << 2的内存总结:[]宗括号外面示意地址运算,最终失去一个地址, ldr 寄存器(例如x1),[] 示意取[]内存地址的值赋给寄存器str 寄存器(例如x2) , [] 示意将x2的值存到[]的内存地址

March 29, 2022 · 1 min · jiezi

关于arm64:04ARMv8指令集运算指令集

加法指令ADD、ADDS、ADCS减法指令SUB、SUBS、SBC,SBCS,CMP位操作AND, ANDS, ORR、EOR、BFI、UBFX、SBFX1. 加法指令加法指令有ADD、ADDS、ADCS。 ADD一般性加法指令,ADCS带C标记位运算的加法指令,ADDS影响C标记位的加法运算。 1.1 ADDa = a + b, 没有进位标记,也不会利用进位标记 ADD (extended register) : Define: ADD <Xd|SP>, <Xn|SP>, <Wm>, {<extend> {#<amount>}}Example1: add x0, x1, x2 ( x0 = x1 + x2 )Example2: add x0, x1, x2, lsl #5( x0 = x1 + (x2 << 5) )ADD (immediate): Define: ADD <Xd|SP>, <Xn|SP>, #<imm>{, lsl <#shift>}, note shift supports #0 and #12 only.Example1: add x1, x2, #8 (x1 = x2 + 8)Example2: add x1, x2, #8, lsl #12 ( x1 = x2 + (8 << 12) )ADD (shifted register): ...

March 19, 2022 · 4 min · jiezi

关于arm64:Starting-with-JLink-debugger-ARMv8

Debugger: JLink V11Target Hardware: raspberry 4bHost: Ubuntu 20.04-amd64Note, the openocd installed by sudo apt-get install openocd is not work on ubuntu 20.04. The error prompted Error: invalid command name "dap". So you shall compile the openocd by yourself. Please refer to the link https://hackaday.io/page/4991... (Though it is targetting for ubuntu 16.04, the 20.04 still follow these build steps.) 1. The ScopeWe should use the three command terminals to launch the Jlink debugger. They are openocd/telnet/gbd-multiarch separately. ...

March 5, 2022 · 1 min · jiezi

关于arm64:03ARMv8指令集介绍加载与存储指令

Github地址:carloscn/uncle-ben-os at car_lab_01 (github.com) ARMv8指令集介绍A64指令集只能运行在aarch64所有A64汇编都是32 bits宽的 关注指令的应用、有什么limitationA64能拜访的地址数据是64位宽的A64反对全副的大写或者小写形式 ARM官网大写利用应用小写寄存器命名 Wn示意32bits宽的寄存器Xn示意64bits宽的寄存器WZR示意32位内容全为0的寄存器XZR示意64位内容全为0的寄存器...LDR指令LDR Xd, [Xn, $offset] 【释义】:将Xn寄存器中存储的地址+offset地址偏移存 组成一个新的地址,把这个地址外面存储的值放在Xd寄存器中。[]有取地址内存储的数值的含意。【示例】: S1: 应用MOV指令把0x80000加载到X1寄存器: MOV x1, 0x80000 (如果是一个数,而非#0x80000, 则是一个地址)S2: 应用MOV指令把16数值加载到X3寄存器: MOV x3, 16S3: 应用LDR指令读取X1地址外面存储的值,存储到X0中: LDR x0,[x1] , 这个不容许->LDR x2,[0x80000]S4:应用LDR指令读取X1 + 8地址外面存储的值,存储到X2中:LDR x2,[x1, #8]S5:应用LDR指令读取(X1 + X3)地址外面存储的值,存储到X4中: LDR x4,[x1, x3]S6: 应用LDR指令读取(X1+(X3<<3))地址外面存储的值,存储到X5中: LDR x5,[x1,x3,lsl #3]【留神】: 给的数不加任何标记的视为地址须要给立刻数的场景而非地址的值,应用#[]有取地址值的意思LDR lsl扩大指令,只反对1和3LDR x2,[x1, #8] x1的值不会被更新为0x80008【变基模式】: 前变基模式 pre-index: 先更新偏移地址,后拜访地址后变基模式 post-index: 先拜访内存地址,再更新偏移地址GDB-Tips启动GDB和QEMU链接 > gdb-multiarch --tui benos.elfgdb> cgdb> target remote localhost:1234gdb> b ldr_test // 设定断点gdb> cgdb> next //下一步gdb> info register // 查看所有寄存器gdb> info x1 x2 x3 // 查看x1/x2/x3寄存器gdb> x 0x80000 // 读取内存0x80000值 32位gdb> x/xg 0x80000 // 读取内存0x80000值64位

February 14, 2022 · 1 min · jiezi

关于arm64:02-ARMv8-some-baisc-concepts

ARMv8 Introduction新一代64位解决放弃ARMv7兼容性New feature在programmer guide 2.1外面 引入那些feature: Large physical address 32位零碎的没有enable的话,只反对4G。 64bit virtual addressing 使之虚拟地址空间能够超过4GB automatic event sinaling 反对原子操作的存储和拜访的操作 larger register files 缩小对栈的应用,进步性能。 ...Addtional 16KB 和64KB TLB...Load-Acquire, Store Release instructionsNEON double-precision floating-pointsARMv8 some basic conceptsRM datasheet:PE: Processing Element(处理机)RISC架构的个性(RM提供的):A large uniform register file. (ARMv7提供R0-R15,ARMv8提供更丰盛的寄存器,比方X0-X30)A load/store architecture, where data-processing operations only operate on register contents, not directly on memory contents.Simple address modes, with all the load/store address determined from register contents and instruction fields only. (采纳对立的简略的,比方内存映射MMU模式)Execution StatesThe downward compatibility of ARMv7 shall be considered when the ARM designed the ARMv8 instruction set architecture,so the ARM designs the Execution State to be compatible with the ARMv7. There are the two types of `Execution State designed: ...

February 10, 2022 · 2 min · jiezi

关于arm64:x86架构应用如何向Arm架构低成本迁移

曾几何时,无论是在服务器还是个人电脑,CPU芯片畛域始终是 Intel 独占鳌头,旗下的 X86_64 架构被宽泛采纳。然而王权没有永恒,近年来 Arm64 架构异军突起,服务器端有华为鲲鹏920高性能芯片做代表,个人电脑端则以苹果M1芯片惊艳世人。Arm64 架构芯片用低功耗和高性能炫耀着其市场价值,国产化代替的洪流也在一直将 Arm64 推向军队、政府、国企的供应商们。抓住先机,迅速拥抱与适配国产化芯片,是这个时代软件交付的新话题。拥抱 Arm64 的难处从 X86_64 迈向 Arm64 并非易事,指令集的扭转,影响半径极大。 最间接的影响,是原来在 X86_64 环境中能够失常运行的业务零碎须要基于 Arm64 从新编译才能够运行。即便开发时应用的语言具备跨架构的能力,从新编译自身就是一种很简约的工作,须要投入大量的人力老本和工夫老本。 Arm64 的开发语言生态并不是那么健全,这无形中会减少了本不该开发人员关怀的累赘。很多语言自身的运行环境都须要从新编译,更不要提很多开源中间件的适配工作。 以上仅仅是开发人员关注的重点。 在软件交付畛域,软件交付到客户环境中运行起来,仅仅是个开始。业务零碎的治理、监控、迭代、容灾都是交付团队须要继续关注的点。少数交付团队在 X86_64 架构下,都曾经有了本人的解决方案。那么容器、Kubernetes、DevOps这些先进的工具办法,在 Arm64 架构下如何复刻? 解决之道Rainbond 能够利用自身能力抹平芯片架构的差别,无论是开发人员,还是交付人员,都能够基于 Rainbond 找到拥抱 Arm64 的解决之道。Rainbond 通过不同档次的能力来解决从 X86_64 到 Arm64 的迁徙问题。 既有能力:Rainbond 自身是一款实用于软件交付,或者利用运维治理的云原生利用治理平台。无论是疾速交付部署,还是利用的治理、监控、迭代、容灾,既有的性能曾经能够满足交付运维人员的日常需要。容器化技术:Rainbond基于容器化技术实现,容器这种轻量级的虚拟化技术在 Arm64畛域未然大放异彩。自从容器反对多架构之后,绝大多数开源中间件都曾经提供了基于不同架构的根底镜像,Arm64 天然是其中的标配。抉择容器化技术,相当于抉择了 Arm64 的生态反对。本身兼容 Arm64 :Rainbond 很早就开始落子国产化架构适配,本身适配了蕴含 Arm64 在内的多种架构。极简的开发环境部署: Rainbond 曾经反对运行于各种集体平台的 Docker Desktop 环境中,开发者只须要借助一台具备 M1 芯片的 MacBook ,即可花十分钟搭建起本人的 Rainbond Arm64 开发环境,不便至极。源码构建兼容 Arm64 :这是买通迁徙到 Arm64 架构的最初一环。在 Rainbond 中,开发人员能够不改一行代码,间接利用源码构建本人的业务组件,即可将之部署运行于 Arm64 环境中。目前Rainbond源码构建曾经反对了市面上多种支流语言,围绕语言本身的各种扩大依赖曾经趋于残缺。Rainbond 兼容 Arm64Rainbond 云原生利用治理平台能够被部署在 Arm64 环境中。从 2020 年 1 月起,Rainbond 别离和华为、飞腾进行了适配测试。通过验证,Rainbond 在 Kunpeng 920 芯片以及 FT2000+/64 这两款 Arm64 芯片上均能够稳固运行, 达到生产可用的规范。 ...

January 12, 2022 · 2 min · jiezi