操作系统内核与安全分析课程笔记【1】链表、汇编与makefile

news2024/11/28 22:51:41

文章目录

  • 链表
    • 循环双向链表
    • 哈希链表
    • 其他链表
  • 汇编
    • 内联汇编
    • 扩展内联汇编
  • makefile

链表

链表是linux内核中关键的数据结构。在第二次课中,重点介绍了循环双向链表哈希链表。这两种链表都在传统的双向链表的基础之上进行了针对效率的优化。(ps:这部分可以通过看插入链表、删除链表中节点的具体实现来加深理解)

循环双向链表

请添加图片描述
linux内核中的链表节点中只包含指针,数据被存在节点之外的空间,通过偏移来获取数据。(ps:在结构体之外再套一个结构体)

哈希链表

请添加图片描述
哈希链表是双向非循环链表,head和node的结构不同,head里有1个指针,node里面有2个指针,并且两个指针一个是一级指针(next),一个是二级指针(prev)。
请添加图片描述
这种设计的优点在于:

  1. 节省空间:head设计只有1个指针,空间使用减少一半
  2. 提高效率:判断是否为head节点,只需要查看pprev指针

其他链表

降序优先排序的双向链表: 二重索引请添加图片描述
无锁单链表
请添加图片描述

汇编

Linux大部分代码是c语言编写,但依旧有少量代码用汇编语言编写,原因是:

  1. 提高效率
  2. 与硬件交互
  3. 与cpu交互

用c语言写的代码可以通过3种方法看其汇编代码:

gcc -S [file_name].c # method 1

gcc -c [file_name].c # method 2
objdump -d [file_name].o 

gdb + disassemble # method 3

汇编指令语法见:汇编语言–x86汇编指令集大全

内联汇编

内联汇编只可以对全局变量进行操作。


#include <stdio.h> // asm.c

int a, b, c;
int main() {
    a = 1, b = 2;
    asm volatile (
        "movl a, %eax\n\t" // 将a放入eax寄存器
        "addl b, %eax\n\t" // 将b的值加到eax寄存器中
        "movl %eax, c\n\t" // 将eax寄存器的值加到c中
    );
    printf("c:%d\n",c);    
}

扩展内联汇编

扩展内联汇编可以对局部变量进行操作,其基本格式为:

asm volatile (
	"assembly code" 
	: output operands /* optional */
	: input operands /* optional */
	: list of clobbered registers /* optional */
)
#include <stdio.h> //asm_2.c

int main() {
    int a = 1, b = 2, c = 0;
    asm volatile (
        "movl %0, %%eax\n\t"
        "movl %1, %%ebx\n\t"
        "addl %%eax, %%ebx\n\t"
        "movl %%ebx, %2\n\t"
        :"+g"(a), "+g"(b) // input operand
        :"+g"(c) // output operand 
    );
    printf("c:%d\n",c);
    printf("a:%d\n",a);
    printf("b:%d\n",b);

    return 0;
}

clobbered registers会影响最终结果:

#include<stdio.h>
int main() {
    int data1 = 10;
    int result = 20;

    asm (
        "movl %1, %%eax\n\t"
        "addl %%eax, %0"
        :"=r"(result)
        :"r"(data1), "0"(result)
        // :"%eax" 此行不注释result=30,注释后result=20
    );
    printf("the result is:%d\n",result);
    return 0;
}

makefile

请添加图片描述
在软件开发中,Make 是一种构建自动化工具,它通过读取指定如何派生目标程序的称为 Makefile 的文件,从源代码自动构建可执行程序和库。 尽管集成开发环境和特定于语言的编译器功能也可用于管理构建过程,但 Make 仍被广泛使用,尤其是在 Unix 和类 Unix 操作系统中。

Make 可用于管理任何项目,除了构建程序之外,只要其他文件发生变化,某些文件需要从其他文件自动更新。

makefile包括4种语句:

  1. 规则
  2. 变量定义
  3. 其他元素

一个简单的makefile例子:项目包括2个c++文件:processing.cppgui.cpp文件,那么makefile可以写成:

gcc -c processing.cpp -o processing.o # 单独编译processing.cpp
gcc -c gui.cpp -o gui.o # 单独编译gui.cpp
gcc processing.o gui.o -o my_program # 联合编译processing.o和gui.o

可以发现编译一个2个文件的项目,已经涉及到了3行命令行来进行编译。可以预想的是,当项目规模扩大时,编译的指令也会变得异常复杂,并且一旦更新其中一个文件,需要重新编译的时候,所涉及到需要重新运行的编译指令所面临的情况也是千奇百怪。因此,我们需要makefile来对编译的指令进行一个封装,简化用户编译时的工作量。

to be continued

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/402125.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

smp_init过程解析

当你看到这样的log&#xff0c;会不会很慌张&#xff1f;竟然由CPU没有启动成功&#xff0c;除了什么故障&#xff1f;本文将结合我遇到的一个问题&#xff0c;将启动过程中bringup secondary cpu的过程分析一下。smp_init代码如下&#xff1a;602 void __init smp_init(void) …

合肥工业大学密码学课设-RSA

✅作者简介&#xff1a;CSDN内容合伙人、信息安全专业在校大学生&#x1f3c6; &#x1f525;系列专栏 &#xff1a;课设-密码学课设-RSA &#x1f4c3;新人博主 &#xff1a;欢迎点赞收藏关注&#xff0c;会回访&#xff01; &#x1f4ac;舞台再大&#xff0c;你不上台&#…

牛客刷题第一弹

1.异常处理 都是Throwable的子类&#xff1a; ①.Exception&#xff08;异常&#xff09;:是程序本身可以处理的异常。 ②.Error&#xff08;错误&#xff09;: 是程序无法处理的错误。这些错误表示故障发生于虚拟机自身、或者发生在虚拟机试图执行应用时&#xff0c;一般不需…

百丽时尚×优维科技×道客战略启动「云原生一体化项目」

3月7日&#xff0c;由百丽时尚集团&#xff08;以下简称&#xff1a;百丽时尚&#xff09;联合优维科技、道客共同举办的「云原生一体化项目启动会」在深圳百丽国际大厦圆满落幕&#xff0c;项目合作三方齐聚一堂&#xff0c;就云原生一体化建设战略方案达成合作共识&#xff0…

【LeetCode每日一题】——783.二叉搜索树节点最小距离

文章目录一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【解题思路】七【题目提示】八【题目注意】九【时间频度】十【代码实现】十一【提交结果】一【题目类别】 深度优先搜索 二【题目难度】 简单 三【题目编号】 783.二叉搜索树节点最小距…

Hands-on C++ Game Animation Programming阅读笔记(九)

Chapter 12: Blending between Animations This fade is usually short—a quarter of a second or less. (动画之间的fade一般很快&#xff0c;0.5s甚至更短) 本章重点&#xff1a; 两个Pose的Blending不同Animations的CrossFading&#xff0c;会有一个cross fade controller…

OpenCV入门(六)快速学会OpenCV5图像处理基础(二)像素处理

OpenCV入门&#xff08;六&#xff09;快速学会OpenCV5图像处理基础&#xff08;二&#xff09; 像素是图像构成的基本单位&#xff0c;像素处理是图像处理的基本操作&#xff0c;可以通过位置索引的形式对图像内的元素进行访问、处理。 1.二值化操作 需要说明的是&#xff…

2023年上半年北京杭州/广州深圳软考中/高级报名入口

软考是全国计算机技术与软件专业技术资格&#xff08;水平&#xff09;考试&#xff08;简称软考&#xff09;项目&#xff0c;是由国家人力资源和社会保障部、工业和信息化部共同组织的国家级考试&#xff0c;既属于国家职业资格考试&#xff0c;又是职称资格考试。 系统集成…

【人脸识别】ssd + opencv Eigenfaces 和 LBPH算法进行人脸监测和识别

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录前言ssd opencv Eigenfaces 和 LBPH算法进行人脸监测和识别1. ssd 目标监测2.opencv的三种人脸识别方法2.1 Eigenfaces2.2 LBPH前言 ssd opencv Eigenfaces 和 LB…

hadoop的补充配置与常用脚本

目录 历史服务器的配置&#xff1a; 添加配置&#xff1a; 分发集群&#xff1a; 日志聚集功能的配置&#xff1a; 添加配置&#xff1a; 分发配置给集群其他服务器&#xff1a; 集群的启动与停止&#xff1a; 整体启动和停止hdfs&#xff1a; 整体启动/停止YARN 启动…

微服务为什么要用到 API 网关?

本文介绍了 API 网关日志的价值&#xff0c;并以知名网关 Apache APISIX 为例&#xff0c;展示如何集成 API 网关日志。 作者程小兰&#xff0c;API7.ai 技术工程师&#xff0c;Apache APISIX Contributor。 原文链接 什么是微服务 微服务架构&#xff08;通常简称为微服务&a…

Promise.all、Promise.race、Promise.allSettled、Promise.any区别

1.Promise.all Promise.all()方法用于将多个 Promise 实例&#xff0c;包装成一个新的 Promise 实例。 const p Promise.all([p1, p2, p3]); p的状态由p1,p2,p3 决定&#xff0c;分成两种情况。 &#xff08;1&#xff09;只有p1、p2、p3的状态都变成fulfilled&#xff0c…

LeetCode - 42 接雨水

目录 题目来源 题目描述 示例 提示 题目解析 算法源码 题目来源 42. 接雨水 - 力扣&#xff08;LeetCode&#xff09; 题目描述 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 示例1 输入&…

金融交易行为监测方法——利用 CNN 模型实现行为识别

背景介绍在证劵交易所领域&#xff0c;曾经发生用户证券账号被盗事件&#xff0c;导致客户资产损失&#xff0c;例如&#xff1a;黑客获得了用户A的证券账号密码&#xff0c;利用多次的低买高卖将资产转移。本文中针对此类对敲欺诈的场景&#xff0c;采用将用户交易数据转换为图…

头脑风暴(一):Controller层前端传参接收;在Service层实现类中?为何要build相关构建器?添加套餐业务分析

文章目录1 MyBatis中Controller层List集合接收数据&#xff0c;泛型添加与否1.1 案例场景1.2 应该用什么接收1.3 是否可以用其他方式接收&#xff1f;1.4 LIst集合接收可否不指定泛型1.5 mybatis中使用基本类型接收数据&#xff1f;resultType是集合中的元素的类型&#xff0c;…

论文阅读笔记《GAMnet: Robust Feature Matching via Graph Adversarial-Matching Network》

核心思想 本文提出一种基于图对抗神经网络的图匹配算法&#xff08;GAMnet&#xff09;,使用图神经网络作为生成器分别生成源图和目标图的节点的特征&#xff0c;并用一个多层感知机作为辨别器来区分两个特征是否来自同一个图&#xff0c;通过对抗训练的办法提高生成器特征提取…

uniCloud基础使用-好文

云函数可以看做java或者php&#xff0c;作为后端服务cloudfunctions/myCloud/index.jsexports.main async (event, context) > {const { name, age } eventreturn 我是${name},今年${age} };pages/index/index.vue//callFunction方法 在前端和云端都可以调用另一个云函数 …

三十而立却被裁,打工人要如何应对职场危机?

又到金三银四就业季&#xff0c;对于部分职场人来说&#xff0c;年龄成为了他们找工作的最大限制。 因为绝大部分企业招聘中层干部以下岗位的时候&#xff0c;都会要求年龄不超过35周岁&#xff0c;再加上每年千万毕业生涌入社会&#xff0c;竞争程度相当激烈&#xff0c;这就导…

QML 模型(ListModel)

LIstModel&#xff08;列表模型&#xff09; ListModel 是ListElement定义的简单容器&#xff0c;每个定义都包含数据角色。内容可以在 QML 中动态定义或显式定义。 属性&#xff1a; count模型中数据条目的数量dynamic动态角色&#xff0c;默认情况下&#xff0c;角色的类型…

Android 进程间通信机制(一) IPC概念和模型

一. 前言 一直想把Binder机制认识清楚, 但是它涉及Android系统的Framework, Native, kernel层, 就需要你要有 C C基础阅读底层源码的能力, 目前笔者的水平,对Binder 在Native 和kernel层的实现原理和机制也是懵逼状态, 真的是博大精深, 故现阶段先把看懂和理解清楚的整理出来…