精华内容
下载资源
问答
  • city_map{articles[1]:articles[0] for articles in articles} 请大神解释一下这段代码表示看不懂。
  • 段代码中的下划线,是什么意思?>>呢?![图片](https://img-ask.csdn.net/upload/201603/28/1459166459_365039.png)
  • int MessageBoxA( MessageBoxExA{ MBToWCSEx() MBToWCSEx() MessageBoxExW() HeapFree() } );
  • 段代码是集合set调用iterator方法,然后赋值给Iterator这个接口的对象 至于为什么这样做,原因是set中的元素在内存中存放的时候并不连续,而Iterator就像是指针一样,next()就能找到它的下一个元素。 ...

    这段代码是集合set调用iterator方法,然后赋值给Iterator这个接口的对象

    至于为什么这样做,原因是set中的元素在内存中存放的时候并不连续,而Iterator就像是指针一样,next()就能找到它的下一个元素。

    展开全文
  • if (Request.Params["testKey"] != null) { Response.Write(Request.Params["testKey"]); }
  • 求大神告诉我这段代码里的等号后边第一个where 是什么意思?第二个where是什么意思?还有sx为什么后边还要写个+ ``` public List<GongWenLeiBie> getList(int sx) { String where=""; if(sx!=0) { where=where...
  • ![图片说明](https://img-ask.csdn.net/upload/201509/12/1442037569_766402.png) mcontext在代码中有什么作用,不太懂Context类,求指教!
  • 一致代码段和非一致代码段

    万次阅读 多人点赞 2009-09-26 13:56:00
    之所以出现这个定义是因为系统要安全:内核要和用户程序分开..内核一定要安全.不能被用户程序干涉....其中CPL是存寄存器如CS中,RPL是代码中根据不同跳转而确定,以动态刷新CS里的CPL.DPL是在GDT/LDT描述符表中,

    之所以出现这个定义是因为系统要安全:内核要和用户程序分开..内核一定要安全.不能被用户程序干涉.
    但是有时候用户程序也需要读取内核的某些数据,怎么办呢?
    操作系统就引入了访问特权等级(0-3)的机制.

    这些特权等级,通过三个符号来体现CPL/DPL/RPL.

    其中

    CPL是存寄存器如CS中,

    RPL是代码中根据不同段跳转而确定,以动态刷新CS里的CPL.

    DPL是在GDT/LDT描述符表中,静态的。

     

     

    1.在x86中的数据和代码是按段来存放的:[section],GTL/LDT里的每个段描述符被设置有不同的特权级DPL.
    2.程序是通过选择子/门调用等等来在段之间来回走动的.实现用户级与系统级的调用跳转.
    3.与GDT里的段描述符一样,CPU寄存器内的每一个选择子/门调用选择子是有分等级的:这个是在选择符的结构中:RPL(最后2位)

     

    调用的选择符和被调用的段都分了等级.那么这些等级在调用时按什么规则实现跳转呢?

     

    先来看看段描述符的相关定义.

     

    段描述符总共有八字节,其中表示段属性的第五字节各位含义:

    7  6 5  4  3...0

    P  DPL S  TYPE

     

    其中

    P:为Persent存在位

    1 表示段在内存中存在

    0表示段在内存中不存在

     

    DPL

    Decsriptor Privilege level

    段特权级.0-3

     

    S

    表示描述符的类型

    1 数据段和代码段描述符

    0 系统段描述符和门描述符 

     

    当 S=1 时TYPE中的4个二进制位情况:
         3       2       1       0
       执行位 一致位 读写位 访问位

    执行位:置1时表示可执行,置0时表示不可执行;
    一致位:置1时表示一致码段,置0时表示非一致码段;
    读写位:置1时表示可读可写,置0时表示只读;
    访问位:置1时表示已访问,置0时表示未访问。

    所以一致代码段和非一致代码段的意思就是指这个一致位是否置1,置1就是一致代码段,置0就为非一致代码段。

     

     

    一致代码段:

     简单理解,就是操作系统拿出来被共享的代码段,可以被低特权级的用户直接调用访问的代码.

    通常这些共享代码,是"不访问"受保护的资源和某些类型异常处理。比如一些数学计算函数库,为纯粹的数学运算计算,

    被作为一致代码段.

     

    一致代码段的限制作用

    1.特权级高的程序不允许访问特权级低的数据:核心态不允许调用用户态的数据.
    2.特权级低的程序可以访问到特权级高的数据.但是特权级不会改变:用户态还是用户态.

     

    非一致代码段:

    为了避免低特权级的访问而被操作系统保护起来的系统代码.

    非一致代码段的限制作用

    1.只允许同级间访问.
    2.绝对禁止不同级访问:核心态不用用户态.用户态也不使用核心态.

     

    通常低特权代码必须通过"门"来实现对高特权代码的访问和调用.

     

     

    不同级别代码段之间转移规则,是通过CPL/RPL/DPL来校验.

    如下先来理解这几个概念:

    特权级
    ------------------------------------------------------------------------------------------

    CPL是当前进程的权限级别(Current Privilege Level),是当前正在执行的代码所在的段的特权级,存在于cs寄存器的低两位。 (个人认为可以看成是段描述符未加载入CS前,该段的DPL,加载入CS后就存入CS的低两位,所以叫做CPL,其值就等于原段DPL的值)

    RPL说明的是进程对段访问的请求权限(Request Privilege Level),是对于段选择子而言的,每个段选择子有自己的RPL,它说明的是进程对段访问的请求权限,有点像函数参数。而且RPL对每个段来说不是固定的,两次访问同一段时的RPL可以不同。RPL可能会削弱CPL的作用,例如当前CPL=0的进程要访问一个数据段,它把段选择符中的RPL设为3,这样虽然它对该段仍然只有特权为3的访问权限。 (个人认为是以CPL来访问段DPL所出示的“证件(RPL)”,如出示的“证件”权级范围在CPL之内且满足DPL的特权检查规则:DPL >= max{CPL,RPL},就能正常通过DPL;反之则不会通过还会发生错误)

     

     DPL存储在段描述符中,规定访问该段的权限级别(Descriptor Privilege Level),每个段的DPL固定。当进程访问一个段时,需要进程特权级检查,一般要求DPL >= max {CPL, RPL}

       下面打一个比方,中国官员分为6级国家主席1、总理2、省长3、市长4、县长5、乡长6,假设我是当前进程,级别总理(CPL=2),我去南城市(DPL=4)考察,用省长的级别(RPL=3 这样也能吓死他们:-))去访问,可以吧,如果用县长的级别,人家就不理咱了(你看看电视上的微服私访).

    为什么采用RPL,是考虑到安全的问题,就好像你明明对一个文件用有写权限,为什么用只读打开它呢,还不是为了安全!

     

    ------------------------------------------------------------------------------------------

    代码间跳转
    ------------------------------------------------------------------------------------------

    普通转跳(没有经过Gate 这东西):即JMP或Call后跟着48位全指针(16位段选择子+32位地址偏移),且其中的段选择子指向代码段描述符,这样的跳转称为直接(普通)跳转。普通跳转不能使特权级发生跃迁,即不会引起CPL的变化,看下面的详细描述:

        目标是一致代码段:
         要求:CPL >= DPL ,RPL不检查。

              转跳后程序的CPL = 转跳前程序的CPL
         
        目标是非一致代码段:
         要求:CPL = DPL AND  
    RPL<= DPL

              转跳后程序的CPL = 转跳前程序的CPL


    ---------------------------------------------------------------------------------------

     通过调用门的跳转:当段间转移指令JMP和段间转移指令CALL后跟着的目标段选择子指向一个调用门描述符时,该跳转就是利用调用门的跳转。这时如果选择子后跟着32位的地址偏移,也不会被cpu使用,因为调用门描述符已经记录了目标代码的偏移。使用调门进行的跳转比普通跳转多一个步骤,即在访问调用门描述符时要将描述符当作一个数据段来检查访问权限,要求指示调用门的选择子的 RPL≤门描述符DPL,同时当前代码段CPL≤门描述符DPL,就如同访问数据段一样,要求访问数据段的程序的CPL≤待访问的数据段的DPL,同时选择子的RPL≤待访问的数据段或堆栈段的DPL。只有满足了以上条件,CPU才会进一步从调用门描述符中读取目标代码段的选择子和地址偏移,进行下一步的操作。

        从调用门中读取到目标代码的段选择子和地址偏移后,我们当前掌握的信息又回到了先前,和普通跳转站在了同一条起跑线上(普通跳转一开始就得到了目标代码的段选择子和地址偏移),有所不同的是,此时,CPU会将读到的目标代码段选择子中的RPL清0,即忽略了调用门中代码段选择子的RPL的作用。完成这一步后,CPU开始对当前程序的CPL,目标代码段选择子的RPL(事实上它被清0后总能满足要求)以及由目标代码选择子指示的目标代码段描述符中的DPL进行特权级检查,并根据情况进行跳转,具体情况如下:

     

        目标是一致代码段:
         要求:CPL >= DPL ,RPL不检查,因为RPL被清0,所以事实上永远满足RPL <= DPL,这一点与普通跳转一致,适用于JMP和CALL。
              转跳后程序的CPL = 转跳前程序的CPL,因此特权级没有发生跃迁。
                               

        目标是非一致代码段:

       当用JMP指令跳转时:
         要求:CPL = DPL (RPL被清0,不检查),
    若不满足要求则程序引起异常。
              转跳后程序的CPL = DPL
         因为前提是CPL=DPL,所以转跳后程序的CPL = DPL不会改变CPL的值,特权级也没有发生变化。如果访问时不满足前提CPL=DPL,则引发异常。

        当用CALL指令跳转时:

         要求:CPL >= DPL(RPL被清0,不检查),若不满足要求则程序引起异常。

              转跳后程序的CPL = DPL

         当条件CPL=DPL时,程序跳转后CPL=DPL,特权级不发生跃迁;当CPL>DPL时,程序跳转后CPL=DPL,特权级发生跃迁,这是我们当目前位置唯一见到的使程序当前执行优先级(CPL)发生变化的跳转方法,即用CALL指令+调用门方式跳转,且目标代码段是非一致代码段。

    展开全文
  • 代码段、数据段

    千次阅读 2019-02-23 14:57:59
    1、代码段:就是程序的可执行部分,直观的认为就是堆叠的函数 2、数据段:(也称为数据区,静态数据区,静态区)直观的理解就是全局变量(局部变量不属于程序的数据,属于函数的数据)  数据段:  bss段:又...

    1、代码段:就是程序的可执行部分,直观的认为就是堆叠的函数

    2、数据段:(也称为数据区,静态数据区,静态区)直观的理解就是全局变量(局部变量不属于程序的数据,属于函数的数据)

         数据段:

                 bss段:又叫做ZI(zero initial段),特点是被初始化为0的数据段。

                 .data段:未被初始化0的全局变量,和静态局部变量

    特殊的数据被放在代码段:

           1、char* p = "linux";linux这个字符串被放在了代码段

           2、const int *p 指针p所指向的变量放在代码段来实现不能更改(常见于各种单片机编译器),gcc编译器则是通过编译器来直接检查变量是否被const修饰。

        

    展开全文
  • 段代码里的 and是什么意思?希望大神能逐句给解释下,万分感谢 `` public List<TrainingOrCompetition> getList(int userId, Pager pager) { String where = " "; if (0 ) { where = where + " and t.userId ...
  • 编译原理之可重定位代码什么意思

    千次阅读 多人点赞 2018-01-01 11:45:57
    可重定位代码什么意思呢? 顾名思义,可重定位 就是 可以重新定位。 我们都知道,我们在写代码的时候,代码里的各种跳转代码/指令,比如C里的goto,汇编里的jmp、jz等等,它们都是跳转到某一地址,然后在该地址往...
    可重定位代码 是什么意思呢?
    顾名思义,可重定位 就是 可以重新定位  的意思。
    我们都知道,在写代码时,代码里的各种跳转代码/指令,比如C语言里的goto,汇编里的jmp、jz等等,它们都是跳到某一地址,然后在该地址继续往下执行代码 的意思,我们写的代码时用的内存空间是逻辑空间,但是代码在实际运行时,用到的却是货真价实的物理地址空间。

    既然如此,那么在程序编译时,就需要有一个从  逻辑地址空间到   物理地址空间  的映射,如果这个映射做得不好,那么就会影响代码的正确执行。

    打个比方,下面有一段代码:
        AAAA;(假设这里是代码的起始地址0)


        ...        (中间经略过了187个地址)


        XXXX;(假设这一行的逻辑地址是188)
    circle:
       YYYY;(那么这一行就应该是189)
       ZZZZ;(190)
       MMM;(191)

    goto circle;(又跳到circle,也就是地址为189那里)


    因为操作系统给进程分配的内存的起始位置是无法确定的,换句话说,也就是程序 在运行时实际的物理起始位置是不确定,所以不能在编译时就把地址给写死,否则,如果实际运行时物理空间起始位置与编译时写死的起始地址  不一致的话,程序就会出问题。

    举个栗子,就拿上面的代码来讲,假设编译时,按照起始地址为0,给每一行代码都定死了地址(地址为右边括号里的数字),然而在实际运行这段程序时,系统可能给这个进程分配的 物理地址 起始地址为 2000,那么当代码执行到 goto circle;这一句时,本应该跳到的地址为2189,但是因为编译时已经把调转地址给写死了,实际却跳到地址189,至于这个189是哪一个进程的什么代码我们不知道,但可以肯定得是,这已经跳出了自己的物理空间,跳到别人的物理空间执行别人的代码去了,毫无疑问这样会出问题的。

    为了解决这个问题,科学家们就把心思放在编译这一步骤上。

    如果我们编译时,涉及  地址跳转,某个地址对应信息的读取、写入   等等之类与地址有关的操作,代码里所有地址都采用动态调整的方式,也就是可以根据操作系统实际给进程分配的  实际物理内存 的起始位置 ,而进行调整的话,那么代码就不会出错啦。

    同样拿上面的例子来说,假设运行该代码时,系统给这个进程分配的 物理地址 起始位置为 2000,而代码自动根据这个起始位置调整自己的地址,那么代码实际上是:
        AAAA;(假设这里是代码的起始地址2000)


        ...        (中间经略过了187个地址)


        XXXX;(假设这一行的逻辑地址是2188)
    circle:
       YYYY;(那么这一行就应该是2189)
       ZZZZ;(2190)
       MMM;(2191)

    goto circle;(又跳到circle,也就是2189那里)


    这样的话,代码的执行就不会出错啦。

    这种可以使地址平移的代码就叫做可重定位代码,它是在加载的时候,也就是系统给进程确定了物理地址时,才生成绝对地址的。

    重定位是由操作系统安排的。在装入程序前,系统会计算未使用的内存,然后将程序装入,并记下开始地址。在执行有相对地址的指令时,会将所有的地址加个刚才记下的开始地址,就叫重定位。它是实现多道程序在内存中同时运行的基础。

    实际上使得代码可重定位方式有两种,分别是动态重定位与静态重定位。
    1、静态重定位:即在程序装入内存的过程中完成,是指在程序开始运行前,程序中的各个地址有关的项均已完成重定位,地址变换通常是在装入时一次完成的,以后不再改变,故成为静态重定位。
    2、动态重定位:它不是在程序装入内存时完成的,而是CPU每次访问内存时 由动态地址变换机构(硬件)自动进行把相对地址转换为绝对地址。动态重定位需要软件和硬件相互配合完成。

    这里不讲述第2种,能理解第1种就可以啦。


    展开全文
  • !function(a){ jQuery.fn[a]=function(e){ return e?this.bind("resize",(t=e,function(){ var e=this,a=arguments; ...t.apply(e,a),i=setTimeout(function(){ ...这段代码是页面配置上的...这一段代码什么写法?
  • 程序内存空间(代码段、数据段、堆栈段)

    万次阅读 多人点赞 2016-08-24 20:55:12
    在冯诺依曼的体系结构中必须有:代码段,堆栈段,数据段。 进程的虚拟地址空间图示如下: 堆栈段:  1. 为函数内部的局部变量提供存储空间。  2. 进行函数调用时,存储“过程活动记录”。  3. 用作暂时...
  • 从字面意思理解,就是你的代码里已经嵌入了别的代码,这些代码可能是你引入过的框架,也可能是你通过接口继承得来的(比如:java中的继承),这样你就可以拥有侵入代码的一些功能。所以我们就称这段代码是侵入式代码...
  • 一致性代码和非一致性代码什么区别?等等这些问题,如果仅仅停留在知其然的级别,很容易会困惑,本文主要说明以上问题的答案和蕴涵在背后的原因。 1.特权级  首先,了解以下操作系统的特权级  1)CPL是存寄
  • 段就是程序的一部分,我们把整个程序的所有东西分成了一个一个的段,给每个段起个名字,然后在链接时就可以用这个名字来指示这些段。... 代码段: (.text),又叫文本段,代码段其实就是函数编译后生成的东西。 ...
  • BSS段,数据段,代码段,堆和栈

    千次阅读 2012-08-27 11:32:35
    来自:...ld 时把所有的目标文件的代码段组合成一个代码段,把所有的数据段组合成一个数据段. ######################################################
  • 内存分配(堆、栈、BSS、代码段、数据段)

    千次阅读 热门讨论 2014-09-08 00:01:58
    这两天看了马士兵老师的视频、视频中提到了一个万能钥匙、就是...我们程序运行的时候都是放在内存里的、根据静态、成员函数、代码段、对象、等等、放在不同的内存分块里、大概分为5块  1 栈  2 堆  3 BSS段-全局
  • I=imread('trees.tif'); figure(1) subplot(1,2,1) imshow(real(I)); title('原图'); I=I(:,:,3); fftI=fft2(I); sfftI=fftshift(fftI);
  • 1.先名词解释吧:DAO = Data Access Object = 数据存取对象Service = 服务Controller = 控制器Util = 工具Model = 模型首先,一个代码是不是有完善的结构,和是不是有上面这些东西没有什么关系,只是通常来说,我们...
  • 区块链开源代码什么意思 在从事开源工作的10多年中,我参与了一些具有创新思想的小型项目,这些创意后来发展成为具有牢固社区的大型项目。 我还见证了功能失调的社区如何从项目中汲取能量。 我最近还通过编写项目...
  • 经常看到uboot里面有清bbs段.一直都不明白,bbs段是什么东西,为什么要清,有什么作用. 还有其他段,都是些什么关系。 ...第一种情况:a.out:有代码段(text) 数据段(data), 未初始化数据段段(bbs)
  • 通过__name__变量控制Python代码段的执行

    千次阅读 多人点赞 2020-10-21 11:33:02
    可能很多同学在阅读Python源代码时会发现经常会出现if __name__ == '__main__':这样的代码,那么这样的代码起到什么作用呢?本文将为你深入解析__...
  • Navicat使用教程:使用Navicat代码段

    千次阅读 2019-02-12 09:18:00
    代码段库包括内置和用户定义的代码段。如果要减少列表中的条目数,可以在搜索框中输入搜索字符串以筛选列表(上图中的#2)。还可以根据数据库类型或所有数据库类型显示可用的代码段。右键单击库中的任意位置,然后从...
  • JAVA 中的 -> 是什么意思

    万次阅读 多人点赞 2019-05-12 20:04:03
    在《JAVA核心编程》中,有一这样的代码 import javax.swing.*;import java.awt.*;import java.io.File; public class ImageViewer { public static void main(String[] args){ EventQueue.invokeLater(() -> { ...
  • 今天在看IAP下载的时候发现需要知道自己编译出来的代码段的大小来设置FLASH的偏移量,在keil下编译默认是会显示程序的大小的: 可以清除的看到代码(Code)占了29704个字节,只读常量(RO-data)占6456个字节,已...
  • 简单的代码告诉你什么叫内存溢出

    千次阅读 多人点赞 2014-08-05 08:59:00
    简单的代码告诉你什么叫内存溢出!
  • from:http://bbs.chinaunix.net/thread-1032894-1-1.html int total; //外部变量,未初始化.存放在bss int main(int argc,char **argv) { int a; //自动变量. 栈 int aa=10; //自动变量. 栈 sta
  • 最近一直在写一套基于 python 的 sanic web 框架库的 restFul 接口的底层框架。... 方法来执行这段代码,报错直接返回 False 。 本文由 FungLeo 原创,允许转载,但转载必须保留首发链接。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 511,221
精华内容 204,488
关键字:

代码段是什么意思