学习linux内核时常碰到的汇编指令(2)

转载:http://blog.sina.com.cn/s/blog_4be6adec01007xvh.html

JNGE∶指令助记符——(有符号数比较)不大于且不等于转移(等价于JL)。当SF和OF异号,且ZF=0 时转移(段内直接短转移)。

JNL∶ 指令助记符——(有符号数比较)不小于时转移(等价于JGE)。 当SF和OF同号,或ZF=1, 则转移(段内直接短转移)。

JNLE∶指令助记符——(有符号数比较)不小于且不等于转移(等价JG)。SF和OF同号,且ZF=0 时转移。

JNO∶简单条件转移指令助记符——前次操作无溢出转移。OF=0 则转移(段内直接短转移)。

JNP∶ 简单条件转移指令助记符——奇校验转移。PF=0 则转移(段内直接短转移)。

JNS∶ 简单条件转移指令助记符——前次操作结果为正数转移。SF=0 则转移(段内直接短转移)。

JNZ∶ 简单条件转移指令助记符——不相等转移(同JNE)。ZF=0 则转移(段内直接短转移)。

JO∶ 简单条件转移指令助记符——前次操作溢出转移。OF=1 则转移(段内直接短转移)。

JP∶ 简单条件转移指令助记符——偶校验转移。前次操作结果中1的个数是偶数,PF=1 则转移(段内直接短转移)。

JPE∶ 简单条件转移指令助记符——偶校验转移。前次操作结果中1的个数是偶数,PF=1 则转移(段内直接短转移)。

JPO∶ 简单条件转移指令助记符—奇校验转移。PF=0 则转移(段内直接短转移)。

JS∶ 简单条件转移指令助记符——前次操作结果为负数转移。SF=1 则转移(段内直接短转移)。

JZ∶ 简单条件转移指令助记符——相等转移(同JE)。ZF=1 则转移(段内直接短转移)。

LABLE∶ 定义符号名伪指令——为当前存储单元定义一个指定类型的变量或标号。

一、LABLE 与变量连用。
  例 TIMB LABLE BYTE
    TIMW DW 4142H  第一句给第二句定义的字变量TIMW取一个新名字TIMB,并且修改类型属性为字节。以后如果以字类型访问该变量时,应使用变量名TIMW,以字节类型访问该变量时,应使用变量名TIMB。

二、LABLE 与标号连用。
  例 POINTF LABLE FAR     POINTN:MOV AX,[BX+SI]  第一句给第二句隐含定义的近标号POINTN取一个新名字POINTF,并将类型属性修改为FAR 。这样就允许作为

其他代码段中转移或调用指令的目标标号(这时标号是POINTF)。

LAHF∶指令助记符——标志寄存器(PSW)低8位内容送AH中。

LDS∶ 指令助记符——取地址指针到数据段寄存器。要求源操作数是一个双字长存储器操作数,目的操作数是16位通用寄存器、指针或变址寄存器,但不能是段寄存器。指令执行时,双字长存储器操作数中的低地址传送到指定的寄存器中,高地址传送到DS寄存器中。

  例:LDS SI,DATA_SEG[DI] 由DATA_SEG[DI]可以得到在数据段的有效地址EA(即段内偏移量)。在EA和EA+2中存放着目标指针。EA存放的是目标指针的段内偏移量,送至SI;EA+2存放的是目标指针的段地址,送至DS。

  例:变量名一 DD 变量名二

    ......
    LDS SI 变量名一
    变量名二所在数据段的EA和段地址存放在变量名一中,EA送至SI,EA+2存放的段地址送至DS。

LE∶ 关系运算符——小于等于。若满足条件,输出结果为全 1(所有的位),否则为全0 。

LEA∶指令助记符——取有效地址。将存储器操作数的偏移地址传送到通用寄存器、指针或变址寄存器中。该指令常用来建立串操作指令所需要的寄存器指针。

  例一 LEA SI,变量名(与MOV SI OFFSET 变量名 等效);

  例二 LEA AX,[AX] (将SI所指存储单元的EA送至AX,而MOV AX,[SI]送的是该存储单元存放的内容)

LENGTH∶数值返回运算符。其加在一个变量名前面,返回的数值是数组变量的元素个数。如果变量是用DUP 说明的,则返回DUP前面的数值;如果没有DUP 说明的,则返回的值总是1。

LES∶ 指令助记符——取地址指针到数据段寄存器。要求源操作数是一个双字长存储器操作数,目的操作数是16位通用寄存器、指针或变址寄存器,但不能是段寄存器。指令执行时,双字长存储器操作数中的低地址传送到指定的寄存器中,高地址传送到ES寄存器中。

LDCK∶ 指令助记符——封锁总线。加在任何指令前面的单字节前缀指令,配合用来维持总线的锁存信号,直到与其配合的指令执行完为止。

LOCAL∶ 宏指令——局部符号(变量,标号)定义。在宏扩展时,汇编程序给LOCAL 后的形式参数指定特殊的符号,然后用这些符号替换宏指令体中LOCAL 指出的形式参数。这样可避免这些符号在多次调用宏时发生重复定义。

LODS∶指令助记符——装入串。一般用LODSB或LODSW。

LODSB∶ 指令助记符——字节装入(从字节串中取数)。它将DS段SI指出的字节数据送入AL寄存器中,并根据方向标志DF修改SI中的地址。即当DF=0时,地址加1 ;DF= 1 时,地址减1 。

LODSW∶ 指令助记符——字装入(从字串中取数)。 它将DS段SI指出的字数据送入AX寄存器中,并根据方向标志DF修改SI中的地址。即当DF=0 时,地址加2 ;DF= 1 时,地址减2 。

LOOP∶指令助记符——循环控制。每执行一次,CX的内容减1 ,若减1 后不为0 ,则转移到目标地址;否则,执行LOOP之后的指令。

LOOPE∶ 指令助记符——循环控制(等于LOOPZ)。每执行一次,CX的内容减1, 若减1 后不为0 ,且ZF=1, 则转移到目标地址;否则,执行LOOPE 之后的内容。

LOOPZ∶指令助记符——循环控制(等于LOOPE)。每执行一次,CX的内容减1 ,若减1 后不为0 ,且ZF=1, 则转移到目标地址;否则,执行LOOPZ 之后的内容。

LOOPNE∶指令助记符——循环控制(等于LOOPNZ)。每执行一次,CX的内容减1 ,若减1 后不为0 ,且ZF=0, 则转移到目标地址;否则,执行LOOPNE之后的内容。

LOOPNZ∶指令助记符——循环控制(等于LOOPNE)。每执行一次,CX的内容减1 ,若减1 后不为0 ,且ZF=0, 则转移到目标地址;否则,执行LOOPNZ之后的内容。

LOW∶ 字节分解运算符(操作符)。用来从运算对象(一个数或地址表达式)中分离出(取)低字节。

LT∶ 关系运算符——小于。若满足条件,输出结果为全1 (所有的位),否则为全0 。

MACRO∶ 宏指令——宏定义。

MASK∶运算符。使得记录中指定字段各位均为1 ,其他各位均为0 。

MEMORY∶伪指令——段定义(组合类型)。该段在存储器中应该定位在所有其他段的最高地址。如果不止一个段选用MEMORY方式,则把第一个遇到的段作MEMORY处理,而其他段均作COMMON方式处理。

MOD∶ 算术运算符——模除(取整除后的余数)。

MOV∶ 指令助记符——通用数据传送。注意,①两个段寄存器之间不能直接传送数据;②两个储存单元之间不能直接传送数据(可以用MOVS);两个操作数中必须有一个是寄存器或立即数;③立即数和段寄存器CS不能作为目的操作数。

MOVS∶指令助记符——串传送。与MOVSB和MOVSW相似,但必须说明数据串类型(字或字节)。

MOVSB∶ 指令助记符——串(字节)传送。把由SI指向的数据段中的一个字节数据传送到由DI指向的附加段内一个字节存储单元中去,并同时根据方向标志对SI和DI中的地址进行修改。当DF=0时, 地址都加1 ;当DF=1时 ,地址都减1 。

MOVSW∶ 指令助记符——串(字)传送。把由SI指向的数据段中的一个字数据传送到由DI指向的附加段内一个字存储单元中去,并同时根据方向标志对SI和DI中的地址进行修改。当DF=0时, 地址都加2 ;当DF=1时,地址都减2 。

MUL∶ 指令助记符——无符号数乘法。  字节乘法:(AL)*(源操作数)->AX

  字乘法: (AX)*(源操作数)->DX和AX
  若结果的高半部分(AH或DX,对应字节和字)为非0 值,则CF和OF置1;否则CF和OF清0。

NAME∶伪指令——模块定义。程序将对给定的程序模块取模块名。格式是,NAME 模块名。 汇编处理时,一个模块就是一个独立的汇编单位。汇编处理只进行到模块结束语句END 为止。如果该模块是主模块,END 语句可以指出一个标号,它表示该程序的启动地址。

NE∶关系运算符——不等。若满足条件,输出结果为全1 (所有的位),否则为全0 。

NEG∶ 指令助记符——求补。将目的操作数的每一位求反(包括符号位)后加1.若在字节操作时对—128,或在字操作时对—32768取补,
则操作数不变,但溢出标志OF置位。操作数可以是寄存器或存储器单元,但不能是段寄存器或立即数。结果送回目的操作数。执行结果不但影响标志位AF、
CF、OF、PF、SF和ZF,而且一般总是置CF=1 (除非操作数为0)。

NONE∶伪指令——段定义(组合类型)。本段与其它段逻辑上不发生关系,每段都有自己的基地址。这是隐含的组合类型。

NOP∶ 指令助记符——空操作。用于程序调试。

NOT∶ 逻辑运算符(在语句的操作数部分)或逻辑操作指令助记符(在语句的操作码部分)——按位非(求反)。将目的地址中的内容逐位取反后再送入目的地址中。

OF∶Overflow Flag, 溢出标志,在标志寄存器的第11字节。在运算过程中,如操作数超出了机器能表示的范围,此时OF 置1。作加法时,OF位是根据操作数的符号及其结果情况来设置的,若两个操作数的符号相同,而结果的符号与之相反时,OF置1,否则置0。

OFFSET∶数值返回运算符。其加在一个变量名或标号前面,返回的数值是该变量名或标号所在的段的偏移地址。

OPD∶ 教材符号--目的操作数。

OPR∶ 教材符号--源操作数。

OR∶ 逻辑运算符(在语句的操作数部分)或逻辑操作指令助记符(在语句的操作码部分)——按位或。进行“或”运算的两位中任一位是 1,则结果为1 。

ORG∶ 伪指令——定位(置汇编地址计数器)。在每段源程序或数据块的开始,指明此语句后面的程序或数据块的起始地址,其余指令或数据就连续存放在以后的地址单元中。

  例一 ORG $+10 表示跳过10个字节。

  例二 ORG 数值表达式(值为0-65535) 表示$改为数值表达式的值。

OUT∶ 指令助记符——输出。把AX或AL中的内容传送到一个输出端口。寻址方式与IN相同。

PA∶教材符号--某一存储单元的物理地址。  对于指令,PA=(CS)左移4位+(IP);

  对于堆栈段数据,PA=(SS)左移4位+(SP);或PA=(SS)左移4位+(BP);

  对于数据段和附加数据段数据,PA=(DS或ES)+该变量的偏移地址。

PARA∶伪指令——段定义(定位类型方式)。规定在定位时每个段的起始地址总是16的整倍数,最后四位二进制数一定是0 。这种定位方式最简单,但段间往往有空隙(最多为15个字节)。缺省定位方式是按PARA定位。

PAGE∶①伪指令——段定义(定位类型方式)。要求段起始地址是 256的整倍数,即段的边界必须是页的边界。段地址的最低两位(16进制数)必须是0 。②伪指令——格式控制。指定汇编程序所产生的列表文件每页多少行(10—255), 每行多少字符(60-132)。或指定输出新的一页(用+号)。

PF∶Parity Flag,奇偶标志,在标志寄存器的第2字节,当运算结果(指低8位)中1的个数为偶数时置1,否则置0。该标志主要用来检测数据在传输过程中的错误。

POP∶指令助记符——出栈。将栈顶元素弹出送至某一寄存器,段寄存器(CS除外)或存储器中。首先将SP指的内容送至低8位,SP加1;再将SP指的内容送入高8位,SP再加1。

POPF∶指令助记符——将堆栈顶端的字数据送入标志寄存器。对于TF和OF置位可先将数值置于AX中,压入堆栈,再用POPF送入标志寄存器。此方式对TF和OF标志位是唯一可行的置位方法。

PROC∶伪指令——过程(子程序)定义(起始)。定义一个子程序,并说明它是NEAR或FAR 过程。定义的过程如果由 DOS直接装入并启动执行,则该过程必须定义为 FAR过程。

PSW∶Program Status Word,程序状态字寄存器,由条件码标志(OF、SF、ZF、AF、PF、CF)和控制标志(DF、IF、TF)构成。

     11 10 9  8 7  6    4    2    0

   ─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┐

    │OF│DF│IF│TF│SF│ZF│ │AF│ │PF│ │CF│

   ─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┘

PTR∶ 修改属性运算符。用来明确指出变量、标号或地址表达式的类型属性( 只在所在的指令内有效)。类型放在PTR 之前,可以是BYTE、WORD、 DWORD、NEAR、FAR。

PUBLIC∶①伪指令——段定义(组合类型)。该段与其它模块中说明为PUBLIC类型的同名同‘类别‘段组合起来,形成一个物理段(小于等于
64K),公用一个段基址,②伪指令——定义全局符号。表示该模块中定义的哪些符号常量、变量、标号以及过程名(几个模块公用的过程一般都是FAR 过程)等可以被其他模块所引用。

PURGE∶ 宏指令——取消宏定义。

PUSH∶指令助记符——进栈。把寄存器,段寄存器中的一个字数据压入堆栈。高8位先进,SP减1;低8位后进,SP再减1。

PUSHF∶ 指令助记符——把标志寄存器的内容压入堆栈。在子程序调用和中断服务中可用来保护标志位(恢复用POPF)。

RCL∶ 指令助记符——带进位循环左移。
  格式为:RCL 目的操作数,1
     或RCL 目的操作数,CL  (其中CL中存放的是移动次数)

 ┌─┐  ┌───────────────┐
┌│CF│← │ ←───────────── │←┐

│└─┘  └───────────────┘ │
└───────────────────────┘

RCR∶ 指令助记符——带进位循环右移。
  ┌───────────────┐ ┌─┐
┌→│ ─────────────→ │→│CF│─┐

│ └───────────────┘ └─┘ │
└───────────────────────┘

RECORD∶伪指令——设计一个单字节或双字节的记录格式。指令格式为,

  记录名 RECORD 字段名1:=表达式,字段名2:=表达式 ……

记录定义后,必须利用初始化记录的方法来定义存储器变量,格式为,

  变量名 记录名 <表达式,表达式,……>

 或变量名 记录名 数量DUP(<表达式,……>)

REP∶ 指令助记符——重复前缀。它可以使串指令反复执行(CX不等于0 就执行),每执行一次,CX的内容减1 。

REPE∶指令助记符——重复前缀。当两串相等,即ZF=1时 ,它可以使串指令反复执行(CX不等于0 就执行),每执行一次,CX的内容减1 。(与REPZ完全一样)

REPNE∶ 指令助记符——重复前缀。当两串不相等,即ZF=0时, 它可以使串指令反复执行(CX不等于0 就执行),每执行一次,CX的内容减1 。(与REPNZ完全一样)

REPNZ∶ 指令助记符——重复前缀。当两串不相等,即ZF=0时, 它可以使串指令反复执行(CX不等于0 就执行),每执行一次,CX的内容减1 。(与REPNE完全一样)

REPT∶宏指令——重复块(以ENDM结束)。
  格式为: REPT 重复次数
       重复块
       ENDM
  这种宏指令用于确定重复次数。

REPZ∶指令助记符——重复前缀。当两串相等,即ZF=1时, 它可以使串指令反复执行(CX不等于0 就执行),每执行一次,CX的内容减1 。(与REPE完全一样)

RET∶ 指令助记符——返回。
  一、段内返回。先将栈顶的字送入IP,然后SP增2 。若带立即数,SP再加立即数(丢弃一些在执行CALL之前入栈的参数)。

  二、段间返回。栈顶的字送入IP后(SP增 2),再将栈顶的字送入CS,SP再增2 。若带立即数,则SP再加立即数。

ROL∶ 指令助记符——循环左移。
 格式为:ROL 目的操作数,1
    或ROL 目的操作数,CL  (其中CL中存放的是移动次数)

┌─┐  ┌───────────────┐
│CF│←┬│ ←───────────── │←┐

└─┘ │└───────────────┘ │
    └──────────────────┘

ROR∶ 指令助记符——循环右移。
  ┌───────────────┐  ┌─┐
┌→│ ─────────────→ │┬→│CF│

│ └───────────────┘│ └─┘
└──────────────────┘

SAHF∶指令助记符——将AH 寄存器的内容送入标志寄存器(PSW)的低字节中,标志寄存器高八位保持不变。

SAL∶ 指令助记符——带符号数的算术左移。经常用来乘以2。

  格式为: SAL 目的操作数,1
当移位次数大于 1时,则移位次数应预先置于CL寄存器中。

  格式为: SAL 目的操作数,CL
┌─┐ ┌───────────────┐
│CF│←│ ←───────────── │← 0

└─┘ └───────────────┘
  如果符号位发生变化时,就将 1送到OF标志,表示移位前操作数的最高位与移位后的最高位不同。

SAR∶ 指令助记符——带符号数的算术右移。符号位保持不变。经常用来除以2。当移位次数大于 1时,则移位次数应预先置于CL寄存器中。

  ┌───────────────┐ ┌─┐
┌→│ ─────────────→ │→│CF│

│ └───────────────┘ └─┘
└──┘

SBB∶ 指令助记符——带借位减法(减去CF的值)。用于多字节减法运算。两高位字相减,并减去低位的借位CF。

SCAS∶指令助记符——串搜索(扫描)。通常用SCASB或SCASW。

SCASB∶ 指令助记符——字节串扫描(搜索)。用AL寄存器中的内容与由ES段DI指定的一个字节数据进行比较(减),若相等(结果为0) ,ZF=1 。并依方向标志DF的值修改DI中的地址,即DF=0 ,地址加1 ;DF=1 ,地址减 1。

SCASW∶ 指令助记符——字串扫描(搜索)。 用AX寄存器中的内容与由ES段DI 指定的一个字数据进行比较(减),若相等(结果为0) ,ZF=1 。并依方向标志DF的值修改DI中的地址,即DF=0 ,地址加2 ;DF=1 ,地址减 2。

SEG∶ 数值返回运算符。其加在一个变量名或标号前面,返回的数值是该变量名或标号所在的段基址(段寄存器的内容)。

SEGMENT∶ 段定义伪指令 。格式为 段名 SEGMENT [定位方式][组合方式][‘类别‘]。在定义段的时候,还可以在SEGMENT 语句中给出该段的类别,类别名是一个用单括号括起来的字符串。进行连接处理时,LINK程序把类别名相同的所有段放在连续的存储区域内。同类的各个段在连接时,先出现的在前,后出现的在后。

SF∶Sign Flag, 符号标志,在标志寄存器的第7字节.记录运算结果的符号,结果为负时置1。

SHL∶ 
  一、算术运算符——左移(移1位相当于乘以2)。
  二、指令助记符——无符号数的逻辑左移。经常用来乘以2。 当移位次数大于1 时,则移位次数应预先置于CL寄存器中,写成“SHL OPD CL”。

┌─┐ ┌───────────────┐
│CF│←| ←───────────── │← 0

└─┘ └───────────────┘

SHORT∶ 属性运算符(操作符)。用来指定JMP 指令中转向地址的属性,指出转向(目标)地址与本指令地址的字节距离在-128到+127之间。

SHR∶
  一、算术运算符——右移(移1位相当于除以2)。
  二、指令助记符——无符号数的逻辑右移。经常用来除以2。 当移位次数大于 1时,则移位次数应预先置于CL寄存器中,写成“SHR …,CL”。

  ┌───────────────┐ ┌─┐
0→ │ ─────────────→ │→│CF│

  └───────────────┘ └─┘

SI∶Source Index,源变址寄存器。与DS联用,用来确定数据段中某一存储单元的偏移地址。在串处理指令中,SI指出源操作数的地址,隐含段为当前的数据段。

SIZE∶数值返回运算符。其加在一个变量前面,返回的是数组变量所占的总字节数(LENGTH和TYPE返回值的乘积)。

时间: 2024-10-10 01:49:48

学习linux内核时常碰到的汇编指令(2)的相关文章

学习linux内核时常碰到的汇编指令(1)

 转载:http://blog.sina.com.cn/s/blog_4be6adec01007xvg.html 80X86 汇编指令符号大全 +.-.*./∶算术运算符. &∶宏处理操作符.宏扩展时不识别符号和字符串中的形式参数,如果在形式参数前面加上一个& 记号,宏汇编程序就能够用实在参数代替这个形式参数了. $∶地址计数器的值——记录正在被汇编程序翻译的语句地址.每个段均分配一个计数器,段内定义的所有标号和变量的偏移地址就是当前汇编地址计数器的值. ?∶操作数.在数据定义语句中,操作

Linux系统的理解及学习Linux内核的心得

作业列表      linux内核分析作业:以一简单C程序为例,分析汇编代码理解计算机如何工作 linux内核分析作业:操作系统是如何工作的进行:完成一个简单的时间片轮转多道程序内核代码 linux内核分析作业3:跟踪分析Linux内核的启动过程 linux内核分析作业4:使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用 linux内核分析作业5:分析system_call中断处理过程 linux内核分析作业6:分析Linux内核创建一个新进程的过程 Linux内核分析作业7:L

以Qemu模拟Linux,学习Linux内核

文章名称:以Qemu模拟Linux,学习Linux内核作      者:five_cent文章地址:http://www.cnblogs.com/senix/archive/2013/02/21/2921221.html维护日志:2013-02-21 建立文档(注:文章参考自http://www.linuxidc.com/Linux/2011-07/39373.htm, 是对该篇文章的一些补充和说明.文章内所使用的环境是Ubuntu 12.04,如果其中遇到编译问题,请自行参考错误说明,配置依赖

Linux内核(16) - 高效学习Linux内核

世界悲结束了,章鱼哥也退役了,连非诚勿扰中的拜金女也突然的少了很多.这本<Linux内核修炼之道>在卓越.当当.china-pub上也已经开卖了,虽然是严肃文学,但为了保证流畅性,大部分文字我还都是斟词灼句,反复的念几遍才写上去的,尽量考虑到写上去的每段话能够让读者产生什么疑惑,然后也都会紧接着尽量的去进行解释清楚,中间的很多概念也有反复纠结过怎么解释能够更容易的理解,力求即使对于初学者也可以有很少阻碍的一气读完.同时我也把书中一部分自己的感悟抽出来整理了精华版,share出来.当然水平有限,

《Linux操作系统分析》之Linux系统的理解及学习Linux内核的心得

经过这一段时间的学习,自己对linux也有了一定的认识,今天这篇博客对以往的知识进行一个总结吧. 以往linux学习的博客,从上而下是学习深入的过程,我的博客链接如下: 第一篇:<Linux操作系统分析>之分析计算机如何启动以及如何工作运行 第二篇:<Linux操作系统分析>之分析精简的Linux的内核中断和时间片轮询 第三篇:<Linux操作系统分析>之跟踪分析Linux内核的启动过程 第四篇:<Linux操作系统分析>之使用库函数API和C代码中嵌入汇编

轻松学习linux内核源码的方法

轻松学习Linux操作系统内核源码的方法 针对好多Linux 爱好者对内核很有兴趣却无从下口,本文旨在介绍一种解读linux内核源码的入门方法,而不是解说linux复杂的内核机制:一.核心源程序的文件组织:1.Linux核心源程序通常都安装在/usr/src/linux下,而且它有一个非常简单的编号约定:任何偶数的核心(例如2.0.30)都是一个稳定地发行的核心,而任何奇数的核心(例如2.1.42)都是一个开发中的核心. 本文基于稳定的2.2.5源代码,第二部分的实现平台为 RedHat Lin

Linux内核学习总结:Linux系统的理解及学习Linux内核的心得

作业一计算机是如何工作的进行http://www.cnblogs.com/zhengwei0712/p/5207299.html 作业二操作系统是如何工作的进行http://www.cnblogs.com/zhengwei0712/p/5234622.html 作业三LINUX内核的启动过程http://www.cnblogs.com/zhengwei0712/p/5253703.html    第一章:Linux发展与UNIX 第二章:内核源码获取.解压.配置.编译与安装 作业四系统调用的工作

代码学习-Linux内核网卡收包过程(NAPI)

本文通过学习RealTek8169/8168/8101网卡的驱动代码(drivers/net/r8169.c),梳理一下Linux下网卡的收包过程. 在下水平相当有限,有不当之处,还请大家斧正^_^ 驱动的初始化 如下的rtl8169_init_module函数是此驱动的初始化代码,此函数只干了一件事,就是向内核注册一个pci驱动rtl8169_pci_driver. static int __init rtl8169_init_module(void) { returnpci_register

使用ftrace学习linux内核函数调用

http://www.cnblogs.com/pengdonglin137/articles/4752082.html 转载: http://blog.csdn.net/ronliu/article/details/6446251 linux中大量使用函数指针钩子,导致阅读代码困难.比如想知道一个函数的调用路径,那么就只能用source insight之类的工具看代码了.有没有办法可以迅速获得调用关系的整体印象?ftrace是内核提供的一种调试工具,可以对内核中发生的事情进行跟 踪.比如函数的调