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

浅谈text、data和bss

一般情况,一个程序本质上都是由 bss、data、text三个组成——这是计算机程序设计中重要的基本概念。...bss 部分将会清零(bss属于静态内存分配,即程序一开始就将其清零了)。...比如,在C语言程序编译完成之后,已初始化的全局变量保存在.data 中,未初始化的全局变量保存在.bss 中。 text: 用于存放程序代码的区域, 编译时确定, 只读。...区别很明显,程序1位于bss,程序2位于data,两者的区别在于: 全局的未初始化变量存在于bss中,具体体现为一个占位符,全局的已初始化变量存于data中,而函数内的自动变量都在栈上分配空间。...BSS的大小从可执行文件中得到,然后链接器得到这个大小的内存块,紧跟在数据后面。当这个内存区进入程序的地址空间后全部清零,包含data和bss的整个区段此时通常称为数据区。

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

保护模式-第4讲--跨越权限

目录 保护模式-第4讲--跨越权限 一丶描述符 选择子 等特权级讲解 1.1 CPU层面的模式 1.2 CPL RPL DPL 讲解 1.2.1 CPL RPL DPL 介绍 1.2.2 CPL...-第4讲--跨越权限 一丶描述符 选择子 等特权级讲解 1.1 CPU层面的模式 ​ 这一点主要是了解下....一致代码与非一致代码的介绍 一致代码: 可以理解为是共享.数据是共享的.可以允许低权限去访问 非一直代码: 如果不想让低权限访问.想对这一块加限制.那么可以用非一致代码修饰 修饰的本质还是...其实本质还是 构造选择子. 选择子指向一个你自己定义的描述符....描述符里面可以设置权限等. 1.从GDT表中寻找代码 ​ 这个简单.根据描述符.来找 我们上一篇已经说过了. s = 1 代表是代码或者是数据.

1.1K30

错误?打的就是错误!!

呵,错误?自从我看了这篇文章,我还会怕你个小小段错误? 请打开你的Linux终端,跟紧咯,准备发车!!...嘟嘟嘟哒~~ ①一错误的代码 #include void errfunc() { int *p = NULL; *p = 1; } int main() {...errfunc(); return 0; } 这段代码拿去运行,肯定错误。...③看我对症下药 错误的原因无非是内存越界,据不完全统计,主要有以下这些情况: 1 使用非法的内存地址(指针),包括使用未经初始化及已经释放的指针、不存在的地址、受系统保护的地址,只读的地址等,这一类也是最常见和最好解决的错误问题...这类问题也是为什么我的程序在其他平台跑得好好的,为什么一移植到这个平台就错误了。

3.5K20

轻松带你解决c语言堆、栈、数据、代码、bss的疑惑

后面的数据、代码、bss,可能你平时没有怎么细心总结,现在你可能还真讲不出他们的区别来,不信的话,读者在看到这里可以先暂定一下,在自己以往写了那么多的代码,仔细回忆看看他们有啥区别,如果不知道也没关系...\n", p2); return 0;   } 输出结果: 三、代码、数据、bss: 编译器在编译程序的时候,将程序中的所有的元素分成了一些组成部分,各部分构成一个,所以说是可执行程序的组成部分...1、什么是代码?        代码就是程序中的可执行部分,直观理解代码就是函数堆叠组成的(就是函数体里面的程序那部分)。 2、什么是数据?      ...3、什么是bss?      (它又叫ZI(zero initial)):bss的特点就是被初始化为0,bss本质上也是属于数据,bss就是被初始化为0的数据。...注意:       数据(.data)和bss的区别和联系:二者本来没有本质区别,都是用来存放C程序中的全局变量的。

1.1K20

8086汇编语言之数据和代码以及栈的理解

数据DS+偏移地址BX 数据可以通俗理解为数据容器指针 比如: MOV AX 0220H MOV DS AX MOV BX 0 MOV AX [BX] ;我们发现 DS数据一直都是在给不同地址的容器赋值...代码CS+偏移地址IP 代码可以通俗理解为汇编代码指针 比如: 代码从 MOV AX 0220H 开始,那么代码指向这行代码地址, 如果想要跳过这行代码的执行,那么进行代码偏移 在通过debug...DS=13DB ES=13DB SS=13EB CS=13EB IP=0000 -u 13eb:0 13BE:0000 B8FFFF MOV AX,FFFF 栈SS+偏移地址SP 栈可以通俗理解为栈指针...什么是 首先内存并没有分段,的划分来自CPU,来自我们自己对内存的操作。...*16+0x00FA 0xFFFFA=0xFF000*16+0x0FFA 0xFFFFA=0xF0000*16+0xFFFA 的赋值 代码CS 数据DS 栈SS 不能直接赋值, 必须通过通用寄存器中转赋值

2.1K30

c程序-C语言 位运算:位

我们现在要学的是位运算里面的位。   那么什么是位呢?下面的截图就是位的解释和一个例子。   ...我们写了一个struckc程序,然后在里面写了一个正常的结构,都是有一个细微的区别,   那就是我们在他的后面加上了:数值,那么这代表什么呢?   ...可以直接用位的成员名称来访问   比移位、与、或还方便   编译器会安排其中的位的排列,不具有可移植性   当所需的位超过一个int时会采用多个int   所以说我们的位就是运用于比较底层的位置,和直接操作硬件的场合...我们可以做一个函数库,我们先定义一些函数c程序,也就是上面的这些,   当然所有的都是array开头,   create:表示的是创建一个数组,   free:表示的是我们会把那一个数组的空间回收。

97620

、索引上的LOGGING与NOLOGGING

--==================================== -- 表、索引上的LOGGING与NOLOGGING --===============================...===== 在有些情况下,对于表和索引可以采用记录日志的模式,也可以使用不记录日志的模式。...如在对表、索引使用数据泵导入时,可以 使用NOLOGGING模式,而使用DATA GUARD或对可用性较高的场景中需要记录日志,甚至使用强制记录日志。...本文介绍了在表,索引使用 LOGGING与NOLOGGING时产生redo的大小以及DIRECT INSERT APPEND 的使用方法。...一、表,索引上使用一般DDL,DML时,LOGGING与NOLOGGING情况 1.查看数据库的归档模式 有关设置日志归档模式的问题,请参考: Oracle 联机重做日志文件(ONLINE

1.5K20

ElasticSearch 合并

由于自动刷新过程每秒会创建一个新的,这样会导致短时间内段数量暴增。段数目太多会带来比较大的麻烦。每一个都会消耗文件句柄、内存和 CPU 运行周期。更重要的是,每个搜索请求都必须按顺序检查每个。...所以越多,搜索也就越慢。 Elasticsearch 通过在后台进行 合并 来解决这个问题。小的被合并成大的,然后这些大的会被合并成更大的。...合并的时候将那些被标记为删除的旧文档从文件系统中删除。被标记删除的文档或者更新文档的旧版本文档不会被拷贝到新的更大的中。 合并不需要你做什么,在索引和搜索时会自动发生。...该过程的工作原理如下图所示,两个提交过的和一个未提交的被合并到更大的中: ? 在索引时,刷新 refresh 进程会创建新的并开放供搜索。...写入一个新的提交点,其中包含新的,并排除旧的较小段。 新的开放供搜索。 旧被删除。 合并大的需要消耗大量的I/O和CPU资源,如果任其发展会影响搜索性能。

1.5K40

保护模式 2讲 - -寄存器结构

保护模式 - -寄存器结构 一丶保护模式学习 保护模式,主要学习的就是 与 页 的关系. 学习的时候先学习寄存器 何为 根据Intel 手册第三卷所属....出了FS寄存器.还有 ES CS SS DS GS LDTR TR等寄存器 我们上面所说的 .base 其实是寄存器的一个成员....可以理解为寄存器就是一个结构体 PS: 在inter手册中也称为寄存器为描述符 2.2 寄存器结构 在我们x86平台下.我们知道一个寄存器是 4个字节. 32位. 可以表达一个32位的数据....但是我们的 却很少有人关注 其实我们的 是有96位的.是一个结构体....依靠寄存器结构所知. 出了CS 不能写之外.其余都是可以写的. 那么看一下内敛汇编代码.

1.4K20

网页字体排版的哲学:首缩排或间距

分段样式 本节主要探讨分段的两种排版样式:首缩排与间距。 现状概述 为什么先说这个呢?因为这似乎是网页上字体排版的空白区,很多网站的分段的排版样式都是间距 + 首缩排,不忍直视。...排版样式 要将段落分离开来,有两种合理的排版样式:首缩排与间距。两种样式的区别: 首缩排,首缩进两字符,间距等于行间距。 间距式,首不进行缩进,间距大于行间距。...当网页快速滚动时,就使段落上下相连的首缩排显得繁密易懵,而段落上下间隔的间距则显得结构简明。在这个快速滚动的互联网时代,间距也就比首缩排更适合于网页,因为它更利于快速传达信息。...3)如果是诗歌,建议间距排版,理由见上文。 注意:千万不要同时用首缩排和间距!...接下来就是间距与首缩排的技术细节。

1.6K10

如何读取Linux进程中的代码和数据

Linux下的程序的文件格式是ELF,里面分了各种,有代码、数据、等。当运行这个程序时,系统也会给这个进程创建虚拟内存,然后把ELF中的数据分别加载到内存中的对应位置。...本文整理了用cpp程序读取内存中的代码和rodata数据的方法。...这个文件的前三列分别是代码、rodata数据、和普通数据,可以看到代码的权限是读和执行,rodata数据是只读,普通数据可读写。...用程序读取内存的代码和rodata数据 以tcpdump程序为例,用程序读取代码和radata的过程如下: 1.查看tcpdump的进程ID。...2.运行自己写的程序,分别输入进程PID和代码的地址。

3.4K20

的说明

1.什么是位? 位的声明和结构是类似的,有两个不同: 1.位的成员必须是 int、unsigned int 或signed int 。...位涉及很多不确定因素,位是不跨平台的,注重可移植的程序应该避免使用位。 3.位的跨平台问题 1. int 位被当成有符号数还是无符号数是不确定的。 2....位中最大位的数目不能确定。(16位机器最大16,32位机器最大32,写成27,在16位机 器会出问题。 3. 位中的成员在内存中从左向右分配,还是从右向左分配标准尚未定义。...当一个结构包含两个位,第二个位成员比较大,无法容纳于第一个位剩余的位时,是 舍弃剩余的位还是利用,这是不确定的。...跟结构相比,位可以达到同样的效果,但是可以很好的节省空间,但是有跨平台的问题存在。

7910

Linux从头学03:如何告诉 CPU,代码、数据、栈在内存中什么位置?

几个重要的寄存器 在 x86 系统中,寻址机制以及相关的寄存器是如此的重要,以至于我忍不住在这里,把几个寄存器再小结一下。 ?...代码:用来存放代码,的基地址放在寄存器 CS 中,指令指针寄存器 IP 用来表示下一条指令在中的偏移地址; 数据:用来存放程序处理的数据,的基地址存放在寄存器 DS 中。...虽然这张图中描述的结构更复杂,但是从本质上来说,它与 8086 中描述的结构是一样的!...这张图的意思是:在 Linux 2.6 中,用户代码的开始地址是 0,最大范围是 4 GB;用户数据的开始地址是 0,最大范围也是 4 GB;内核的数据和代码也是如此。 ?...在这个最简单的汇编程序中,会使用到 3 个:代码,数据和栈。 前面已经说到:所谓的,就是一个地址空间。既然是一个地址空间,必然包含 2 个元素:从什么地方开始,长度是多少。

2.1K40
领券