修改openeuler系统uio映射内存读写权限方法一览表

在 openEuler 系统中,要修改 UIO 驱动映射的内存区域的读写属性,可以通过以下几个方法来实现,具体方法取决于你使用的 UIO 驱动类型和是否需要对设备树进行更改。

### 方法 1:使用设备树(DTS)配置读写属性

对于通过设备树配置的 UIO 设备,可以在设备树中设置内存的读写属性。在设备树中,通常使用 `reg` 属性指定内存区域。确保配置的内存区域属性支持读写。

#### 示例设备树配置

```dts
uio_device@0 {
    compatible = "generic-uio";       // 使用通用 UIO 驱动
    reg = <0x40000000 0x1000>;        // 设备的起始地址和大小
    memory-region = <&some_memory>;   // 指向设备所用的内存区域
};
```

确保 `memory-region` 指定的内存区域在硬件设计上是可读写的。如果系统中的设备树没有提供 `memory-region` 属性或指定了只读区域,那么需要通过更新设备树来更改。

### 方法 2:修改驱动中的内存映射权限

如果需要对 UIO 驱动代码进行更深层次的控制,可以在 `uio_pdrv_genirq` 驱动源码中手动更改内存的映射权限。`uio_pdrv_genirq` 是 Linux 系统中的一个通用 UIO 驱动模块,openEuler 也是基于 Linux 内核的,可以按以下方式操作:

1. 获取 UIO 驱动源码,找到 `uio_pdrv_genirq.c` 文件。
2. 定位到设备内存映射代码,例如在 `uio_pdrv_genirq` 中可以设置 `mmap` 函数中传入的访问权限。
3. 在 `uio_pdrv_genirq.c` 文件的 `uio_pdrv_genirq_mmap` 函数中,确保 `mmap` 函数中的权限参数包含 `PROT_READ | PROT_WRITE`。

例如:
```c
vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);
vma->vm_flags |= VM_SHARED | VM_READ | VM_WRITE;
```

完成后重新编译并加载修改后的驱动。

### 方法 3:在用户空间代码中指定读写权限

在不修改驱动的前提下,可以直接在用户空间的 `mmap` 调用中指定 `PROT_READ | PROT_WRITE` 以确保映射内存为读写权限。

```c
void *mapped_mem = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, uio_fd, 0);
```

### 方法 4:修改内核中的内存保护权限

在特殊情况下,可以通过更改内核配置或重写内存保护策略,来允许对某些内存区域的写访问。不过,这通常仅适用于开发和调试环境,在生产环境下建议直接通过设备树和驱动修改以确保稳定性。

### 总结

1. **设备树 (DTS)**:确保 `memory-region` 所指向的内存区域为读写权限。
2. **驱动代码修改**:如果使用 `uio_pdrv_genirq` 驱动,可以在 `uio_pdrv_genirq.c` 中修改 `mmap` 的权限。
3. **用户空间控制**:在用户空间代码中使用 `PROT_READ | PROT_WRITE` 来映射可写内存。

这些方法可以确保在 openEuler 系统中成功映射出具有读写权限的内存。

 

在 openEuler 系统中,要查看 UIO 设备的 DTS(设备树)配置,可以使用以下几个方法来查看系统中加载的设备树内容和 UIO 设备的详细信息。

### 方法 1:使用 `dtc` 工具反编译设备树

1. **提取设备树文件**:
   通常,设备树会在系统启动时加载到 `/sys/firmware/devicetree/base`,你可以将其转换为人类可读的设备树文件。

2. **反编译设备树**:
   使用 `dtc`(设备树编译器)工具,将 `/sys/firmware/devicetree/base` 目录中的二进制设备树文件反编译成文本格式。

   ```bash
   dtc -I fs -O dts /sys/firmware/devicetree/base -o extracted_device_tree.dts
   ```

   这将生成一个名为 `extracted_device_tree.dts` 的文件,其中包含系统当前加载的设备树内容。

3. **查找 UIO 设备**:
   打开生成的 `extracted_device_tree.dts` 文件,查找相关的 UIO 设备节点。一般情况下,UIO 设备节点会使用 `compatible = "generic-uio";`。

   ```bash
   grep -A 10 "generic-uio" extracted_device_tree.dts
   ```

   这样可以快速定位 UIO 设备的节点配置。

### 方法 2:直接查看设备树中的 UIO 配置

如果不安装 `dtc` 工具,也可以直接查看 `/sys/firmware/devicetree/base` 中的相关信息。

1. **定位 UIO 设备节点**:
   进入 `/sys/firmware/devicetree/base` 目录,该目录层级结构对应设备树节点结构。

   ```bash
   cd /sys/firmware/devicetree/base
   ```

2. **查找 UIO 节点**:
   使用以下命令查找包含 `uio` 的节点。

   ```bash
   grep -rl "generic-uio" .
   ```

   这个命令会列出所有包含 `generic-uio` 的文件路径,表示系统中与 UIO 设备相关的节点位置。

3. **读取节点详细信息**:
   找到具体路径后,可以使用 `cat` 命令查看节点的配置信息。例如:

   ```bash
   cat /sys/firmware/devicetree/base/soc/uio_device@0/compatible
   cat /sys/firmware/devicetree/base/soc/uio_device@0/reg
   ```

   其中,`compatible` 字段应显示为 `generic-uio`,`reg` 字段则显示该设备的内存地址和大小等信息。

### 方法 3:通过 `ls` 和 `xxd` 查看设备树二进制数据

如果 `reg`、`interrupts` 等字段内容以二进制形式存储,可以使用 `xxd` 来查看。

```bash
xxd /sys/firmware/devicetree/base/soc/uio_device@0/reg
```

这样可以得到内存地址和大小的十六进制值。

### 方法 4:使用 `find` 查找所有 UIO 设备

可以使用以下命令找到系统中的所有 UIO 设备信息:

```bash
find /sys/class/uio
```

每个 `/sys/class/uio/uioX` 目录对应一个 UIO 设备,可以进入相关目录查看 `name`、`maps/map0/addr` 等文件,来获取设备的详细信息。

### 总结

在 openEuler 系统中可以通过以下方式查看 UIO 设备的 DTS 配置:
1. 使用 `dtc` 工具反编译设备树。
2. 直接查阅 `/sys/firmware/devicetree/base` 下的设备树文件。
3. 使用 `xxd` 查看二进制格式的配置字段。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值