首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Linux64程序移植

1 概述 Linux下的程序大多充当服务器的角色,在这种情况下,随着负载量和功能的增加,服务器所使用内存必然也随之增加,然而32系统固有的4GB虚拟地址空间限制,在如今已是非常突出的问题了;另一个需要改进的地方是日期...要获得能在64系统下运行的程序,特别是达到只维护同一套代码就能获得在32及64系统下都能运行的程序,编码时需遵循一定的原则,是一个较为繁琐的过程。...编译器按照自然边界对数据类型进行对齐;换而言之,32的数据类型在64系统上要按照32边界进行对齐,而64的数据类型在64系统上则要按照64边界进行对齐。...2.2 数据对齐 默认情况下,编译器按照自然边界对数据类型进行对齐;换而言之,32的数据类型在64系统上要按照32边界进行对齐,而64的数据类型在64系统上则要按照64边界进行对齐。...test { int i1; 32 32 32填充 double d; 64 64 int i2; 32 32 32填充 long l; 32 64 }; 结构大小为20

4.4K81

Linux64程序中的漏洞利用

所以理解32环境也是有必要的. 不过, 现在毕竟已经是2018年了, 64程序也逐渐成为主流, 尤其是在Linux环境中. 因此本篇就来说说64下的利用与32下的利用和缓解绕过方法有何异同....基础知识 寄存器 我们所说的32和64, 其实就是寄存器的大小. 对于32寄存器大小为32/8=4字节, 那64自然是64/8=8字节了....AX来引用, AL的高8和低8又可以分别通过AH和AL来引用....(低32) ==== AX (低16) == AH (高8) == AL (低8) 调用约定...不过, 在上一篇深入了解GOT,PLT和动态链接 中我们说了, ASLR虽然随机化了部分虚拟地址空间, 不过PLT却不在此列, 其地址依然 是和可执行文件的加载地址相对固定的.

1.2K70
您找到你想要的搜索结果了吗?
是的
没有找到

【Linux 内核 内存管理】虚拟地址空间布局架构 ① ( 虚拟地址空间布局架构 | 用户虚拟地址空间划分 )

文章目录 一、虚拟地址空间布局架构 二、用户虚拟地址空间划分 一、虚拟地址空间布局架构 ---- 在 64 的 Linux 操作系统中 , " ARM64 架构 " 并 不支持 64 虚拟地址..., 最大只支持 48 虚拟地址 , 64 地址太大 , 并不需要那么大的内存空间 ; " ARM64 架构 " 中 , Linux 系统的 " 内核虚拟地址 “ 与 ” 用户虚拟地址 "...是等同的 ; 用户虚拟地址 : 0x 0000 0000 0000 0000 ~ 0x 0000 FFFF FFFF FFFF , 48 有效地址 ; 内核虚拟地址 : 0x FFFF 0000...0000 0000 ~ 0x FFFF FFFF FFFF FFFF , 48 有效地址 ; 二、用户虚拟地址空间划分 ---- Linux 操作系统 进程 的 " 用户虚拟空间 " 起始地址...4.12\arch\arm64\include\asm\memory.h#86 中 , 定义了 TASK_SIZE 与 TASK_SIZE_64 宏 ; VA_BITS 是编译内核时 , 选择的 " 虚拟地址空间

7K20

【Linux】地址空间&&虚拟地址

虚拟地址 1.1 虚拟地址引入 先先来一个测试代码: 1 #include 2 #include 3 #include 4 #include...这个地址在系统层面上称之为虚拟地址。 1.2 虚拟地址理解 每一个进程除了要把代码和数据加载到内存之外,对于当前的操作系统来讲,系统当中会为每一个进程创建一个地址空间。 地址空间在操作系统里面。...在32和64下的地址空间大小是不一样的,为了方便这里使用32来表述。32从低到高一个有4GB的地址空间范围,实际上这个地址空间当中打印出来的地址,是该空间内对应的地址。...修改的只是子进程的物理地址和页表,而地址空间里面的依然是虚拟地址。子进程和父进程的虚拟地址是一样的,只是映射到物理内存到不同区域,所以对应看到的地址是一样的,但内容却不一样。...bitmap[5]:一共140个优先级,一共140个进程队列,为了提高查找非空队列的效率,就可以用5*32个比特表示队列是否为空,这样,便可以大大提高查找效率!

10410

进程的虚拟地址空间

在 Linux 系统中,每一个进程都在自己独立的地址空间中运行,在 32 系统中,每个进程的逻辑地址空间均为 4GB,这 4GB 的内存空间按照 3:1 的比例进行分配,其中用户进程享有 3G 的空间...虚拟地址会通过硬件 MMU(内存管理单元)映射到实际的物理地址空间中,建立虚拟地址到物理地址的映射关系后,对虚拟地址的读写操作实际上就是对物理地址的读写操作,MMU 会将物理地址“翻译”为对应的物理地址...为什么需要引入虚拟地址呢?...针对以上的一些问题,就引入了虚拟地址机制。程序访问存储器所使用的逻辑地址就是虚拟地址,通过逻辑地址映射到真正的物理内存上。...所有应用程序运行在自己的虚拟地址空间中,使得进程的虚拟地址空间和物理地址空间隔离开来,这样做带来了很多的优点: ⚫ 进程与进程、进程与内核相互隔离。

2.4K30

Linux虚拟地址空间布局

这个沙盘就是虚拟地址空间(Virtual Address Space),在32模式下它是一个4GB的内存地址块。...虚拟地址通过页表(Page Table)映射到物理内存,页表由操作系统维护并被处理器引用。内核空间在页表中拥有较高特权级,因此用户态程序试图访问这些页时会导致一个页错误(page fault)。...③空间大小:栈顶地址和栈的最大容量由系统预先规定(通常默认2M或10M);堆的大小则受限于计算机系统中有效的虚拟内存,32Linux系统中堆内存可达2.9G空间。...8 保留区 位于虚拟地址空间的最低部分,未赋予物理地址。任何对它的引用都是非法的,用于捕捉使用空指针和小整型值指针引用内存的异常情况。...在32X86架构的Linux系统中,用户进程可执行程序一般从虚拟地址空间0x08048000开始加载。该加载地址由ELF文件头决定,可通过自定义链接器脚本覆盖链接器默认配置,进而修改加载地址。

3.2K40

【Linux】虚拟地址空间 --- 虚拟地址、空间布局、内存描述符、写时拷贝、页表…

32操作系统下,分配给进程的虚拟地址空间大小为4G。...4GB大小,如果是64操作系统,自然虚拟地址空间大小就是16GB,因为2 ^ 64次方就是2 ^ 32 × 2 ^ 32也就是4GB×4GB=16GB。...只不过磁盘上可执行程序的虚拟地址空间当中没有栈和堆,因为这两个段是在运行的时候才产生的,编址的时候也是在32或64环境下进行编址的,并且这些地址也全部都是虚拟的,这些地址都是在程序内部,也就是在磁盘上...在Visual Studio2022或其他版本编译器中,编译程序有32或者64的选项,那是在干什么呢?那其实就是在进行虚拟地址空间编址的选择呢,你是选择64比特的方式进行虚拟地址空间编址呢?...还是选择32虚拟地址空间编址,一个是4GB一个是16GB,但也没啥用,因为都是虚拟的,仅仅只是空间范围而已。

1.4K20

Linux 进程虚拟地址空间布局

文章目录 1.虚拟地址空间简介 2.虚拟地址空间布局 参考文献 1.虚拟地址空间简介 虚拟地址空间(Virtual Address Space)是每一个程序被加载运行起来后,操作系统为进程分配的虚拟内存...比如 32 的 CPU 决定了虚拟地址空间的大小为 0 - -1,即 0x00000000 - 0xFFFFFFFF,也就是我们常说的 4 GB 虚拟内存空间。...如果是 64 的CPU,那么寻址范围是 0 - -1,即 0x0000000000000000 - 0xFFFFFFFFFFFFFFFF,共有 17 179 864 184 GB。...假设我们使用的是 32 的硬件平台,4GB 的虚拟内存空间可以被用户程序完全占用吗?很显然,不行。...对于 Linux,4GB 的虚拟地址空间的默认分配状态如下: 2.虚拟地址空间布局 C/C++程序为编译链接后生成可执行的二进制文件,由多个段组成,一般包含代码段、数据段和 BSS 段等。

5K50

Liunux内核内存管理之虚拟地址空间

虚拟地址空间 虚拟地址空间是一个非常抽象的概念,先根据字面意思进行解释: 它可以用来加载程序数据(数据可能被加载到物理内存上,空间不够就加载到虚拟内存中) 它对应着一段连续的内存地址,起始位置为 0。...虚拟地址空间的大小也由操作系统决定,32的操作系统虚拟地址空间的大小为 2^32 字节,也就是 4G,64 系统的操作系统虚拟地址空间大小为 2^64 字节,这是一个非常大的数,感兴趣的可以自己计算一下...其实我们讲的每个进程都有4G虚拟地址空间,讲的都是“可以寻址”4G,意思是虚拟地址的0-3G对于一个进程的用户态和内核态来说是可以访问的,而3-4G是只有进程的内核态可以访问的。...其次,所谓“独立拥有的虚拟地址”是指对于每一个进程,都可以访问自己的0-4G的虚拟地址虚拟地址是“虚拟”的,需要转化为“真实”的物理地址。 好比你有你的地址簿,我有我的地址簿。...内核用的896M虚拟地址是直接映射的,意思是只要把虚拟地址减去一个偏移量(3G)就等于物理地址。同样,这里指的还是寻址,实际使用前还是要分配内存。而且896M只是个最大值。

1K20

物理地址和虚拟地址的分布

上一节内容的学习我们知道了CPU是如何访问内存的,CPU拿到内存后就可以向其它人(kernel的其它模块、内核线程、用户空间进程、等等)提供服务,主要包括: 以虚拟地址(VA)的形式,为应用程序提供远大于物理内存的虚拟地址空间...Linux内核空间虚拟地址分布 ? 在 Kernel Image 下面有 16M 的内核空间用于 DMA 操作。...Linux用户空间虚拟地址分布 ? 用户进程的代码区一般从虚拟地址空间的 0x08048000 开始,这是为了便于检查空指针。...Linux物理地址和虚拟地址的关系 ? Linux 将 4G 的线性地址空间分为2部分,0~3G 为 user space,3G~4G 为 kernel space。...到这里我们应该知道了 Linux 是如何用虚拟地址来映射物理地址的,最后我们用一张图来总结一下: ?

2K31

物理地址和虚拟地址的分布

上一节内容的学习我们知道了CPU是如何访问内存的,CPU拿到内存后就可以向其它人(kernel的其它模块、内核线程、用户空间进程、等等)提供服务,主要包括: 以虚拟地址(VA)的形式,为应用程序提供远大于物理内存的虚拟地址空间...Linux内核空间虚拟地址分布 ? 在 Kernel Image 下面有 16M 的内核空间用于 DMA 操作。...Linux用户空间虚拟地址分布 ? 用户进程的代码区一般从虚拟地址空间的 0x08048000 开始,这是为了便于检查空指针。...Linux物理地址和虚拟地址的关系 ? Linux 将 4G 的线性地址空间分为2部分,0~3G 为 user space,3G~4G 为 kernel space。...到这里我们应该知道了 Linux 是如何用虚拟地址来映射物理地址的,最后我们用一张图来总结一下: ?

2K111

【操作系统复习】物理地址虚拟地址

【操作系统复习】 物理地址虚拟地址 物理地址和虚拟地址的区别 物理地址 逻辑地址 线性地址 为什么要分成物理地址和虚拟地址 物理内存及虚拟内存定义 为什么要有虚拟内存 虚拟内存的实现(可以在页式或段式内存管理的基础上实现...(我回答虚拟地址就是逻辑地址。。)...虚拟地址转换为物理地址的过程 快表是存储在哪里的 物理地址和虚拟地址的区别 操作系统有物理地址、逻辑地址、线性地址(也叫虚拟地址)三种地址 物理地址 在存储器里以字节为单位存储信息,为正确地存放或取得信息...逻辑地址由两个16的地址分量构成,一个为段基值,另一个为偏移量。两个分量均为无符号数编码。 线性地址 线性地址(Linear Address)是逻辑地址到物理地址变换之间的中间层。...当采用4KB分页大小的时候,线性地址的高10为页目录项在页目录表中的编号,中间10为页表中的页号,其低12则为偏移地址。如果是使用4MB分页机制,则高10页号,低22为偏移地址。

2K20

LONG究竟有多长,从皇帝的新衣到海康SDK

Linux64使用的是LP64(4/8/8)模型,int是32,long和指针都是64。 注意了,睁大眼睛,到关键之处了。...那么这个Linux64 SDK版本的函数中出现了LONG,到底是用的微软的long还是Linux的long呢?按道理,既然是Linux64的版本,就该遵循Linux64的规则,long是64的。...老雷也怕冤枉了人家,特意反复确认,特别从Linux64 SDK的consoleDemo/include找到官方演示程序使用的头文件,截图如下: ? 这下相信了吧?...不得不说,如此暴力地在Linux64下把LONG定义为int是非常错误的一个决定,是非常不负责任的,有很多危害。不仅会导致大家认知的混乱,而且会导致源代码的冲突。...因为老雷代码中的LONG是按LINUX64的约定是64的,在Linux64下,LONG就定义为long(注意大小写差别)。

1.2K50

操作

或者可以使用称为“串”的概念,它可以定义为序列,首先呈现最低有效串允许您以非常有效的方式存储此类数据,无论是在存储空间还是处理速度方面。串可以以两种方式之一存储,作为压缩字符串或整数。...如果在没有上下文的情况下听到术语“串”,则表示序列存储为压缩字符串。本文向介绍了这两种类型的串,然后介绍了一些可用于操作它们的技术。...将序列存储为串存储位序列的最常见方式是在位串中,这是一种特殊的压缩字符串。除了节省存储空间外,还可以使用 ObjectScript 系统函数有效地操作串。...串中的 1表示 2^0, 2 表示 2^1,依此类推。将所有加在一起,我们得到 2^5 +2^6 + 2^7+ 2^8 + 2^10 + 2^11 + 2^13 = 11744。...如果它有助于将串视为一个字符串,可以将每个块视为一个 8 字符。串的一个常见应用是位图索引的存储。位图索引是一种特殊类型的索引,它使用一系列位串来表示对应于特定属性的给定值的对象集。

1.5K20

【Linux 内核 内存管理】虚拟地址空间布局架构 ⑤ ( Linux 内核中对 “ 虚拟地址空间 “ 的描述 | task_struct 结构体源码 )

文章目录 一、Linux 内核中对 " 虚拟地址空间 " 的描述 二、task_struct 结构体源码 一、Linux 内核中对 " 虚拟地址空间 " 的描述 ---- 进程 的 " 虚拟地址空间 "...由 mm_struct 和 vm_area_struct 两个数据结构描述 ; mm_struct 是 “最高层次 " 上描述 ” 整个虚拟地址空间 “ 的结构体 ; 该结构是对 ” 整个 “ ” 用户空间..." 进行描述 ; vm_area_struct 是 " 较高层次 " 上的描述 " 虚拟地址空间 " 的区间 的 ; 每个进程只有 1 个 mm_struct 结构体数据 , 用于描述 整个 "...虚拟地址空间 " ; 则 对应的 " 进程描述符 task_struct " 中 , 有 1 个指针指向 mm_struct 结构体 ; task_struct -> mm_struct -> vm_area_struct

3.6K20
领券