欢迎来到皮皮网官网

【支付木马源码】【瓶装燕窝溯源码】【丽江和瑞丽源码】linuxregisters源码

时间:2024-12-23 12:04:05 来源:h5单机小游戏源码

1.Linux下/proc目录介绍
2.盘一盘Linux内核中ns级别的源码高精度计时方法
3.Android NDK Tombstone/Crash 分析
4.linux print命令
5.linux32位和64位的区别

linuxregisters源码

Linux下/proc目录介绍

       Linux下的/proc目录是内核提供的一种机制,用于在运行时访问内核内部数据结构和改变内核设置。源码它是源码一个伪文件系统,以文件系统的源码方式为访问系统内核数据的操作提供接口。用户和应用程序通过/proc可以获取系统信息,源码并能修改内核参数。源码支付木马源码系统的源码信息,如进程,源码是源码动态改变的,因此用户读取/proc文件时,源码是源码动态从系统内核读出所需信息并提交的。

       在/proc目录中,源码存在多个子文件或子文件夹,源码如/sys、源码net、源码scsi和sys。特别地,sys目录是可写的,用于访问或修改内核参数;net和scsi则依赖于内核配置。对于进程信息,/proc目录下存在数字命名的瓶装燕窝溯源码目录,代表系统中当前运行的每一个进程,例如进程PID号的目录;self目录则是读取进程本身信息的接口。

       以下是部分/proc目录中具体文件或子目录的介绍:

       - /proc/buddyinfo:与内存区中的每个order的可用块数量和内存碎片相关。

       - /proc/cmdline:启动时传递给kernel的参数信息。

       - /proc/cpuinfo:CPU信息。

       - /proc/crypto:内核使用的所有已安装加密密码及细节。

       - /proc/devices:已加载设备并分类。

       - /proc/dma:已注册使用的ISA DMA频道列表。

       - /proc/execdomains:支持的execution domains信息。

       - /proc/fb:帧缓冲设备列表,包括数量和控制它的驱动。

       - /proc/filesystems:内核当前支持的文件系统类型。

       - /proc/interrupts:x架构中的每个IRQ中断数。

       - /proc/iomem:每个物理设备在系统内存中的映射。

       - /proc/ioports:一个设备的输入输出所使用的注册端口范围。

       - /proc/kcore:代表系统的物理内存,存储为核心文件格式。

       - /proc/kmsg:记录内核生成的信息,可以通过/sbin/klogd或/bin/dmesg处理。

       - /proc/loadavg:根据过去一段时间内CPU和IO状态得出的丽江和瑞丽源码负载状态,与uptime命令相关。

       - /proc/locks:内核锁住的文件列表。

       - /proc/mdstat:多硬盘、RAID配置信息。

       - /proc/meminfo:RAM使用相关信息。

       - /proc/misc:其他主要设备(设备号为)上注册的驱动。

       - /proc/modules:所有加载到内核的模块列表。

       - /proc/mounts:系统中使用的所有挂载。

       - /proc/mtrr:系统使用的Memory Type Range Registers(MTRRs)。

       - /proc/partitions:分区中的块分配信息。

       - /proc/pci:系统中的PCI设备列表。

       - /proc/slabinfo:系统中所有活动的slab缓存信息。

       - /proc/stat:所有CPU活动信息。

       - /proc/sysrq-trigger:使用echo命令写入时,远程root用户可以执行关键系统请求命令。

       - /proc/uptime:系统已经运行了多久。

       - /proc/swaps:交换空间的使用情况。

       - /proc/version:Linux内核版本和gcc版本。

       在/proc目录中,还存在针对特定进程的减源码等于加信息目录,如 /proc/N,这里N代表进程ID。这些目录提供了关于特定进程的详细信息,如启动命令、当前工作目录、环境变量、执行命令文件、文件描述符、内存映射信息等。

       举例来说,要查看/proc目录中的内容,可以使用`ls /proc/`命令。此外,/proc/sys目录包含了系统信息和内核参数,例如,要查看当前配置的文件句柄最大数,可以使用`cat /proc/sys/fs/file-max`命令。改变内核参数可以通过编辑或重定向到文件中完成,例如,使用`echo > /proc/sys/fs/file-max`来增加文件句柄的爱思源码查询最大数目。

盘一盘Linux内核中ns级别的高精度计时方法

       在Linux内核中,尽管系统本身和中断的存在限制了其提供ns级别的高精度计时,常规内核高精度计时器只能勉强达到us级别且误差较大。因此,在需要ns级别精确计时的场景下,需要借助其他方法。以下介绍两种针对不同处理器平台的精确计时方式:x平台和ARM平台。

       ### x平台下的精确计时

       从Pentium开始,x平台引入了时间戳计数器(TSC),这是一个用于记录自上电启动以来CPU执行周期数的位寄存器。在每个时钟信号到来时,TSC自动加一。若CPU主频为2GHz,每条指令执行时间为0.5ns。通过读取TSC的当前值,可以计算出代码执行的时间。具体操作是在代码段的A点和B点分别读取TSC,两值相减并乘以指令周期,即可得到A点和B点间代码执行的耗时。

       ### ARM平台下的精确计时

       对于ARM平台,虽然没有直接提供类似TSC的寄存器,但通过定时计数器实现精确计时是可行的。定时器能够提供计数和计数比较功能,计数频率由系统时钟经过分频决定,且不受系统软件影响,可以实现较高的精度。以MHz计数频率为例,每秒计数次,转换为us级别,每计数一次为ns。通过驱动程序直接访问相关寄存器,可以实现精确的计时功能。

       ### ARM平台的计数器使用

       在ARM架构的芯片上,定时器的使用涉及频率、控制、计数等关键寄存器。通过设置计数器频率控制器(CNTFRQ_EL0)和物理计数器控制寄存器(CNTP_CTL_EL0),可以启用计数器进行精确计时。计数器在使能后开始计数,即使被停止计数,仍会继续计数直到断电。驱动程序通过死循环轮询计数寄存器,可以验证计数器的精度,并实现精确的计时功能。

       ### 性能监控寄存器

       ARM平台还提供性能监控寄存器(Performance Monitors registers),包括性能监控控制寄存器(PMCR_EL0)、计数使能寄存器(PMCNTENSET_EL0)和周期计数寄存器(PMCCNTR_EL0)。这些寄存器主要用于CPU性能监控,但同样提供了计数功能,可以用于精确计时。通过结合性能监控单元(PMU),可以实现高级的性能监控和计时。

       通过上述方法,x和ARM平台在特定场景下能够实现ns级别的精确计时,为开发者提供了灵活的计时解决方案。

Android NDK Tombstone/Crash 分析

       程序员在调试Bug的过程中,访问非法内存是最让人头疼的问题。调试程序Bug通常有三种方法:那么如何调试引发Crash的NDK程序呢?

       幸运的是,Google早已预见到我们编写的NDK代码可能存在缺陷。当NDK程序发生Crash时,会在/data/tombstones/路径下生成记录Crash信息的文件tombstone_xx。同时,Google在NDK包中也提供了一系列调试工具,如addr2line、objdump、ndk-stack。

       在介绍Tombstone之前,我们先补充一下Linux信号机制的相关知识。信号机制是Linux进程间通信的一种重要方式,用于正常的进程间通信和同步,以及监控系统异常及中断。当应用程序运行异常时,Linux内核会产生错误信号并通知当前进程。当前进程在接收到该错误信号后,可以有三种不同的处理方式。

       当Linux应用程序在执行时发生严重错误,一般会导致程序crash。Linux专门提供了一类crash信号,程序接收到此类信号时,缺省操作是将crash的现场信息记录到core文件,然后终止进程。

       什么是Tombstone?Android Native程序本质上就是一个Linux程序,当它在执行时发生严重错误,也会导致程序crash,然后产生一个记录crash的现场信息的文件,在Android系统中就是tombstone文件。

       Tombstone文件位于路径/data/tombstones/下,它记录了死亡进程的基本信息、死亡的地址以及死亡时的现场信息。

       分析出现Crash的原因和代码位置最重要的就是分析这个tombstone文件。tombstone文件主要由以下几部分组成:Build fingerprint、Crashed process and PIDs、Terminated signal and fault address、CPU registers、Call stack、Stack content of each call。

       Crashed process and PIDs信息表示Crash掉进程的基本信息,包括进程号、线程号等。Terminated signal and fault address信息表示程序因为什么信号导致了Crash以及出现错误的地址。Call Stack信息记录了程序在Crash前的函数调用关系以及当前正在执行函数的信息。

       在分析tombstone文件时,我们主要关注Crashed process and PIDs、Terminated signal and fault address和Call stack部分。

       addr2line是NDK中用来获得指定动态链接库文件或者可执行文件中指定地址对应的源代码信息的工具。ndk-stack能自动分析tombstone文件,将崩溃时的调用内存地址和C++代码一行一行对应起来。

       总结来说,Android NDK程序的系统调试并不复杂,只要掌握了正确的方法,了解Tombstone文件中关键信息的含义,学会使用addr2line和ndk_stack这两个超级方便的工具,就可以快速定位到导致NDK程序Crash的Bug。但具体的Bug还需要进一步根据业务逻辑来分析代码。

linux print命令

       å…·ä½“参数及讲解如下:

       print命令的格式是:

        print xxx

        p xxx

       1. print 操作符

        @

        是一个和数组有关的操作符,在后面会有更详细的说明。

        ::

        指定一个在文件或是一个函数中的变量。

        { }

        表示一个指向内存地址的类型为type的一个对象。

       2. 察看内容

       å…¨å±€å˜é‡ï¼ˆæ‰€æœ‰æ–‡ä»¶å¯è§çš„)

        静态全局变量(当前文件可见的)

        局部变量(当前Scope可见的)

        如果你的局部变量和全局变量发生冲突(也就是重名),一般情况下是局部变量会隐藏全局变量。如果此时你想查看全局变量的值时,你可以使用“::”操作符:

        file::variable

        function::variable

       eg:

        查看文件f2.c中的全局变量x的值:

        gdb) p 'f2.c'::x

        注:如果你的程序编译时开启了优化选项,那么在用GDB调试被优化过的程序时,可能会发生某些变量不能访问,或是取值错误码的情况。对付这种情况时,需要在编译程序时关闭编译优化。GCC,你可以使用“-gstabs” 选项来解决这个问题。

       3. 察看数组

        (1)动态数组:

        p *array@len

        array:数组的首地址,len:数据的长度

       eg:

        (gdb) p *array@len

        $1 = { 2, 4, 6, 8, }

        (2)静态数组

        可以直接用print数组名,就可以显示数组中所有数据的内容了。

       4. 输出格式

        x 按十六进制格式显示变量。

        d 按十进制格式显示变量。

        u 按十六进制格式显示无符号整型。

        o 按八进制格式显示变量。

        t 按二进制格式显示变量。

        a 按十六进制格式显示变量。

        c 按字符格式显示变量。

        f 按浮点数格式显示变量。

       eg:

        (gdb) p i

        $ =

        (gdb) p/a i

        $ = 0x

        (gdb) p/c i

        $ = 'e'

       5. 察看内存

        使用examine(简写x)来查看内存地址中的值。语法:

        x/

        n、f、u是可选的参数。

        (1)n 是一个正整数,表示显示内存的长度,也就是说从当前地址向后显示几个地址的内容。

        (2)f 表示显示的格式,参见上面。如果地址所指的是字符串,那么格式可以是s,如果地十是指令地址,那么格式可以是i。

        (3)u 表示从当前地址往后请求的字节数,如果不指定的话,GDB默认是4个bytes。u参数可以用下面的字符来代替,b表示单字节,h表示双字节,w表示四字 节,g表示八字节。当我们指定了字节长度后,GDB会从指内存定的内存地址开始,读写指定字节,并把其当作一个值取出来。

       eg:

        x/3uh 0x :从内存地址0x读取内容,h表示以双字节为一个单位,3表示三个单位,u表示按十六进制显示。

       6. 察看寄存器

       ï¼ˆ1)要查看寄存器的值,很简单,可以使用如下命令:

        info registers

       ï¼ˆ2)查看寄存器的情况。(除了浮点寄存器)

        info all-registers

       ï¼ˆ3)查看所有寄存器的情况。(包括浮点寄存器)

        info registers

       ï¼ˆ4)查看所指定的寄存器的情况。

        寄存器中放置了程序运行时的数据,比如程序当前运行的指令地址(ip),程序的当前堆栈地址(sp)等等。你同样可以使用print命令来访问寄存器的情况,只需要在寄存器名字前加一个$符号就可以了。如:p $eip。

       7. display自动显示的变量

        (1)格式:display[/i|s] [expression | addr]

       eg:

        display/i $pc

       $pc是GDB的环境变量,表示着指令的地址,/i则表示输出格式为机器指令码,也就是汇编。于是当程序停下后,就会出现源代码和机器指令码相对应的情形,这是一个很有意思的功能。

        (2)其他

        undisplay

        delete display

       åˆ é™¤è‡ªåŠ¨æ˜¾ç¤ºï¼Œdnums意为所设置好了的自动显式的编号。如果要同时删除几个,编号可以用空格分隔,如果要删除一个范围内的编号,可以用减号表示(如:2-5)

        disable display

        enable display

        disable和enalbe不删除自动显示的设置,而只是让其失效和恢复。

        info display

       æŸ¥çœ‹display设置的自动显示的信息。GDB会打出一张表格,向你报告当然调试中设置了多少个自动显示设置,其中包括,设置的编号,表达式,是否enable。

       8. 设置

        (1)set print address

        set print address on

       æ‰“开地址输出,当程序显示函数信息时,GDB会显出函数的参数地址。

        (2)set print array

        set print array on

       æ‰“开数组显示,打开后当数组显示时,每个元素占一行,如果不打开的话,每个元素则以逗号分隔。

        (3)set print elements

       è¿™ä¸ªé€‰é¡¹ä¸»è¦æ˜¯è®¾ç½®æ•°ç»„的,如果你的数组太大了,那么就可以指定一个来指定数据显示的最大长度,当到达这个长度时,GDB就不再往下显示了。如果设置为0,则表示不限制。

        (4)set print null-stop

       å¦‚果打开了这个选项,那么当显示字符串时,遇到结束符则停止显示。这个选项默认为off。

        (5)set print pretty on

       å¦‚果打开printf pretty这个选项,那么当GDB显示结构体时会比较漂亮。如:

        $1 = {

        next = 0x0,

        flags = {

        sweet = 1,

        sour = 1

        },

        meat = 0x "Pork"

        }

        (6)set print union

       è®¾ç½®æ˜¾ç¤ºç»“构体时,是否显式其内的联合体数据。

        (7)set print object

       åœ¨C++中,如果一个对象指针指向其派生类,如果打开这个选项,GDB会自动按照虚方法调用的规则显示输出,如果关闭这个选项的话,GDB就不管虚函数表了。

linux位和位的区别

       ç¬¬ä¸€ç‚¹ è®¾è®¡åˆè¡·ä¸åŒï¼š

       ã€€ã€€ä½æ“ä½œç³»ç»Ÿçš„设计初衷是:满足机械设计和分析、三维动画、视频编辑和创作,以及科学计算和高性能计算应用程序等领域中需要大量内存和浮点性能的客户需求。换句简明的话说就是:它们是高科技人员使用本行业特殊软件的运行平台。而位操作系统是为普通用户设计的。

       ã€€ã€€ç¬¬äºŒç‚¹ å¯»å€èƒ½åŠ›ä¸åŒï¼š

       ã€€ã€€ä½å¤„理器的优势还体现在系统对内存的控制上。由于地址使用的是特殊的整数,因此一个ALU(算术逻辑运算器)和寄存器可以处理更大的整数,也就是更大的地址。比如,Windows 

       Vista x Edition支持多达 GB的内存和多达 TB的虚拟内存,而位CPU和操作系统最大只可支持4G内存

       ã€€ã€€ç¬¬ä¸‰ç‚¹ è¦æ±‚配置不同:

       ã€€ã€€ä½æ“ä½œç³»ç»Ÿåªèƒ½å®‰è£…在位电脑上(CPU必须是位的)。同时需要安装位常用软件以发挥位(x)的最佳性能。位操作系统则可以安装在位(位CPU)或位(位CPU)电脑上。当然,位操作系统安装在位电脑上,其硬件恰似“大马拉小车”:位效能就会大打折扣。

       ã€€ã€€ç¬¬å››ç‚¹ è¿ç®—速度不同:

       ã€€ã€€å…³äºŽä½å’Œä½ç³»ç»Ÿçš„差别,那真是说来话长,这里我们首先要了解一下CPU的架构技术,通常我们可以看到在计算机硬件上会有X和X的标识,其实这是两种不同的CPU硬件架构,x代表位操作系统 

       x代表位操作系统。那么这个位和位中的“位”又是什么意思呢?相对于位技术而言,位技术的这个位数指的是CPU 

       GPRs(General-Purpose 

       Registers,通用寄存器)的数据宽度为位,位指令集就是运行位数据的指令,也就是说处理器一次可以运行bit数据。举个通俗易懂但不是特别准确的例子:位的吞吐量是1M,而位吞吐量是2M。即理论上位系统性能比位的提高1倍。

copyright © 2016 powered by 皮皮网   sitemap