软件课设(Ⅲ)——padavan-ng编译以及内核模块修改

news2025/1/13 8:01:39

我记得今年的很多笔试面试都遇到了linux相关的操作,答题状况都挺……昂。算是补课吧,正好大四的毕业实习、软3还有研0的项目都需要linux的环境进行推进,记录一下,聊作纪念。

实验要求

  1. 编译系统,下载并提交,验收的时候,我会找MIPS板子,让大家下载验证。
  2. 编译一个内核模块,内容任选,随系统提交,要求内容可体现在系统日志中。
  3. 编译一个应用模块,内容任选,以固件形式随系统提交,要求可在自指定文件中有结果显示。
  4. trunk/linux-3.4.x/kernel/sched/core.c 是进程相关的一个核心文件,同学们在必要函数前加注释,画出大体调度流程。
    trunk/linux-3.4.x/mm/page_alloc.c 是内存管理相关的一个核心文件,同学们在必要函数前加注释,画出大体分配流程。

1 虚拟机的安装以及环境配置

不一定非要是老师给的MV系统,但是ubuntu的版本建议用老师给的版本,不然可能安装过程会有一些比较头疼的事情。
但是老师给的是无图形界面的,对于大部分刚接触的同学而言,确实不够友好。所以这里也可以安装同版本的带UI版本。
我自己的话,是按照老师的流程走的,主要是当时虚拟机装了两个,内存不允许我再折腾UI版本的了😅。

2 实验一:编译系统

这个没什么好说的,就是按照老师给的流程走一遍,注意有一些包的安装,如果在编译的过程中报错说缺包,复制出错语句,搜索一下相关安装命令即可。

3 实验二

1、首先进入项目目录中的/trunk/linux-3.4.x/drivers目录下,新建一个自己的内核工程文件

cd ./trunk/linux-3.4.x/drivers    # 进入drivers目录
mkdir ghykernel					# 新建自己的工程目录,这里我起名为ghykernel

2、接着,进入该目录,新建三个工程文件xx.c,Kconfig,Makefile

cd ghykernel
touch ghykernel.c Kconfig Makefile # 第一个.c文件名称不限,Kconfig和Makefile需要严格按照这个名称,后面编译需要

接着可以在命令行输入ls命令,查看文件是否正常创建:

ls

成功创建如下:
在这里插入图片描述
3、接下来我们需要给三个文件分别写入相应的内容:

  • 首先写入.c文件
vi ghykernel.c #进入文件的读写模式,同时回车后需要按下键盘上的”I“进入插入模式

像Windows一样写入文件即可
ghykernel.c内容如下:

#include<linux/module.h>
MODULE_LICENSE("MIT");
MODULE_AUTHOR("GHY");
MODULE_DESCRIPTION("KERNEL EDIT EXAMINATION");
MODULE_VERSION("1.0");

//内核模块参数,加载时指定或者动态指定,以控制此模块的行为
static char *name ="GHY";
module_param(name,charp,S_IRUGO);
NODULE_PARAM_DESC(name,"---------now it is a print test---------");

//初始化函数,在加载时调用,分配资源准备执行环境
static int __init ghy_print_init(void){
	printk(KERN_INFO "TESTING: test case written by %s,this is kernel edit module\n",name);
	return 0;

}

//析构函数,在卸载时调用,回收资源,销毁执行环境
static void __exit ghy_print_exit(void){
	printk(KERN_INFO "TESTING: kernel test exit for %s \n",name);
}

//登记初始化函数和析构函
module_init(ghy_print_init);
module_exit(ghy_print_exit);

退出插入模式需要先按下Esc键,再按下:键,输入wq即可,再在命令行输入

cat ghykernel.c

查看文件是否正确写入并保存,正确的话,应该显示结果如下:
在这里插入图片描述

  • 接着写入Kconfig文件
    步骤同上,写入的内容如下:
config GHY_KERNEL
		tristate "HELLO GHY_KERNEL"
		default y
  • 最后写入Makefile文件
    步骤同上,写入的内容如下:
obj-y += ghykernel.o

4、返回上一层目录,修改./trunk/linux-3.4.x/drivers目录下的Kconfig文件,操作如下,注意目录填自己刚刚第一步创建的文件名:
在这里插入图片描述
同理修改目录下的Makefile文件:
在这里插入图片描述

4 实验三

1、进入./trunk/user目录下,创建文件夹:

mkdir ghyapp

2、进入该目录下,创建两个文件.c和Makefile

touch main.c Makefile

3、在创建的文件中写入内容,注意内容涉及文件名的要用自己第一步创建的文件名
main.c的内容:

#include<stdio.h>
int main(){
	printf("-----This is a TEST for APP----\n");
	//只要是c++在stdio.h支持下的代码都可以丢进去
	return 0;

}	

Makefile的内容:

CFLAGS += -ffunction-sections -fdata-sections -fPIC -std=gnu99
LDFLAGS += -Wl,--gc-sections

all : main.o Makefile
	$(CC) -o ghyapp main.o $(LDFLAGS)

main.o : main.c
	$(CC) -c main.c $(CFLAGS)

clean :
	rm -f main.o

clean-all :
	rm -f ghyapp *.o

romfs:
	$(ROMFSINST) ghyapp /bin/ghyapp

4、实验二和实验三一起编译,首先返回上层的./trunk目录,输入

./build_firmware.sh

如果报错error: expected ‘)’ before string constant可以考虑把那一句注释掉,也可以选择按照这个教程解决。
成功编译结束截图:
在这里插入图片描述
5、查找生成的目标文件
在这里插入图片描述

  • 进入./trunk/romfs/bin文件夹,查看自己实验三命名的app的c文件编译结构是否出现在这里
  • 输入rz [文件名]即可将结果保存至本机
    在这里插入图片描述
    同理进入./trunk/images目录,将总的结果文件传输回来本机
    在这里插入图片描述

5 实验四

这里主要是内核模块自己看懂,当然结合一些文档会更好。
这里我选择了静态代码分析工具Understand来对源码进行分析:

  • 安装教程
  • 使用教程

主要是考虑到代码量太大了(1w+),而且.c文件中主要介绍的是局部实现,没有全局的概念.
代码分析工具有很多种,这里我们关注的是代码转流程图,知乎有一个问题和这个类似,可以提供更多灵感,但是大部分只支持单个函数的分析或者是全局.c文件的嵌套关系的分析,只能作为一种参考。

其中page_alloc.c文件中

  • __alloc_pages_nodemask()模块的实现可以参考【文章】
  • __free_pages()模块实现注释可以参考【文章】,本质和linux内核中伙伴系统内存释放函数相似。

总体写的比较虎头蛇尾,年末摆烂了两个月(借口新冠后遗症就是“懒癌”啊哈哈哈,请大家保重身体呀,来自一整个寒假都砸咳嗽的选手碎碎念)

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

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

相关文章

大数据技术之Hadoop(Yarn)

第1章 Yarn资源调度器 我们先来思考下面几个问题&#xff1a; 1&#xff09;如何管理集群资源&#xff1f; 2&#xff09;如何给任务合理分配资源&#xff1f; Yarn是一个资源调度平台&#xff0c;负责为运算程序提供服务器运算资源&#xff0c;相当于一个分布式的操作系统平…

图形编辑器:修改图形 x、y、width、height、rotation

大家好&#xff0c;我是前端西瓜哥。图形编辑器的一个需求&#xff0c;就是可以通过属性面板的输入框设置选中元素的属性值。 项目地址&#xff0c;欢迎 star&#xff1a; https://github.com/F-star/suika 线上体验&#xff1a; https://blog.fstars.wang/app/suika/ 最终效果…

Express框架连接MongoDB数据库操作

在上一篇中已经在Node.js中引入使用了mongoose进行MongoDB数据库的基本操作&#xff0c;在本篇当中在Express框架中来连接数据库以及操作数据库&#xff1b; Express 项目环境 这里是通过全局安装Express框架生产的项目环境&#xff0c;也可以通过局部安装的方式&#xff0c;安…

【MySQL】第十一部分 SELECT的执行过程

【MySQL】第十一部分 SELECT的执行过程 文章目录【MySQL】第十一部分 SELECT的执行过程11. SELECT的执行过程11.1 SQL92语法的结构11.2 SQL92语法的结构11.3 语句执行顺序11.4 解释之前遗留问题总结11. SELECT的执行过程 11.1 SQL92语法的结构 SELECT ... FROM TABLE WHERE 多…

STM32G431—ADC+E2PROM读写实验

目录 1.ADC介绍 配置cubemx 代码 2.IIC 通信 原理图 AT24C02 代码 i2C.c 主函数 1.ADC介绍 ADC 有多达 18 个转换通道&#xff0c;其中通道 0~通道 15 是外部通道&#xff0c;使用的 GPIO 引脚如表 所示。 ADC引脚GPIO引脚GPIO配置ADC引脚GPIO引脚GPIO配置IN0PA0模拟输…

Aspose.PDF for .NET提取矢量图像的支持

Aspose.PDF for .NET提取矢量图像的支持 增加了对提取矢量图像的支持。 改进了PDF到Microsoft Excel的转换。 添加了对创建“PrinterMark”批注的支持。 增加了检测PDF文件是否包含矢量图形的功能。 Aspose.PDF for.NET是一个高级PDF处理和解析API&#xff0c;用于在跨平台应用…

Linux常用命令——setsid命令

在线Linux命令查询工具(http://www.lzltool.com/LinuxCommand) setsid 在新的会话中运行程序。 补充说明 setsid命令子进程从父进程继承了&#xff1a;SessionID、进程组ID和打开的终端。子进程如果要脱离这些&#xff0c;代码中可通过调用setsid来实现。&#xff0c;而命令…

C#中的基本概念(类_对象_属性_方法)

C#中的基本概念(类_对象_属性_方法) 对象的概念: 任何存在的实体都是对象,对象是真实存在的, 它包括“静态特征”和“动态特征” 对象包含2个方面: 静态特征:表示对象的属性,用来存储对象本身的数据 动态特征(行为):表示对象的方法,用来说明对象能做什么 例如: 一…

云服务器部署Node.js前后端分离项目

云服务器部署Node.js 前后端分离项目 准备工作 1.拥有一台服务器 自行选择阿里云&#xff0c;腾讯云… 2.重装系统 以腾讯云为例&#xff0c;安装centos 7.6系统 重置一下密码 3.使用远程管理工具 以宝塔工具为例,添加连接 4.安装宝塔面板 宝塔面板 - 简单好用的Linux…

基于ImageAI的图像识别

博主简介 博主是一名大二学生&#xff0c;主攻人工智能研究。感谢让我们在CSDN相遇&#xff0c;博主致力于在这里分享关于人工智能&#xff0c;c&#xff0c;Python&#xff0c;爬虫等方面知识的分享。 如果有需要的小伙伴可以关注博主&#xff0c;博主会继续更新的&#xff0c…

每日学术速递1.25

CV - 计算机视觉 今天带来的是北航IRIP实验室被国际计算机视觉与模式识别会议CVPR 2022接收的6篇论文。 CVPR是由IEEE主办的计算机视觉、模式识别及人工智能等领域最具影响力和最重要的国际顶级会议。CVPR官网显示&#xff0c;此次会议有超过8161篇的大会论文投稿&#xff0c;…

测试篇(三):测试用例的万能公式、对水杯和登录页面设计测试用例、测试用例的设计方法

目录一、测试用例的万能公式二、对登录页面设计测试用例三、测试用例的设计方法3.1 基于需求的设计方法3.2 等价类3.3 边界值3.4 判定表3.5 正交排列3.6 场景设计法3.7 错误猜测法四、面试真题一、测试用例的万能公式 首先&#xff0c;为"水杯"设计一个测试用例&…

计算机网络基础(二)

文章目录1. 应用层1.1 定制应用层协议1.2 网络版计算器实现1.3 应用层细分1.4 HTTP协议1.4.1 认识网址(URL)1.4.2 HTTP协议简易了解1.4.3 简易版HTTP服务器1.4.4 HTTP请求报文详解1.4.5 响应报文1.4.6 HTTP的一些安全问题1.5 HTTPS协议1.5.1 HTTPS和SSL/TLS1.5.2 短链接和长链接…

【Java|golang】1802. 有界数组中指定下标处的最大值---双指针

给你三个正整数 n、index 和 maxSum 。你需要构造一个同时满足下述所有条件的数组 nums&#xff08;下标 从 0 开始 计数&#xff09;&#xff1a; nums.length n nums[i] 是 正整数 &#xff0c;其中 0 < i < n abs(nums[i] - nums[i1]) < 1 &#xff0c;其中 0 &l…

2023年最新Python常见编程面试题(1)精选30个题目附答案

2023年最新Python面试题&#xff08;1&#xff09;之基础篇精选1.统计字符串中字符出现的次数2.获取字典key值键中小写字母对应键值对3.将字典中key变小写4.更改字典value值5.将cookies变成字典形式6.有如下字符串username把它转换成为UserName7.分别求出奇数和偶数把奇数偶数存…

NLP | 打造一个‘OpenAI智能’机器人,只需要五分钟

借用openai api,做一个聊天机器人&#xff0c;别去openai主页啦~Step 1.登录OpenAI账号网站&#xff1a;Overview - OpenAI APIStep 2.生成API key点击右上角的个人个人账户-> 点击 View API keys点击生成一个秘钥&#xff08;Create new secret key&#xff09;,并且复制St…

GameFrameWork框架(Unity3D)使用笔记(九) AssetBundle和游戏打包

目录 前言&#xff1a; 整个流程&#xff1a; 一、配置路径 二、打包 三、初始化资源 四、测试打包 前言&#xff1a; 如果使用了GameFrameWork框架的话&#xff0c;你会发现你点击Build And Run按钮打包运行大概是运行不起来的。本篇就讲了怎么打包游戏运行。 我觉得我对…

什么是YOLOR?

简述YOLOR 是一种用于对象检测的最先进的机器学习算法&#xff0c;与 YOLOv1-YOLOv5 不同&#xff0c;原因在于作者身份、架构和模型基础设施的差异。YOLOR 代表“你只学习一种表示”&#xff0c;不要与 YOLO 版本 1 到 4 混淆&#xff0c;其中 YOLO 代表“你只看一次”。 YOLO…

Docker的常用命令

文章目录 目录 文章目录 前言 一、帮助命令 二、镜像命令 1.查看镜像 2.搜索镜像 3.下载镜像 4.删除镜像 三、容器命令 1.启动容器 2.查看容器 3.退出容器 4.删除容器 5.启动和停止容器 四、常用的其它命令 后台运行 查看日志 查看容器中进程的信息 查看镜像的元数据…

lego-loam学习笔记(一)

前言&#xff1a; 主要记录配置编译lego-loam源码时遇到的问题和解决的方法。 系统&#xff1a;ubuntu18.04 一、安装gtsam 因为系统是18.04所以不需要作很大的更改&#xff0c;按照官网的doc一步一步的来就行了。 根据官网&#xff1a; GitHub - RobustFieldAutonomyLab…