桌面操作系统
文章平均质量分 63
我是标同学
我非常喜欢编程
展开
-
书写命令行的一般规则
命令行一般包括两部分:选项 option + 值 value 指明给一个选项传递值,可以用等于形式:-v=value --verbose=value 或者空格形式:-v value --verbose value,即选项的后面一个被解析为值,尽管后面是-开头,也就是如果需要传值的选项,要注意了,不要忘了后面传值,否则,会把后面的强行解析为值的。.........原创 2022-07-11 15:44:53 · 660 阅读 · 0 评论 -
stm32实现软件断点的几种方式
软件断点的原理就是指令替换,这里替换指令也是多种多样的,自己思考后,觉得可以有如下4种指令替换方法都行:用int3指令,机器码0XCC,一个字节,这个可能只在x86处理器上才有,这个就是个软中断 svc yy指令,机器码0xyyDF,两个字节,这个在arm上有,也是个软中断 bkpt指令,机器码0x00BE,两个字节,stm32有,专门用于调试的,也是个软中断 自己造一条跳转指令(用B或者BL都可以,但是得计算出机器码,这个和该指令所处得位置有关),为了完整的保存上下文,需要6个字节,前两个字节:原创 2022-01-19 19:53:20 · 1686 阅读 · 0 评论 -
gdb的使用以及命令大全非调试状态直接读取调试信息
gdb,我只想用它对调试信息解析的功能,也就是读取符号表,能为我显示我想要的信息即可(这方面几乎没有博客提这个,其实在我们不需要gdb实际调试,但是想看到程序调试信息的时候,学会这个是很有必要的)。我不会把它真的运行起来一个目标程序进行调试。看我这篇文章关于调试器和IDE的一些认识_biao2488890051的博客-CSDN博客XXdbg xx.out:读取该目标文件的调试信息(前提是编译时候加了-g)info scope funXX:可以查看这个函数内的所有局部变量信息,在哪个位置等等d原创 2022-01-19 15:26:32 · 558 阅读 · 0 评论 -
GDB实现原理
1、上篇主要对GDB的使用技巧进行了一个简单总结,其实这里的内容是和上篇总结的内容放在一块的,但是考虑到GDB的实现技术重要性和意义,所以单独拿出来,当前只做皮毛性的记录,留待以后进一步补充内容。2、GDB基本组成: GDB由三个部分组成:(1)用户接口user interface,除支持传统的CLI接口还支持mi接口(ddd等工具使用)(2)符号处理层symbol handling,当gdb ./debugme后GDB会读取文件的符号信息,之后的原代码,变量/函数/类型的显示都由该部分...转载 2022-01-18 15:46:51 · 884 阅读 · 0 评论 -
关于调试器和IDE的一些认识
编译器一般都用gcc,编译选项加-g,能生成调试信息在目标文件中。调试目标文件,最主要的就是正确读取目标文件中的调试信息:(比如指令地址对应的源代码哪一行,全局变量的地址是多少,局部变量存在哪个寄存器中还是栈中的哪个偏移位置,结构体长度多少如何怎样读取数据等,必须要这些调试信息,否则程序信息IDE一无所知(你说IDE自己分析源码?这个相当于自己实现一个编译器和生成调试信息了,不实际))而这些调试信息都是有特定格式的(看我这篇文章关于ELF格式文件里面的调试信息解读_biao2488890051的原创 2022-01-18 15:41:13 · 892 阅读 · 0 评论 -
关于ELF格式文件里面的调试信息解读
调试信息格式一般有几种:debug信息格式有stabs,coff,xcoff,dwarf。各自在业界不同的调试器下面用,gdb只是调试器中的一个罢了。常用的有两种格式,stab和dwarf,stab较早,dwarf较新(在Linux中大量使用)。两种格式介绍:IBM Developer 正在整合其语言站点组合。 – IBM Developergcc编译时候,可以配置一下编译选项,就能产生对应的调试信息格式。1. stab格式的调试信息,存在于最后的可执行文件 .stab , stabstr 两个原创 2022-01-18 09:44:15 · 3093 阅读 · 0 评论 -
关于软件逆向工程的一些不错博客
最近在搞嵌入式单片机的程序的底层调试问题,需要反汇编,了解到了逆向工程这么个领域。其实一个应用程序编译后就是xx.exe软件,这个就是机器码,我们只需要反汇编(也可以单步调试它),就能看到对应的汇编代码了,如果我们想要对该软件做些修改,那么我们改变这些汇编代码即可,难听点,其实就是实现软件破解啦(比如软件有密码匹配)。可以反汇编和调试这个xx.exe的软件,我们称之为动态分析,常用的有OllyDebug,如果仅仅是反汇编,甚至还能把反汇编尽量转为C语言等源程序,称为静态分析,常用的有IDA。逆向原创 2022-01-16 21:06:48 · 463 阅读 · 0 评论 -
系统gdb内核调试应用程序断点单步执行调试原理
我们知道用调试器硬件,可以单步调试软件的运行,但是操作系统中,不需要调试器硬件支持,就可以单步调试应用软件的运行,这是怎么做到的呢?也就是OS内核怎么就能控制应用程序一步步执行呢?其实很简单,示意图如下:当我们想要调试时候,会把断点信息发送给系统内核的调试线程,它会把我们要调试的应用程序的断点所在地址的指令替换成OS自己的线程挂起函数,这样每次执行到断点,该程序就会被OS挂起,因此,可以查看该应用程序的堆栈各种变量信息了,调试完成后,又会把该断点处的指令恢复为原来的指令,这样就实现了OS可以原创 2021-12-16 15:33:54 · 1097 阅读 · 0 评论 -
makefile基础知识3关于常用命令选项的使用
可以看我前面的系列文章:gcc编译器使用总结和makefile基本知识 makefile伪目标详解 makefile基础知识学习篇2makefile编译过程中要想不输出编译展开的过程信息,那么加入-s参数即可 make -s -B是所有目标都强制更新,类似先make clean,再make一样 -h可以打印出帮助,所有相关命令选项也都可以介绍出来了 伪命令可以内部包含其它命令, $(TARGET).bin : $(OBJS) clean: rm -rf $(TARGET)...原创 2021-07-04 13:12:32 · 475 阅读 · 0 评论 -
cpsr与cpsr_c,cpsr_f,cpsr_x,cpsr_s的区别
msr cpsr_cxsf,r1;这里的cxsf表示从低到高分别占用的4个8bit的数据域指令中有时还有出现cpsr_cf, cpsr_all, cpsr_c等,这里: c 指 CPSR中的control field ( PSR[7:0]) f 指 flag field (PSR[31:24]) x 指 extend field (PSR[15:8]) s 指 status field ( PSR[23:16])其...原创 2021-07-03 20:22:36 · 1848 阅读 · 0 评论 -
cortex-a内核MX6ULL处理器bootloader制作目标镜像中断跳转不正确
这是因为boot程序跳转进入目标镜像,应该在main函数中跳转,不能在中断里面跳转到目标镜像,因为中断得先退出才行,不然不能再次进入中断的喔(boot程序的中断未退出会影响目标镜像程序运行时的中断的进入的喔)...原创 2021-07-03 10:27:55 · 262 阅读 · 0 评论 -
arm编译后指令定位地址分析(编译顺序和运行顺序)
指定了程序编译的起始链接地址0x87800000,那么编译时候就按照顺序编译出机器码。在前面的代码先编译,因此定位地址也靠前。可以看出,Reset_Handler函数在32行开始,因此编译的值就不是0x87800000,而是靠后了87800020。但是Reset_Handler函数运行是最靠前的(上电运行的第一个函数,看我这篇文章arm cortex-A中断基本知识和通用汇编中断服务函数模板(必读!!!)),因此只需要在第一行跳转给它即可。也就是说编译顺序,和运行顺序是不一样的。下面是cortex-a内原创 2021-07-01 16:17:27 · 867 阅读 · 0 评论 -
stm32等cortex-m内核单片机启动文件执行过程详解(通俗易懂!!!)
基础必备知识:汇编指令基础知识EQU:相当于C语言中的define AREA: 汇编中,一般分号;表示注释,此外,也支持c语言中的注释符号,//等等。;堆栈大小设置,如果局部变量过多,这里应该相应改大.默认是1024字节.Stack_Size EQU 0x00000400 AREA STACK, NOINIT, READWRITE, ALIGN=3Stack_Mem SPACE ...原创 2021-06-30 17:40:46 · 3095 阅读 · 4 评论 -
程序运行代码动态重定位原理
程序编译时候我们会指定一个链接地址(也就是程序定位的运行地址),编译后,cpu的pc指针指向这个地址开始执行,就时没为题的。但是我们现在想把该段程序运行时(没法对该段程序进行再次指定地址的编译了)挪动到其它内存区域(程序动态加载功能),要想该段代码仍然能正常运行,就需要对该段代码进行重定位,而不是简单的拷贝该段代码到指定内存区域即可。 ...原创 2021-06-29 11:07:54 · 1716 阅读 · 0 评论 -
b/bl与ldr区别 位置无关码
b/bl解析:sdram.lds:SECTIONS{. = 0X30000000;...}start.S:...bl mainsdram.dis:3000005c:eb000105 bl30000478...30000478 :将sdram.lds进行修改:. = 0X32000000; 重新编...转载 2021-06-28 21:31:08 · 662 阅读 · 0 评论 -
嵌入式杂记(uboot启动流程,简单易懂!!!)
汇编 bic 指令,位清除指令,bicsp,sp,#7,将sp和#7取反做与运算,结果存入sp中,也就是将sp低3位清0,这个是用于sp做8字节对齐的作用原创 2021-06-28 11:22:37 · 953 阅读 · 5 评论 -
Linux设备树原理
如果每个引脚的配置都要写成一个驱动文件,那么所有外设的驱动,以及不同板子的驱动,以及不同芯片的驱动,都放在通用Linux系统中,将会极其庞大。因此把外设配置(驱动)共同的部分提取出来,写在Linux系统中,然后再用一个文件格式(设备树文件)存放这些配置信息,这样针对不同外设驱动,用户仅仅提供配置信息(设备树文件中以节点形式,添加节点即可,存放的是寄存器地址,想要配置的值)即可,剩下的交给Linux系统去配置即可。基于设备树的 LED 驱动,但是驱动的本质还是没变,都是配置 LED 灯所原创 2021-06-27 13:00:59 · 374 阅读 · 2 评论 -
arm中SP,LR,PC寄存器以及其它所有寄存器以及处理器运行模式介绍
ARM中所有寄存器都是32位的。ARM 处理器共有 7 种不同的处理器运行模式:用户模式(User),快速中断模式(FIQ),普通中断模式(IRQ),管理模式(Svc),数据访问中止模式(Abort),未定义指令中止模式(Und),系统模式(Sys)当某个触发满足了,arm自动进入那个模式,比如外部中断来了,arm自动跳转进入IRQ_Handler向量地址,这时候就是自动进入了IRQ模式(在下面介绍的CPSR状态寄存器对应的位可以查询知道当前所处模式,确实改变了)。任意一种模式都可以运行程序,原创 2021-06-26 17:31:05 · 4401 阅读 · 2 评论 -
arm cortex-A中断基本知识和通用汇编中断服务函数模板(必读!!!)
中断基本知识中断过程:芯片设计固化了能产生哪些中断,那么每个中断对应的处理地址(这个可以由用户自己指定,一般放在代码的最前面,意思是该中断一旦产生,程序无条件pc指针直接跳转到该处理地址执行,那么就需要解决一个问题,如何跳转回来?(后面有介绍))。Cortex-A7 内核有 8 个异常中断因此对应的中断向量映射表如下:1 .global _start /* 全局标号 */23 _start:4 ldr pc, =Reset_Handler /* 复位中断 ...原创 2021-06-26 13:29:23 · 2479 阅读 · 5 评论 -
C语言工程的通用makefile模板(干货!!!)
在Linux或者嵌入式单片机中开发c语言程序,可能没有集成开发环境IDE,因此需要我们自己用gcc命令行编译,但是工程量大,为了提高编译效率,又不得不用makefile,因此c语言工程的一个通用的makefile编译脚本就需要了,下面就是我借鉴别人的模板,自己给出了详细的注释:#这是C语言工程通用的makefile模板#赋值符号?=表示若变量没有赋值,则采用本次赋值,否则本次赋值无效CROSS_COMPILE ?= arm-linux-gnueabihf-TARGET ?= bsp原创 2021-06-25 23:12:58 · 2355 阅读 · 8 评论 -
MAX6ULL板子烧录失败解决
有/dev/sdc 和/dev/sdc1 和/dev/sdc2 以及/dev/sdc4,在这里要注意,/dev/sdc 是设备名,/dev/sdc1 和/dev/sdc2 以及/dev/sdc4 是分区名,在裸机实验中我们要将程序烧录到设备里,不是烧录到分区里,所以执行如下指令进行烧录:./imxdownload ledc.bin /dev/sdc这里要注意了,有的人指令写成了./imxdownload ledc.bin /dev/sdc1,这个是错的,所以烧录完成放到开发板上运行没有成功。...原创 2021-06-25 15:06:39 · 448 阅读 · 0 评论 -
gcc链接脚本学习
其实编译过程很简单,就是,例如:在终端输入如下命令:gcc main.c calcu.c input.c -o main即可把上述3个c文件编译为可执行的main文件,但是当一个工程包含数百个xx.c文件,此时上述直接写,就很麻烦,而且哪些文件新修改了,需要再次编译或者不需要再次编译,程序员都很难自己掌控,很麻烦。这时候makefile就登场了,自动化控制编译过程。看我这篇文章gcc编译器使用总结和makefile基本知识1 main: main.o input.o calcu.o2 ...原创 2021-06-25 14:49:32 · 820 阅读 · 0 评论 -
arm cortex-A启动过程
1. 通过两个GPIO可以决定启动方式:BOOT_MODE[1:0] BOOT 类型00 从 FUSE 启动01 串行下载10 内部 BOOT 模式(CPU固有化的内部不可变的一段程序)11 保留2. 一般选择10,即内部boot启动(这段 boot ROM 代码会进行硬件初始化(一部分外设),然后从 boot 设备(就是存放代码的设备、比如 SD/EMMC、NAND)中将代码拷贝出来复制到指定的 RAM 中,一般是 DDR。),这个boot程序就会选择从哪儿拷贝代码呢?那就是:原创 2021-06-25 14:23:24 · 1157 阅读 · 0 评论 -
VMware Workstation 无法连接到虚拟机。请确保您有权运行,虚拟机“Ubuntu”繁忙。解决办法(亲测有效!!!)
我是插入了sd卡读卡器,Ubuntu就陷入死机状态,然后关闭也关不了,提示繁忙。百度后发现很多人也遇到这个问题,这里给出一些解决链接:VMware Workstation 无法连接到虚拟机。请确保您有权运行该程序、访问该程序使用的所有目录以及访问所有临时文件目录。 VMware Authorization Service 当前未运行:说是设置服务延迟启动 VMware Workstation 无法连接到虚拟机。请确保您有权运行该程序、访问该程序使用的所有目录以及访问所有临时文件目录。 未能将管道连接到原创 2021-06-25 12:29:10 · 1206 阅读 · 0 评论 -
dis反汇编文件的分析理解
CPU按照内存从前往后,依次取指执行,在内存中存的就是机器码往后排而已。[pc,#104]表示pc指针内容加上立即数104后该值所指向的地址的内容,这个就是常数0x020c4068。与原本汇编代码一致。更详细的看这篇文章反汇编文件(.dis文件)的理解...原创 2021-06-24 22:29:38 · 1487 阅读 · 0 评论 -
gcc编译知识2
编译过程:每个xx.c分别编译为xx.o文件(这个可以利用CPU多核进行并行编译),gcc命令, xx.o中包含有地址,调试,符号等信息。常用编译选项: “-g”选项是产生调试信息, “-c”选项是编译源文件,但是不链接 “-o”选项是指定编译产生的文件名字 对所有xx.o进行运行地址确定(链接),ld命令,得到xx.elf,运行阶段就是把这些程序在这些指定的地址上运行和跳转的。常用编译选项: “-o”选项是指定编译产生的文件名字 将 xx.elf 文件转换为.bin 文件,objcopy原创 2021-06-24 20:54:20 · 880 阅读 · 1 评论 -
arm汇编基本知识
GNU 汇编语法我们要编写的是 ARM汇编,编译使用的 GCC 交叉编译器,所以我们的汇编代码要符合 GNU 语法。GNU 汇编语法适用于所有的架构,并不是 ARM 独享的,GNU 汇编由一系列的语句组成,每行一条语句,每条语句有三个可选部分,如下:label:instruction @ commentlabel 即标号,表示地址位置,有些指令前面可能会有标号,这样就可以通过这个标号得到指令的地址,标号也可以用来表示数据地址。注意 label 后面的“:”,任何以“:”结尾的标识符都会原创 2021-06-24 20:14:52 · 1245 阅读 · 3 评论 -
VMware安装完vmware-tools也还是无法复制粘贴文件解决
1、打开虚拟机VMware Workstation,启动Ubuntu系统,依次点击VMware的菜单栏,虚拟机 ,安装VMware Tools。2、弹出对话框,点击是即可。3、此时,会发现虚拟机设备下多了VMware Tools这一项,点击它,其里面有一个VMwareTools.tar.gz文件。4、在VMwareTools.tar.gz上右键点击提取到。5、提取完成后会发现桌面的myfile文件夹里多了一个vmware-tools-distrib文件夹。6、按下快捷原创 2021-06-24 14:36:27 · 31916 阅读 · 9 评论 -
makefile基础知识学习篇2
3.4.2 Makefile 变量跟 C 语言一样 Makefile 也支持变量的,先看一下前面的例子:main: main.o input.o calcu.ogcc -o main main.o input.o calcu.o上述 Makefile 语句中,main.o input.o 和 calcue.o 这三个依赖文件,我们输入了两遍,我们这个 Makefile 比较小,如果 Makefile 复杂的时候这种重复输入的工作就会非常费时间,而且非常容易输错,为了解决这个问...原创 2021-06-24 12:58:43 · 827 阅读 · 1 评论 -
makefile伪目标详解
Makefile 里面是由一系列的规则组成的,这些规则格式如下:目标…... : 依赖文件集合……命令 1命令 2……目标:这里仅仅是一个字符串标示(动作名字)的作用,真正的文件生成时命令1,2...所做的事,比如gcc才是生成一个文件。因此makefile的作用仅仅是指定编译规则,以字符串操作为基础的规则罢了。makefile的原理:文件的生成是命令中完成的,makefile仅仅是一个字符串执行者。main:main.o #main在makefile看来也是一...原创 2021-06-24 12:47:19 · 1129 阅读 · 0 评论 -
gcc编译器使用总结和makefile基本知识
3.2.1 gcc 命令 在上一小节我们已经使用过 GCC 编译器来编译 C 文件了,我们使用到是 gcc 命令,gcc 命 令格式如下: gcc [选项] [文件名字] 主要选项如下: -c:只编译不链接为可执行文件,编译器将输入的.c 文件编译为.o 的目标文件。 -o:<输出文件名>用来指定编译结束以后的输出文件名,如果不使用这个选项的话 GCC 默 认编译出来的可执行文件名字为 a.out。 -g:添加调试信息,如果要使用调试工具(如 GDB)的话就必须加入此选项,此选项原创 2021-06-23 23:44:34 · 1049 阅读 · 2 评论 -
Linux小知识总结
当编译完成以后会生成一个 a.out 文件,这个 a.out 就是编译生成的可执行文件,执行此文件看看是否和我们代码的功能一样,执行的方法很简单使用命令:“./+可执行文件”,比如本例程就是命令:./a.out...原创 2021-06-23 22:26:15 · 197 阅读 · 2 评论 -
大部分根目录下的系统需要文件都仅可读如何修改呢
说明如果该文件对普通用户仅为只读,但是对root用户就是可读写的,因此,命令行只需要以root用户打开它,即可编辑了原创 2021-06-23 17:19:11 · 352 阅读 · 0 评论 -
Linux的文件系统常识
Linux系统的根目录在哪呢,Windows 下的 C 盘根目录就是“C:”,在 Linux 下的根目录就是“/”,你没有看错,Linux 根目录就是用“/”来表示的而我们一般都是处于用户目录的,和根目录不是同一个目录,这里我们仔细观察一下,当我们进入到根目录“/”里面以后终端提示符“$”前面的符号“~”变成了“/”,这是因为当我们在终端中切换了目录以后“$”前面就会显示切换以后的目录路径。我们来看一下根目录“/”中的一些重要的文件夹:/bin 存储一些二进制可执行命令文件,/.原创 2021-06-23 12:41:17 · 541 阅读 · 2 评论 -
Linux命令行使用常识
Shell 基本操作前面我们说 Shell 就是“敲命令”,那么既然是命令,那肯定是有格式的,Shell 命令的格式如下:command -options [argument]command: Shell 命令名称。options:选项,同一种命令可能有不同的选项,不同的选项其实现的功能不同。argument:Shell 命令是可以带参数的,也可以不带参数运行,即方括号表示可选的。同样以命令“ls”为例,下面“ls”命令的三种不同格式其结果也不同:lsls –lls /usr常.原创 2021-06-23 11:14:36 · 394 阅读 · 1 评论 -
Windows操作系统安装步骤与心得
win10安装为例,安装方式一般有两种:在本系统中,直接双击新下载的镜像iso里的setup.exe,就会一步步安装好新的系统,旧系统的用户文件会自动保存在windows.old文件夹内(win8中装win10就不是这样了)。该方式类似套娃。 优点:安装得到的是原本的纯净系统。 缺点:该方式不能格式化C盘和其他盘,只会把新安装系统的那几个文件夹给清空,比如windows,programs等等。且其它的文件夹都会存在。因此安装出来的系统会有原本的文件存在。 U盘中搞个PE系统,然后在PE中双击.原创 2021-06-22 21:29:51 · 2145 阅读 · 0 评论 -
常用虚拟机VMware和windows自带虚拟机hyper-v对比使用
通过网上总结别人的使用经验就是:windows系统中用windows虚拟机,那么建议用windows10自带了的typer-v虚拟机,因为运行速度会geng'kuai'yi原创 2021-06-17 19:36:59 · 9034 阅读 · 0 评论 -
处理器运行原理:代码存储地址和运行地址
因此我们现在需要做的就是确定一下本试验最终的可执行文件其运行起始地址,也就是链接地址。这里我们要区分“存储地址”和“运行地址”这两个概念,“存储地址”就是可执行文件存储在哪里,可执行文件的存储地址可以随意选择。“运行地址”就是代码运行的时候所处的地址,这个我们在链接的时候就已经确定好了,代码要运行,那就必须处于运行地址处,否则代码肯定运行出错。比如 I.MX6U 支持 SD 卡、EMMC、NAND 启动,因此代码可以存储到 SD 卡、EMMC 或者 NAND 中,但是要运行的话就必须将代码从 SD原创 2021-06-05 10:45:07 · 1238 阅读 · 0 评论 -
Cotex-A处理器学习笔记
对于 Cortex-A 芯片来讲,大部分芯片在上电以后 C 语言环境还没准备好,所以第一行程序 肯定是汇编的,至于要写多少汇编程序,那就看你能在哪一步把 C 语言环境准备好。所谓的 C 语言环境就是保证 C 语言能够正常运行。C 语言中的函数调用涉及到出栈入栈,出栈入栈就要 对堆栈进行操作,所谓的堆栈其实就是一段内存,这段内存比较特殊,由 SP 指针访问,SP 指 针指向栈顶。芯片一上电 SP 指针还没有初始化,所以 C 语言没法运行,对于有些芯片还需要 初始化 DDR,因为芯片本身没有 RAM,原创 2021-06-04 12:46:00 · 659 阅读 · 1 评论 -
Linux中随心笔记
rm -f这里的f是force的意思,即删除中会忽略不存在的文件,且删除过程中不会有任何提示 $(变量名) 表示的是此变量的值,如$(object)表示的是变量object的值; 举个例子: objects = main.o kbd.o command.odisplay.o edit : $(objects)等价于 edit :main.o kbd.o command.o display.o deepin中用vim打开一个文件,按退出键ESC返回不能修改模式,insert按键继续编辑。大...原创 2020-10-24 12:30:50 · 1104 阅读 · 0 评论