linux内核源码情景分析阅读笔记(1)
阅读原文时间:2021年04月20日阅读:1

           一直以来都没有养成记录读书笔记的好习惯,导致每次迫切的需要一些知识的时候,又要重新的去温习,虽说之前若是对某项知识已经有所了解,再去温习肯定轻车熟路了,但多少总还要费一番周折的,翻阅资料总归会花些时间的。从今天起记录每天所学到点点滴滴,相信定能积少成多,这样一来可以对学到的东西做个梳理,二来可以做个备忘,方便自己查阅温习。

         学习linux内核情景分析已经有段时间了,现在还停留在的最开始的两章,虽说进展缓慢(可能自己不够勤奋,读书三天打渔两天晒网),但自认为还是学到了不少东西的,今天主要对汇编部分做了温习:

      linux内核源码中的汇编语言是AT&T 格式的,一条汇编语句的主要格式如下:         指令部:输出部:输入部:损坏部

有如下要点:

1. 寄存器编号从输出部开始,从0依次递增。

2.输出部描述以“=”开始,而输入不却没有。

一个简单的set_bit函数汇编实现书中是这样实现的:

__asm__ __volatile__( LOCK_PREFIX
"btsl %1,%0"
:"=m" (ADDR)
:"Ir" (nr));

btsl这条指令时将%0寄存器中指针(ADDR)指向的整形内存单元中的nr(%1寄存器)位设为1.

          觉得其实输出部与输入部的位置并不是太重要,关键是要表明寄存器中数据的来源与去处,例如我将如上的汇编指令换成如下的语句依然可以正常运行:

        "btsl %0,%1"
        :
        :"lr"(nr),"m"(ADDR(addr)));

此外如果某个地方使用的寄存器与之前的某个寄存器相同,则可以在描述中用之前的那个寄存器的编号表示,不过这种情况只能在输入部中出现,因为编号从输出部开始的,而在输出部内部,又不可能存在两个变量同时使用一个寄存器。