Lab4_1树莓派上增加一个Linux系统调用

本文介绍如何在树莓派上修改Linux内核源码以增加一个自定义的带参数系统调用,包括下载源码、配置编译环境、内核编译及模块安装等步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

教程目的:

  • 修改RPi上的Linux源码,增加一个带参数的系统调用。

教程器材及软件:

  1. 树莓派的板子。
  2. SD卡(已经有镜像刷入)。
  3. 电源线及USB充电器。
  4. U盘或USB硬盘
  5. putty和psftp。
  6. 有DHCP的网线。

教程步骤:

下载源代码:

  1. mkdir rpi
    cd rpi
    git clone git://github.com/raspberrypi/firmware.git PRiFirmware #由于我是换了相同版本的内核,所以这一步是不需要的,以下都将忽略这一步。
    git clone git://github.com/raspberrypi/linux.git RpiLinux
    git clone git://github.com/raspberrypi/tools.git RpiTools
  2. 然后,就等吧。我这里下载特别慢,每秒钟5KB的样子。然后,就是等了一晚上。

获取配置文件:

  1. 登录到树莓派上,将/proc/config.gz文件拷贝到家目录下。
  2. 查看版本情况:

  3. 将树莓派上的SD拔下来,插入到电脑中的SD卡槽中,在rpi文件夹下建一个sd1目录和sd2目录。
    mkdir sd1
    mkdir sd2
  4. 接着,在/dev目录下找找sd卡的设备名。将其挂载到sd1和sd2目录上。
  5. 到sd2中找到,sd2/home/pi/config.gz文件,将其解压缩到RpiLinux文件夹中,并将名字改为.config。
    zcat sd2/home/pi/config.gz >RpiLinux/.config

添加一个系统调用:

  1. 进入到RpiLinux/arch/arm/kernel.
  2. 新建一个hello.c:
  3. #include <linux/export.h>
    #include <linux/mm.h>
    #include <linux/utsname.h>
    #include <linux/mman.h>
    #include <linux/reboot.h>
    #include <linux/prctl.h>
    #include <linux/highuid.h>
    #include <linux/fs.h>
    #include <linux/kmod.h>
    #include <linux/perf_event.h>
    #include <linux/resource.h>
    #include <linux/kernel.h>
    #include <linux/kexec.h>
    #include <linux/workqueue.h>
    #include <linux/capability.h>
    #include <linux/device.h>
    #include <linux/key.h>
    #include <linux/times.h>
    #include <linux/posix-timers.h>
    #include <linux/security.h>
    #include <linux/dcookies.h>
    #include <linux/suspend.h>
    #include <linux/tty.h>
    #include <linux/signal.h>
    #include <linux/cn_proc.h>
    #include <linux/getcpu.h>
    #include <linux/task_io_accounting_ops.h>
    #include <linux/seccomp.h>
    #include <linux/cpu.h>
    #include <linux/personality.h>
    #include <linux/ptrace.h>
    #include <linux/fs_struct.h>
    #include <linux/file.h>
    #include <linux/mount.h>
    #include <linux/gfp.h>
    #include <linux/syscore_ops.h>
    #include <linux/version.h>
    #include <linux/ctype.h>
    
    #include <linux/compat.h>
    #include <linux/syscalls.h>
    #include <linux/kprobes.h>
    #include <linux/user_namespace.h>
    
    #include <linux/kmsg_dump.h>
    /* Move somewhere else to avoid recompiling? */
    #include <generated/utsrelease.h>
    
    #include <asm/uaccess.h>
    #include <asm/io.h>
    #include <asm/unistd.h>
    
    
    void sys_my_syscall()
    {
    	printk("Hello World!\n");
    }
    
  4. 在Makefile中添加hello.o:
  5. 在call.S中添加223号中断:

编译内核:

  1. 先需要对内核配置一下:
    export CCPREFIX=../RpiTools/arm-bcm2708/arm-bcm2708hardfp-linux-gnueabi/bin/arm-bcm2708hardfp-linux-gnueabi-
    make ARCH=arm CROSS_COMPILE=${CCPREFIX} oldconfig
  2. 编译内核:
    make ARCH=arm CROSS_COMPILE=${CCPREFIX} -j3
  3. 上面的-j3表示用3个线程同时进行编译,你可以增加这个数。一个建议的选择是cpu核数+1。我的机器比较差,用了30多分钟,好的机器大约只要15分钟。
  4. 编译完的内核现在还不能用要先处理一下:
  5. cd ../RpiTools/mkimage/
    ./imagetool-uncompressed.py ../../RpiLinux/arch/arm/boot/zImage

安装内核及模块:

  1. 将模块 先安装到一个临时的地方:
    cd ../..
    mkdir modules
    cd RpiLinux/
    make modules_install ARCH=arm CROSS_COMPILE=${CCPREFIX} INSTALL_MOD_PATH=../modules
  2. 保存原有系统的内核与模块:
    cd ../sd1
    sudo mv kernel.img kernel_old.img
    cd ../sd2
    sudo mv /lib/firmware /lib/firmware_old
    sudo mv /lib/modules /lib/modules_old
  3. 安装新的:
    cd ..
    sudo cp RpiTools/mkimage/kernel.img sd1/kernel.img
    sudo cp -r modules/lib sd2/

测试:

  1. 将SD卡插回到树莓派中,启动。
  2. 编写1.c测试:
    #define sys_hello() {__asm__ __volatile__ ("swi 0x900000+223\n\t");}while(0)
    
    #include <stdio.h>
    int main(void)
    {
        printf("start hello\n");
        sys_hello();
        printf("end hello\n");
    }
    
  3. 编译运行:

后记:

因为之前搭了一个cygwin的交叉编译环境,所以想在cygwin下编译内核。但毕竟只是虚拟的一个环境,还是有很多不一致的地方。第一个现象是特别慢,可能的原因在于cygwin所虚拟的fork比较慢,差不多编译了两个小时都没有完成。第二个遇到的情况是windows是大小写不敏感的,所以ipt_ECN.c和ipt_ecn.c它会认为是同名文件。内核中恰巧有这样的文件,单单大小写不一样,这样就导致编译内核的时候,会出现错误。后来,我通过修改文件名的方法,绕过了这个错误。但是,还是出现了其他错误,说是logo_linux_clut224.c没有依赖可以生成它,我看到makefile中有依赖说是只要有logo_linux_clut224.ppm就可以生成它。但是,结果就是make说没有。然后,这事就进行不下去了。最终,就换到了linux去做。linux下反正很简单,一步步按教程来就可以了。

参考:

http://aguegu.net/?p=1544

http://elinux.org/RPi_Kernel_Compilation

备注:

此为浙江大学计算机学院嵌入式系统课程实验报告。

<think>好的,我现在需要帮用户在树莓派上部署YOLOv8模型。首先,我得回顾一下用户提供的引用资料,看看有没有相关的步骤或者提示。 根据引用[3],树莓派需要安装opencv-python、torch、torchvision和Ultralytics。用户可能需要先安装这些依赖库。不过安装PyTorch在树莓派上可能会比较麻烦,因为官方的PyTorch可能不支持ARM架构,可能需要找预编译的版本或者从源码编译,这可能会很耗时。 引用[5]提到了使用Ultralytics库的训练代码,说明YOLOv8可能需要这个库的支持。而引用[4]中的用户成功在树莓派上运行了YOLOv8,并使用了Jupyter Lab来执行预测。这说明安装Ultralytics库是必须的,但可能需要特定的环境设置。 另外,引用[2]和[1]提到了使用OpenVINO和NCS2来部署模型,但用户的问题是关于YOLOv8的,不确定是否需要转换模型格式。不过YOLOv8可能直接支持ONNX或其他格式,所以可能需要先导出模型,再在树莓派上加载。 步骤应该是这样的:首先安装依赖项,比如Python环境、OpenCV、PyTorch(适用于ARM)、Ultralytics库。然后导出训练好的YOLOv8模型为适合树莓派的格式,比如ONNX。接着在树莓派上编写推理代码,使用Ultralytics的API加载模型并进行预测。同时要注意性能优化,比如使用OpenCV的DNN模块或者OpenVINO加速。 可能会遇到的问题包括PyTorch在树莓派上的兼容性、模型转换的步骤是否正确、推理速度是否足够快。用户可能需要简化模型结构或者使用量化来提升速度。另外,引用[4]提到了使用Jupyter Lab,所以安装Jupyter可能也是步骤之一,但用户可能更倾向于直接运行Python脚本。 需要确保所有步骤都基于用户提供的引用,特别是引用[3]、[4]、[5]中的内容,比如安装Ultralytics,配置环境,加载模型等。可能需要指导用户如何正确安装这些库,处理可能的依赖冲突,以及示例代码的结构。</think>### 在树莓派上部署 YOLOv8 模型的步骤 #### 1. **安装依赖环境** - **Python 环境**:树莓派默认已安装 Python,建议使用 Python 3.7+。 - **安装 OpenCV**: ```bash sudo apt-get install python3-opencv ``` 或通过 pip 安装: ```bash pip install opencv-python-headless ``` - **安装 PyTorch**: 树莓派需安装 ARM 兼容的 PyTorch 版本。可从预编译的 `.whl` 文件安装(如 `torch-1.10.0-cp37-cp37m-linux_armv7l.whl`),需根据系统版本选择文件[^3]。 ```bash pip install torch torchvision --extra-index-url https://download.pytorch.org/whl/arm ``` - **安装 Ultralytics 库**: ```bash pip install ultralytics ``` #### 2. **准备 YOLOv8 模型** - **训练或下载预训练模型**: 使用官方脚本训练模型(需在 PC 端完成)[^5]: ```python from ultralytics import YOLO model = YOLO('yolov8n.yaml') model.load('yolov8n.pt') model.train(data='data.yaml', epochs=100, imgsz=640) ``` - **导出为 ONNX 格式**(可选): 若需优化推理速度,可将模型转换为 ONNX: ```python model.export(format="onnx") ``` #### 3. **部署到树莓派** - **加载模型**: 将训练好的 `.pt` 或 `.onnx` 模型文件传输到树莓派。 - **编写推理代码**: 使用 Ultralytics 接口调用模型(示例)[^4]: ```python from ultralytics import YOLO import cv2 model = YOLO('yolov8n.pt') # 或 'yolov8n.onnx' results = model.predict(source='input.jpg', save=True) print(results[0].boxes) # 输出检测结果 ``` - **运行脚本**: ```bash python3 detect.py ``` #### 4. **性能优化** - **使用 OpenVINO 加速**: 安装 OpenVINO 工具包并转换模型为 IR 格式[^2]: ```bash pip install openvino-dev mo --input_model yolov8n.onnx ``` 加载 IR 模型: ```python from openvino.runtime import Core core = Core() model_ir = core.read_model("yolov8n.xml") ``` - **调整输入分辨率**: 降低 `imgsz` 参数(如 320x320)以提升速度。 - **轻量化模型**: 使用 `yolov8n`(Nano)或剪裁后的自定义模型。 --- ### 常见问题解决 - **依赖冲突**:若安装失败,尝试创建虚拟环境: ```bash python3 -m venv yolov8_env source yolov8_env/bin/activate ``` - **NCS2 加速**:若使用神经计算棒,需配置 OpenVINO 和 USB 驱动[^1][^2]。 - **内存不足**:关闭后台进程,或使用轻量级系统(如 Raspberry Pi OS Lite)。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值