- 博客(41)
- 资源 (6)
- 收藏
- 关注
原创 Linux 不可中断进程的处理方法
1. 所谓进程D状态就是不可中断的状态,处于该状态下的进程不接受任何发给他的信号,通过kill -9 proceid 命令并不能杀死进程。通常导致该情况产生的原因是由于长时间等待IO导致的,一般的处理方法是reboot,但是某些环境下,进行reboot是不可取的,我们可以通过更改进程状态后kill掉这个进程。#include <linux/init.h>#include <linux/kernel.h> /*Needed by all modules*/#in...
2021-04-21 10:28:11
2430
原创 PS 打印出的进程状态
D 不可中断 Uninterruptible sleep (usually IO) R 正在运行,或在队列中的进程 S 处于休眠状态 T 停止或被追踪 Z 僵尸进程 W 进入内存交换(从内核2.6开始无效) X 死掉的进程 < 高优先级 N 低优先级 L 有些页被锁进内存 s 包含子进程 + 位于后台的进程组; l ...
2021-04-21 09:54:44
359
1
原创 伙伴系统算法
一、Buddy(伙伴的定义):这里给出伙伴的概念,满足以下三个条件的称为伙伴:1)两个块大小相同;2)两个块地址连续;3)两个块必须是同一个大块中分离出来的;二、Buddy算法的分配原理: 假如系统需要4(2*2)个页面大小的内存块,该算法就到free_area[2]中查找,如果链表中有空闲块,就直接从中摘下并分配出去。 如果没有,算法将顺着数组向上查找free_area[3],如果free_area[3]中有空闲块,则将其从链表中摘下,分成等大小的两部分,前四个页面...
2021-04-13 11:23:12
1347
原创 objdump使用方法
objdump -a vmlinux //列举.a文件中所有的目标文件。objdump -g vmlinux //显示调试信息。objdump -t vmlinux //输出目标文件的符号表()objdump -T vmlinux //显示动态链接符号表objdump -h vmlinux //输出目标文件的所有段概括()objdump -f vmlinux //显示目标文件文件头objdump -I vmlinux //显示行号信息objdump .
2021-03-03 10:32:52
2363
原创 psudo-LRU(Tree LRU) 算法原理
psudo-LRU 算法的其中一个应用场景是cache line 的换出策略,是LRU算法的升级版1.算法原理: 一个组相连的cache,一个way有4个entry,L0,L1,L2,L3共用3位LRU位r0,r1,r2。2.LRU三个标志位r0,r1,r2 置位算法:如果最近访问的是L0或L1,则r0位置1;否则(最近访问的是L2或者L3), 则r0位置0. 在L0,L1之间,若最近访问的是L0,则r1置1; 否则,r1置0. 在L2和L3之间,若最近访问的是L2,则r2...
2021-02-26 16:49:39
1937
转载 Armv8架构虚拟化介绍
1 综述本文描述了Armv8-A AArch64的虚拟化支持。包括stage 2页表转换,虚拟异常,以及陷阱。本文介绍了一些基础的硬件辅助虚拟化理论以及一些Hypervisor如何利用这些虚拟化特性的例子。文本不会讲述某一具体的Hypervisor软件是如何工作的以及如何开发一款Hypervisor软件。通过阅读本文,你可以学到两种类型的Hypervisor以及它们是如何映射到Arm的异常级别。你将能解释陷阱是如何工作的以及其是如何被用来进行各种模拟操作。你将能描述Hypervisor可以产生什么虚拟
2021-02-24 11:42:43
1627
1
转载 红黑树详解
基础知识 红黑树是一种二叉搜索树,是AVL树的改进版。红黑树的生长是自底向上的,跟2-3树类似为啥引入红黑树:1、二插搜索树会出现退化成链表的情况,其时间复杂度为O(n)2、为防止二叉搜索树会退化成链表,引入了对左右子树的高度差有严格显示的AVL树。 AVL树的缺点: 因为对左右子树的高度差有严格的规定,所以其在插入和删除时会出现旋转,导致性能下降。这才有了对平衡概念不是很严格的红黑树红黑树与AVL树的比较1. AVL树的时间复杂度优于红黑树,但是对于现在的计算机,这...
2021-02-08 15:15:38
118
原创 ARM64 寄存器
当前程序状态寄存器 (CPSR):存放 APSR 标记,当前处理器模式,中断禁用标记等 ; 保存的程序状态寄存器 (SPSR):当发生异常时,使用 SPSR 来存储 CPSR;
2021-02-05 19:08:25
756
转载 Linux中的RCU机制的原理
基本原理RCU的基本思想是这样的:先创建一个旧数据的copy,然后writer更新这个copy,最后再用新的数据替换掉旧的数据。这样讲似乎比较抽象,那么结合一个实例来看或许会更加直观。假设有一个单向链表,其中包含一个由指针p指向的节点:现在,我们要使用RCU机制来更新这个节点的数据,那么首先需要分配一段新的内存空间(由指针q指向),用于存放这个copy。然后将p指向的节点数据,以及它和下一节点[11, 4, 8]的关系,都完整地copy到q指向的内存区域中。接下来,write
2021-02-05 11:30:23
1391
原创 ARM64 指令集
1.异常处理指令指令 描述 SVC 系统调用指令:SVC #imm,允许应用程序通过SVC指令自陷到操作系统中,通常会进入EL1; HVC 虚拟化系统调用指令:HVC #imm,允许主机操作系统通过HVC指令自陷入到虚拟机管理程序中(EL2) SMC 安全监控系统调用指令:SMC #imm,允许主机操作系统或者管理程序通过SMC指令自陷入到安全监管程序。(EL3) 2.系统寄存器访问指令指令 描述 MRS 读...
2021-02-01 20:55:49
1431
转载 算术移位和逻辑移位的区别
1. 算术移位与逻辑移位算术移位指令对带符号数进行移位。逻辑移位指令对无符号数进行移位。算术左移、右移,逻辑左移、右移的图示如下这里有一个进位位C,它就是标志寄存器 (即状态寄存器,亦称程序状态字寄存器PSW)中的那个进位位,指示是否有进位或者借位,若有则该位为1,否则为0。逻辑左移跟算术左移完全一样。而逻辑右移跟算术右移则不一样,逻辑右移的最高位在移出后补0,而在算术右移中,最高位(这里的最高位指整个编码的最高位,即有符号数的符号位)不变,其他跟逻...
2021-02-01 16:42:25
20539
1
原创 内存屏障产生的原因及ARM提供的memory barrier 指令
程序执行时实际内存访问顺序和程序代码编写的访问顺序不一致,会导致内存乱序访问(注意:和指令的乱序执行是两码事)
2021-01-30 18:44:11
1032
原创 CPU 处理器技术名词
1.流水线: 现代处理器采用5级流水线的方式,分别是取指,译码,执行,数据内存访问(发射),写回;2.超标量:在一个时钟周期内处理多条指令,实现指令并行处理;3.乱序:
2021-01-29 21:02:46
492
原创 如何判断一个CPU架构是大端模式还是小端模式
union 联合体特点:一、成员首地址相同,也就是通过不同的成员访问会从相同的起始地址开始取数据,至于取多少个地址的数据取决于具体成员的类型。二、union内存空间的分配按照其占用内存最大的成员来进行分配下面这段代码利用联合体的第一个特性来判断CPU的大小端模式:输出的如果是true,则为小端模式,否则是大端模式;#include<stdio.h>#include<stdlib.h>int checkcpu(void){ union w..
2021-01-28 20:18:29
771
1
原创 精简指令集(RISC)和复杂指令集(CISC)的区别
CISC 和RISC 是时代的产物;IBM工程师研究发现,处理器提供的大量指令集和复杂寻址方式并不会被编译器生成的代码用到;20%的简单指令占据程序编译结果的80%;80% 的复杂指令只占程序指令的20%;根据这一特性,在CISC的基础上定义了新的RISC指令集;...
2021-01-28 20:02:16
2941
原创 Linux tftp命令
命令格式:tftp [主机名称或IP地址]操作说明:connect:连接到远程tftp服务器mode:文件传输模式put:上传文件get:下载文件quit:退出verbose:显示详细的处理信息trace:显示包路径status:显示当前状态信息binary:二进制传输模式ascii:ascii 传送模式rexmt:设置包传输的超时时间timeout:设置重传的超时时间help:帮助信息? :帮助信息例子:连接远端服务器:tftp 10.0.11.1.
2021-01-26 14:50:58
150
原创 ARM linux 使用交叉编译工具链进行bin的反汇编
bin文件中全部是二进制文件:利用GCC工具可以将bin文件反汇编成可读取的汇编语言objdump是Linux下的反汇编目标文件或者可执行文件的命令,arm-linux-objdump与之参数相同。常见用法:arm-linux-objdump -D -b binary -m arm xxx.bin > xxx.asm1.-b 文件格式 指定目标码格式2.-d 反编译可执行段3.-D 反编译所有段4.-EB,-EL指定字节序5.-f 显示文件的整体头部摘要信息6.-h 显..
2021-01-26 14:46:12
1409
原创 asm bin hex elf文件区别
asm: asm是汇编语言源程序的扩展名,.asm文件是以asm作为扩展名的文件,是汇编语言的源程序文件。汇编语言(Assembly Language)是面向机器的程序设计语言,是利用计算机所有硬件特性并能直接控制硬件的语言。在汇编语言中,用助记符(Memoni)代替操作码,用地址符号(Symbol)或标号(Label)代替地址码。这样用符号代替机器语言的二进制码,就把机器语言变成了汇编语言。 bin文件 bin文件是二进制文件,是文件格式binary的缩写...
2021-01-26 14:31:17
1824
转载 Linux的帧缓冲设备
<br />参见:<br />http://blog.ednchina.com/exbob/254847/message.aspx<br />Linux的帧缓冲设备 <br />帧缓冲(framebuffer)是 Linux 为显示设备提供的一个接口,把显存抽象后的一种设备,他允许上层应用程序在<br />图形模式下直接对显示缓冲区进行读写操作。这种操作是抽象的,统一的。用户不必关心物理显存的位置、换页机<br />制等等具体细节。这些都是由Framebuffer 设备驱动来完成的。帧缓冲驱动的应用广泛,在
2010-08-23 23:56:00
1275
原创 C语言函数返回值的获取
<br />以下帮你列出几种获得函数中返回值的方法<br />1)使用return获得<br />例如<br />function()<br />{<br />return 10;<br />}<br />main()<br />{<br />int a;<br />a = function();<br />}<br />2)使用全局变量获得<br />int a;<br />function()<br />{<br /> a = 11;<br />}<br />main()<br />{<br />i
2010-06-27 23:00:00
2915
原创 C语言的条件编译
<br /> 预处理程序提供了条件编译的功能。 可以按不同的条件去编译不同的程序部分,因而产生不同的目标代码文件。 这对于程序的移植和调试是很有用的。<br /><br /> 条件编译有三种形式,下面分别介绍:<br />1. 第一种形式:<br />#ifdef 标识符<br />程序段1<br />#else<br />程序段2<br />#endif<br /><br /> 它的功能是,如果标识符已被 #define命令定义过则对程序段1进行编译;否则对程序段2进行编译。如果没有程序段
2010-06-03 17:09:00
458
原创 动态存储分配
动态存储分配在数组一章中,曾介绍过数组的长度是预先定义好的,在整个程序中固定不变。C语言中不允许动态数组类型。例如:int n; scanf("%d",&n);int a[n];用变量表示长度,想对数组的大小作动态说明,这是错误的。但是在实际的编程中,往往会发生这种情况,即所需的内存空间取决于实际输入的数据,而无法预先确定。对于这种问题,用数组的办法很难解决。为了解决
2010-05-26 17:52:00
584
转载 2.6版Linux内核结构体指定初始化
在阅读GNU/Linux内核代码时,我们会遇到一种特殊的结构初始化方式。该方式是某些C教材(如谭二版、K&R二版)中没有介绍过的。这种方式称为指定初始化(designated initializer)。下面我们看一个例子,Linux-2.6.x/drivers/usb/storage/usb.c中有这样一个结构体初始化项目:static struct usb_driver usb_storage_
2010-05-20 10:19:00
684
转载 如何学习linux设备驱动
面对不断升级的内核,如何学习linux设备驱动 面对不断升级的linux内核、GNU开发工具、linux环境下的各种图形库,很多linux应用程序开发人员和linux设备驱动开发人员即兴奋,又烦躁。兴奋的是新的软件软件、工具给我提供了更强大的功能,烦躁的是适应新软件的特性、
2010-05-18 19:25:00
3011
原创 函数指针变量和指针型函数
1.函数指针变量 在C语言中,一个函数总是占用一段连续的内存区,而函数名就是该函数所占内存区的首地址。我们可以把函数的这个首地址(或称入口地址)赋予一个指针变量,使该指针变量指向该函数。然后通过指针变量就可以找到并调用这个函数。我们把这种指向函数的指针变量称为“函数指针变量”。函数指针变量定义的一般形式为:类型说明符 (*指针变量名)();其中“类型说明符”表示被指函数
2010-05-18 18:11:00
3996
原创 结构指针
一个指针变量当用来指向一个结构变量时,称之为结构指针变量。结构指针变量中的值是所指向的结构变量的首地址。通过结构指针即可访问该结构变量,这与数组指针和函数指针的情况是相同的。 结构指针变量说明的一般形式为: struct 结构名 *结构指针变量名 例如,在前面的例题中定义了stu这个结构,如要说明一个指向stu的指针变量pstu,可写为: struct
2010-05-18 18:08:00
944
原创 linux设备驱动学习需要掌握的基础技术
linux设备驱动的学习是一项浩大的工程,读者需要首先掌握以下基础: 1.良好的硬件基础,懂得SRAM,FLASH,SDRAM,硬盘的读写方式,UART,I2C,USB等设备接 口,轮询,中断,DMA的原理,PCI总线的工作方式以及CPU的内存管理单元(MMU)等. 2.良好的C语言基础,能灵活地运动C语言的结构指针,函数指针及内存动态申请和释放等. 3
2010-05-18 12:48:00
662
转载 u-boot源代码重要数据结构
u-boot源代码重要数据结构1、u-boot的启动流程:从文件层面上看主要流程是在两个文件中:cpu/arm920t/start.s,lib_arm/board.c, 1)start.s 在flash中执行的引导代码,也就是bootloader中的stage1,负责初始化硬件环境,把u-boot从flash加载到RAM中去,然后跳到lib_arm/board.c中的
2010-05-14 13:11:00
543
转载 lowlevel_init.S学习理解
lowlevel_init.S学习理解 在我迷迷糊学看了lowlevel_init.S中的代码之后,有一个感觉就是,要想读懂其中的代码首先得看一下你所用的芯片手册,因为里面有比较详细的存储器控制(MemoryController)描述。我用的是s3c2440手册里写得十分清楚,总共有8个块(Banks)(Bank0~Ba
2010-05-12 12:08:00
1074
转载 GNU ARM中的汇编指令.word
GNU ARM中的汇编指令.word汇编中的标号通常情况下是用来标明程序段的起始地址的,如_start:b resetldr pc, _undefined_instructionldr pc, _software_interruptldr pc, _prefetch_abortldr pc, _data_abortldr pc, _not_usedldr
2010-05-11 18:08:00
1403
转载 LDR指令总结
LDR指令总结 ARM是RISC结构,数据从内存到CPU之间的移动只能通过L/S指令来完成,也就是ldr/str指令。 一.ldr指令格式 ldr/str字和无符号字节加载/存储,其中ldr的指令格式为1.LDR Rd,[Rn] 2.LDR Rd,[Rn,Flexoffset]3.LDR Rd,[Rn],Flexoffset4.LDR Rd,label 注
2010-05-11 12:09:00
3145
原创 ARM GNU 汇编伪指令简介
ARM GNU 汇编伪指令简介 一.什么是汇编伪指令汇编指令语句 每一条指令语句在源程序汇编时都要产生可供计算机执行的指令代码(即目标代码),所以这种语句又叫可执行语句。每一条指令语句表示计算机具有的一个基本能力,如数据传送,两数相加或相减,移位等,而这种能力是在目标程序(指令代码的有序集合)运行时完成的,是依赖于汁算机内的中央处理器(CPU)、存储器、I/O接口等硬件
2010-05-11 09:56:00
1431
原创 Linux下ARM汇编语法
第一部分 Linux下ARM汇编语法 尽管在Linux下使用C或C++编写程序很方便,但汇编源程序用于系统最基本的初始化,如初始化堆栈指针、设置页表、操作 ARM的协处理器等。初始化完成后就可以跳转到C代码执行。需要注意的是,GNU的汇编器遵循AT&T的汇编语法,可以从GNU的站点 (www.gnu.org)上下载有关规范。一. Linux汇编行结构任何汇编行都是如下结
2010-05-11 08:41:00
2279
转载 Linux 汇编语言开发指南
汇编语言的优点是速度快,可以直接对硬件进行操作,这对诸如图形处理等关键应用是非常重要的。Linux 是一个用 C 语言开发的操作系统,这使得很多程序员开始忘记在 Linux 中还可以直接使用汇编这一底层语言来优化程序的性能。本文为那些在Linux 平台上编写汇编代码的程序员提供指南,介绍 Linux 汇编语言的语法格式和开发工具,并辅以具体的例子讲述如何开发实用的Linux 汇编程序。一、简介
2010-05-10 12:23:00
409
原创 Linux命令
Linux命令比较多,没有时间专门记忆这些命令,专门记忆这些命令效果不是特别好,下面知识根据使用的需要,记录自己在使用过程中遇的Linux到命令. 1.apt -get install 软件名称 2.grep3.gcc -v 查看gcc 版本号
2010-05-10 12:05:00
368
原创 杨创YC2440开发板学习计划
1.bootloader移植 编译环境的建立 U-boot代码的修改,编译,移植2.Linux内核移植 内核版本选择,熟悉内核架构 确定编译器,安装编译环境 熟悉内核结构,修改内核代码适应开发平台的需要 编译内核 移植内核到开发板3.驱动开发驱动开发编程框架及基础知识系统中断和系统时钟驱动System In
2010-05-08 10:07:00
1623
转载 GUN ARM汇编中标号的引用在汇编和C语言中区别
u-boot/cpu/xx/start.S中:_TEXT_BASE: .word TEXT_BASE /*uboot映像在SDRAM中的重定位地址,我设置为0xa170 0000 */ .globl _armboot_start _armboot_start: .word _start /*_start是程序入口,链接完毕它的值应该是0xa170 0000=TEXT_BASE*/
2010-05-07 09:27:00
2330
原创 s3c2440启动过程详解
s3c2440启动过程详解 一:地址空间的分配 2:开发板上一般都用SDRAM做内存flash(nor、nand)来当做ROM。其中nand flash没有地址线,一次至少要读一页(512B).其他两个有地址线 3:nandflash不用来运行代码,只用来存储代码,NORflash,SDRAM可以直接运行代码)4:s3c2440总共有8个内存banks 6个内
2010-05-06 16:22:00
6941
1
原创 U-boot实现的功能
一.U-boot实现的功能 1.初始化处理器及外围的硬件资源, 配置SDRAM控制器,为主程序提供运行环境, 串口初始化,提供交互终端 网络,传输镜像文件 其他I/O设备 2.执行系统自检,报告检测结果 3.引导操作系统 4.根据系统命令烧写惊醒文件; 1. 系统上电硬件复位, 2.CPU在
2010-05-06 15:50:00
932
原创 ARM编程模型
ARM编程模型1.机器指令、伪指令和宏指令 机器指令:能被处理器直接执行,而伪指令宏和宏指令不能。机器指令包括ARM指令集和Thumb指令集 ; 伪指令:在源程序汇编期间,由汇编编译器处理。其作用是为汇编程序完成准备工作; 宏指令:在程序中用于调用宏,宏是一段独立的程序代码;在程序汇编时,对宏调用进行展开,用宏体代替宏指令。 2.ARM处理器工作模式
2010-05-06 08:36:00
935
《Python机器学习实践指南》原书代码与数据集
2017-10-17
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人