地址

高手之路-- 明白计算机底层! 为了更好地精通C++ ,否则你指针永远也用不好!!必须知道的概念!

老子叫甜甜 提交于 2020-03-03 08:31:13
首先看一下这堆代码, 我先证明 release 跟Debug 编译出来的 反汇编是一样的, 否则那无法进一步 推测了! 以上呢 通过 2种编译 ,结果 居然 release 更慢, 这说明 这代码已经无法 优化了. 以下,让你学习如何看懂 内存, 跟 EBP ,指针对应的 写入堆栈 跟 写入 内存是一样的概念, 只是 相对于 EBP 栈底 地址而言。 你看以下 是 第二次运行的内存 , 你会发现 不可读, 为啥不可读呢,就是因为程序每次运行 基地址都是动态分配的。 那么 以为着, EBP 地址 也是 根据 基址 + 偏移 得到的。 进程需要 通过调用 winAPI的方式 来 实现 向 操作系统申请 更多 内存地址 空间。 你才能 写入更多的内存地址。 这次运行 EBP 地址 变成了 4EEF40 ,然后我们定位到 4EEF40 地址 就能看到 CPU是怎么直接写入 内存地址的. 直接输入 0x 004EEF40 就能定位了, 然后滚轮,往上滚一点点, 你就能看到 ,各种 变量,都会在堆栈底部 网上的位置 存放的。 滚上去,一看 发现很多 0x000000 的 就是 初始化 堆栈的痕迹 ! 瞬间就明白这就是 堆栈的内部! 然后 这里 inc dword ptr [ebp-60h] 就是 ebp-60h 这个地址 ,的数据 自增 1 那么ebp对应的地址是什么呢? 然后 按调试,

虚拟地址和物理地址及其映射

你离开我真会死。 提交于 2020-03-02 17:42:41
前一段时间在面试总监的时候,总监问了我这样的一个问题:你个我说说物理内存和虚拟内存到底是怎么一回事? 其实之前我看过这个问题,据我理解的,当时是这么回答的“进程在运行的时候,操作系统都为其分配一个4GB的地址空间,即所谓的虚拟地址空间,一般情况下,当我们的程序很大的时候,实际的物理内存根本不能满足我们的需求的时候,这个时候操作系统就会借助磁盘空间来做虚拟的内存空间,把当前进程不需要的数据放在磁盘上,等到用到的时候,在利用调度算法把所需要的数据从磁盘空间上调度到内存,虚拟内存就是为了扩大内存的容量,每当我们要运行一个程序的时候经过编译以后形成的仅仅是逻辑上的空间,根本不是可以直接运行的内存空间,所以它还存在一个地址映射的概念。”当时感觉回答的很是笼统,只见总监在最后说了一句,你下去还是把这一块的内容在好好看看,所以今天就好好的把这个概念理一理。 首先我从最基本的概念说起,什么是物理内存的概念,虚拟内存的概念? 物理内存,在应用中,自然是顾名思义,物理上,真实的插在板子上的内存是多大就是多大了。而在CPU中的概念,物理内存就是CPU的地址线可以直接进行寻址的内存空间大小。比如8086只有20根地址线,那么它的寻址空间就是1MB,我们就说8086能支持1MB的物理内存,及时我们安装了128M的内存条在板子上,我们也只能说8086拥有1MB的物理内存空间

ARP协议

筅森魡賤 提交于 2020-03-02 10:30:58
ARP协议(同一网段) 一:查看arp表 当主机A要与主机B通信时,需要主机B的MAC地址,以便在数据链路层进行数据封装,此时会查询自己主机内的arp表中有没有和主机B的IP:10.1.1.2/24相对应的MAC地址,如果没有,此时需要用arp协议来获取目标主机的MAC地址。 二:发送ARP请求包(是否执行看第一步骤) 此时主机A发送一个帧(arp请求包同时也是一个广播包): 帧头中目的MAC地址为全F的广播地址,源MAC为主机A的MAC。 ARP部分(为一个请求包 ):目的IP为主机B的IP地址 源IP为主机A的IP地址 由于目的MAC不知道所以为全0的MAC地址 源MAC为主机A的MAC地址 三:发送过程(交换机) 交换机接收到ARP请求包,解封装看到帧头的目的MAC为全F的广播MAC,中所以向所有与之相连的网络设备转发该包(主机B和主机C)并且将主机A的MAC记录到交换机的ARP缓存表,主机B解封装发现目的IP不是主机B的IP,所以将该包丢弃。主机C比较自己的IP地址和ARP请求报文中的目标IP地址,当两者相同时将ARP请求报文中的发送端(即主机A)的IP地址和MAC地址存入自己的ARP表中。之后以单播方式发送ARP响应报文给主机A,其中包含了自己的MAC地址。 四:ARP响应 主机C接收到来自主机A的ARP请求包后

计算机网络基础第四章要点

北城余情 提交于 2020-03-02 05:58:08
路由选择协议-----OSI第三层 一、协议 协议:计算机通信网络中两台计算机之间进行通信所必须共同遵守的规定或规则。 1、无连接协议和面向连接的协议 在面向连接的方法中,网络负责顺序发送报文分组并且以一种可靠的方法检测丢失和冲突。这种方法被“可靠的”传输服务使用。 在无连接的方法中,网络只需要将报文分组发送到接收点,检错与流控由发送方和接收方处理。这种方法被称作“最佳工作(best-effort)”或“无应答(unacknowledged)”的传输协议所使用。 2、TCP/IP协议 TCP/IP由四个层次组成: 网络接口层 、 互联网层 、 传输层 、 应用层 。 工作在应用层的协议:Telnet、FTP、HTTP、SMTP、DHCP、TFTP、DNS、SNMP等 工作在传输层的协议:TCP、UDP等 工作在网络层的协议:ICMP、ARP、RARP、IP等 其中TCP(Transmission Control Protocol)叫做传输控制协议、UDP(User Datagram Protocol)叫做用户数据报协议、 ICMP(Internet Control Message Protocol)叫做网际控制报文协议。 Internet协议(IP)是一个无连接的数据报协议,速度虽快却不可靠。 ping命令利用的就是ICMP协议。 ARP地址解析协议用将逻辑地址(IP

IOS-第三方开源库

妖精的绣舞 提交于 2020-03-02 04:24:53
我找的琐碎框架 1.HZExtend:应用快速开发架构集合了MVC和MVVM的特点https://github.com/GeniusBrother/HZExtend : 1.减少控制器压力以及耦合 2.带有请求状态(请求中,请求后,无网络)的网络框架 3.无网仍有数据的缓存体系 4.与表映射能操作数据库的Model 5.支持URL跳转 2.HZURLManager:根据URL进行页面跳转:https://github.com/GeniusBrother/HZURLManager 3.HZMenuView:仿今日头条的侧边栏,以UINavigationController为容器,且导航页面时不关闭的侧边栏:https://github.com/GeniusBrother/HZMenuView 牛逼框架 1.AFNetworking   目前比较推荐的iOS网络请求组件,默认网络请求是异步,通过block回调的方式对返回数据进行处理。 2.FMDB   对sqlite数据库操作进行了封装,demo也比较简单。 3.MBProgressHUD   也是iOS项目常用的一个组件,用于显示过渡效果的,比如网络请求之前显示loading,网络结束隐藏loading。建议封装在BaseViewController中,所有ViewController继承就能使用。 4.MJRefresh  

二维数组作为函数的参数

别来无恙 提交于 2020-03-02 04:23:14
*二维数组作为形参时,必须写明数组有多少列: void PrintArray(int a[][5]) *必须写明 列数 编译器才能根据下标算出元素的地址 a[i][j]的地址: 数组首地址+i乘N乘sizeof(a[0][0])+j乘sizeof(a[0][0]) (N是数组列数)形参数组的首地址就是实参数组的首地址 样例代码1. # include <stdio.h> void print ( int a [ ] [ 3 ] ) ; int main ( ) { int a [ 2 ] [ 3 ] = { 1 , 2 , 3 , 4 , 5 , 6 } ; print ( a ) ; return 0 ; } void print ( int a [ ] [ 3 ] ) { printf ( "%d\n" , a [ 0 ] [ 0 ] ) ; } 样例代码2. # include <stdio.h> void print ( int array [ ] , int len ) ; void funct ( int a [ ] [ 10 ] ) ; int main ( ) { int b [ 4 ] [ 10 ] ; for ( int i = 0 ; i < 4 ; i ++ ) for ( int j = 0 ; j < 10 ; j ++ ) scanf ( "%d" ,

修改虚拟网卡MAC地址需注意事项

我是研究僧i 提交于 2020-03-01 20:22:57
修改MAC地址的第二个数只能是2 、6、A、E中的一个,否则修改就不会起作用 MAC地址一共6个字节,分成两段。前三个字节叫作OUI,用于标记网卡设备的生产商,后三个字节由生产商自行决定,OUI与生产厂商的对应关系需要网络设备生产商向IEEE的一个专门组织IEEE Registeration Authority购买和注册,并有这个组织统一管理。 而在OUI中,有两个位是有特殊含义的,即第一个字节的最低两位。其中最低位表示MAC地址是单播地址还是多播地址,次低位表示是否由IEEE Registeration Authority统一发放。由该组织统一管理和发放的MAC地址,能够保证在全球范围内是唯一的,另外如果不是由IEEE统一管理的那部分MAC地址,作用就像局域网IP一样,需要用户自行分配并保证在网络中是唯一的。 所以自行修改的MAC地址,第二个十六进制位(第一字节的低四位),最低位是0,次低位是1(表示不是由IEEE统一管理发放的MAC地址),剩下两个任意,所以是: 0010 - 2 0110 - 6 1010 - A 1110 - E 来源: CSDN 作者: Jarsionge_Chen 链接: https://blog.csdn.net/Jarsionge_Chen/article/details/104572840

armv8虚拟内存架构简述

倾然丶 夕夏残阳落幕 提交于 2020-03-01 19:08:58
粗略看了一下armv8的虚拟内存的文档。记录一下,细节留待以后用到时再去细究。 程序在运行的时候使用的内存一般是虚拟内存,需要经过转换才能接触到物理内存。其中的底层支持就是硬件架构,现代架构都是支持硬件虚拟内存转换的,一般就是说提供MMU。armv8架构作为现代架构也不例外,但是不太一样的是armv8架构支持两级转换:stage 1 和stage 2. 上图包含了安全世界和非安全世界的东西,由于安全世界的东西过于复杂(主要是我也不懂),下面我们就忽略掉安全世界的东西。从上图的第四条:VA->IPA->PA.很明显,VA到PA可以最多经过两次转换,当然每个stage都是可以取消的,比如只有stage1 或只有stage2. 为什么需要两级转换呢?这是为支持虚拟化而设置的,对于虚拟机内的程序一般需要经过两级转换才能访问到主机的物理地址。所以一般地可以认为,对于主机上跑的应用程序只需要一级转换,而在虚拟机中的程序要经过两级转换。那怎样控制这些内存转换机制呢? 控制虚拟内存转换的接口就是一系列寄存器,主要有:SCTLR_EL1,TCR_EL1, TCR_EL2, HCR_EL2,TTBR0_EL1, TTBR1_EL1, VTTBR_EL2。下面分别介绍一下。 SCTLR_EL1:顶级系统控制寄存器,其中Mbit控制MMU 对EL0和EL1的stage 1的使能,一旦置位1

C处理不定参数(va_start)

隐身守侯 提交于 2020-03-01 15:55:47
在#include<stdarg.h>头里包含了四个宏 #define _INTSIZEOF(n) ((sizeof(n)+sizeof(int)-1)&~(sizeof(int) - 1) ) #define va_start(ap,v) ( ap = (va_list)&v + _INTSIZEOF(v) ) //第一个可选参数地址 #define va_arg(ap,t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) ) //下一个参数地址 #define va_end(ap) ( ap = (va_list)0 ) 函数实现的原理: 首先:进程中的堆栈地址是从高到底分配的,那么执行一个函数的过程: 先把参数地址入栈,接着是函数返回值地址入栈,接着入栈函数的执行代码。这个过程中地址不断递减(一些黑客就在这个过程中加入自己的代码执行) 最后一个参数地址 (最高地址) 倒数第二个参数地址 (次之) 。。 第一个参数 (参数列表最低地址) 函数返回值 函数执行代码 例子: void arg_test(int i, ...) { int j=0; va_list arg_ptr; va_start(arg_ptr, i); printf("&i = %p\n", &i);//打印参数i在 堆栈 中的地址 printf("arg_ptr

idea 项目git仓库地址变更

不问归期 提交于 2020-03-01 15:06:24
idea 项目git仓库地址变更 idea 方案 git 命令方案 修改.Git文件夹下的 config 文件 idea 方案 VCS》Git》Remotes 选中项目,编辑地址保存即可 git 命令方案 查看远程库的名字 git remote 查看远程库:别名、地址 git remote -v 修改远程库地址 git remote set-url 远程仓库名 远程地址 添加远程库地址 git remote add 远程仓库名 远程地址 修改.Git文件夹下的 config 文件 修改 url 即可 [ core ] repositoryformatversion = 0 filemode = false bare = false logallrefupdates = true symlinks = false ignorecase = true [ remote "origin" ] url = git@110.120.119.256:xxx/yyy.git fetch = +refs/heads/*:refs/remotes/origin/* [ branch "master" ] remote = origin merge = refs/heads/master 来源: CSDN 作者: 笑虾 链接: https://blog.csdn.net/jx520/article