驱动模块传参实验

1.概要

2.代码

1.parameter.c

#include <linux/init.h>
#include <linux/module.h>
static int number;//定义 int 类型变量 number
static char *name;//定义 char 类型变量 name
static int para[8];//定义 int 类型的数组
static char str1[10];//定义 char 类型字符串 str1
static int n_para;//定义 int 类型的用来记录 module_param_array 函数传递数组元素个数的变量 n_para
module_param(number, int, S_IRUGO);//传递 int 类型的参数 number,S_IRUGO 表示权限为可读
module_param(name, charp, S_IRUGO);//传递 char 类型变量 name
module_param_array(para , int , &n_para , S_IRUGO);//传递 int 类型的数组变量 para
module_param_string(str, str1 ,sizeof(str1), S_IRUGO);//传递字符串类型的变量 str1
static int __init parameter_init(void)//驱动入口函数
{
static int i;
printk(KERN_EMERG "%d\n",number);
printk(KERN_EMERG "%s\n",name);
for(i = 0; i < n_para; i++)
{
printk(KERN_EMERG "para[%d] : %d \n", i, para[i]);
}
printk(KERN_EMERG "%s\n",str1);
return 0;
}
static void __exit parameter_exit(void)//驱动出口函数
{
printk(KERN_EMERG "parameter_exit\n");
}
module_init(parameter_init);//注册入口函数
module_exit(parameter_exit);//注册出口函数
MODULE_LICENSE("GPL v2");//同意 GPL 开源协议
MODULE_AUTHOR("topeet");

2. Makefile

export ARCH=arm64#设置平台架构
export CROSS_COMPILE=aarch64-none-linux-gnu-#交叉编译器前缀
obj-m += parameter.o #此处要和你的驱动源文件同名
KDIR :=/home/topeet/Linux/linux_sdk/kernel #这里是你的内核目录
PWD ?= $(shell pwd)
all:
make -C $(KDIR) M=$(PWD) modules #make 操作
clean:
make -C $(KDIR) M=$(PWD) clean #make clean 操作

3.运行结果

insmod parameter.ko number=100 name="topeet" para=0,1,2,3,4,5,6,7 str="itop"

燕山大学的汇编语言实验通常作为计算机相关专业(如计算机科学与技术、软件工程、自动化等)的重要实践环节,旨在帮助学生掌握8086/8088微处理器的汇编语言编程方法,理解底层硬件与程序之间的交互机制。以下是关于燕山大学汇编语言实验常见内容和操作指导的整理: --- **实验环境搭建** 燕山大学汇编语言实验多基于DOS或DOSBox模拟环境,使用MASM(Microsoft Macro Assembler)进行汇编程序的编写与调试。 - **常用工具**: - MASM 5.0 或 MASM 6.15 - EDIT 或记事本编写源代码 - DOSBox 模拟 DOS 环境(适用于现代操作系统) - **实验平台配置步骤**: 1. 安装并配置 DOSBox 软件。 2. 将 MASM 工具包挂载到 DOSBox 的虚拟驱动器中(如 C:\masm)。 3. 使用 `cd` 命令进入 MASM 目录。 4. 编写 `.asm` 源文件,使用 `masm.exe` 进行汇编,`link.exe` 进行链接,`debug.exe` 或 `exe2bin` 进行调试。 --- **典型实验内容示例** 1. **数据传送实验** - 实验目的:掌握 MOV 指令的使用,理解寄存器、内存、段地址之间的数据传输。 - 示例代码: ```asm DATA SEGMENT BUF DB 'HELLO, WORLD!$' DATA ENDS CODE SEGMENT ASSUME CS:CODE, DS:DATA START: MOV AX, DATA MOV DS, AX LEA DX, BUF MOV AH, 09H INT 21H MOV AH, 4CH INT 21H CODE ENDS END START ``` 2. **算术运算实验** - 实现加减乘除运算,如多位十进制数相加,利用 ADC(带进位加法)处理进位。 - 关键指令:ADD、ADC、SUB、MUL、DIV 3. **分支与循环结构实现** - 使用条件转移指令(JE、JNE、JG、JL 等)实现高级语言中的 if-else 和循环结构。 - 示例:统计字符串中字母个数。 4. **子程序设计实验** - 掌握 CALL 和 RET 指令,实现模块化编程。 - 参数传递方式:寄存器传参、堆栈传参。 5. **中断与系统调用** - 使用 INT 21H 实现键盘输入、屏幕输出等基本功能。 - 常见功能号: - AH=01H:读取字符(回显) - AH=02H:输出字符 - AH=09H:输出字符串(需以 '$' 结尾) - AH=4CH:程序终止返回 DOS 6. **综合实验:学生成绩排序或字符串处理** - 输入多个学生成绩,使用冒泡排序算法进行排序并输出。 - 或实现字符串大小写转换、查找字符等功能。 --- **调试技巧** - 使用 DEBUG 工具单步执行(T 命令)、查看寄存器(R)、查看内存(D)。 - 利用断点(在 DEBUG 中通过设置 IP 位置)观察程序流程。 - 注意段寄存器初始化(CS、DS、SS),避免因段地址错误导致运行异常。 --- **常见问题及解决方法** - **“Out of Memory” 错误**:检查程序是否正确结束(是否有 `MOV AH, 4CH` 和 `INT 21H`)。 - **显示乱码**:确保字符串以 '$' 结尾,特别是 INT 21H 功能调用。 - **无法运行 .EXE 文件**:尝试生成 .COM 文件(小模式,代码段 ≤ 64KB),使用 TINY 模型。 ```asm MODEL TINY CODE SEGMENT ORG 100H ; .COM 文件起始偏移 ... CODE ENDS END START ``` --- **实验报告撰写建议** - 包含:实验目的、实验环境、程序流程图、源代码、调试过程、运行结果截图、问题分析。 - 源代码需添加详细注释,说明每条关键指令的作用。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值