Linux C代码向内存页写入示例
给一个Linux向一个page写内容的c代码demo
以下是一个在 Linux 中使用 C 语言向内存页写入内容的示例代码。该程序通过 mmap
分配一个内存页,向其中写入数据,并演示基本操作:
1 |
|
关键步骤说明:
- 获取页大小:使用
sysconf(_SC_PAGESIZE)
动态获取系统内存页大小(通常为 4096 字节)。 - 内存映射:通过
mmap
分配匿名内存页,设置PROT_READ | PROT_WRITE
权限允许读写,MAP_ANONYMOUS
表示不关联文件。 - 写入数据:使用
memcpy
将字符串复制到内存页,确保不超过页大小。 - 释放内存:使用
munmap
释放映射的内存页。
编译与运行:
1 | gcc page_write.c -o page_write |
输出示例:
1 | 成功分配内存页,地址: 0x7f8c5e2e6000 |
注意事项:
- 匿名映射:此示例使用
MAP_ANONYMOUS
,内存页不关联到文件,仅存在于进程内存中。 - 错误处理:检查
mmap
返回值是否为MAP_FAILED
,并处理可能的错误(如内存不足)。 - 页大小适配:代码动态获取页大小,确保在不同系统上兼容。
- 内存安全:写入数据时需确保不越界,避免内存损坏。
如需操作文件映射页,可修改 mmap
参数,传入文件描述符并移除 MAP_ANONYMOUS
标志。
给一个Linux内核态,向page写内容的c代码demo
以下是一个简单的 Linux 内核模块示例,演示在内核态向内存页写入内容的操作:
1 |
|
关键点说明:
内存分配:
- 使用
alloc_page(GFP_KERNEL)
分配单个物理页 - GFP_KERNEL 标志允许在需要时触发直接内存回收
- 使用
地址映射:
kmap()
将物理页映射到内核虚拟地址空间- 对于高端内存(32位系统),可能需要特殊处理
- 使用后必须用
kunmap()
解除映射
数据写入:
- 使用内核的
strncpy
进行安全拷贝 - 写入长度不应超过
PAGE_SIZE
(通常4096字节)
- 使用内核的
资源释放:
- 必须显式释放分配的页面
- 实际驱动中可能需要保持页面长期有效
编译与测试:
创建 Makefile:
1
2
3
4
5obj-m += page_writer.o
all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean编译和加载模块:
1
2
3
4make
sudo insmod page_writer.ko
dmesg | tail # 查看输出
sudo rmmod page_writer
输出示例:
1 | [ 1234.567890] Written to page: Hello from Kernel Space! |
注意事项:
内存管理:
- 内核态没有自动内存回收机制
- 必须严格配对
alloc_page
/__free_page
和kmap
/kunmap
并发安全:
- 在多核环境下需考虑锁机制(如
spin_lock
) - 本示例未包含同步机制,实际使用时需根据场景添加
- 在多核环境下需考虑锁机制(如
地址类型:
- 物理地址使用
page_to_phys(page)
转换 - 虚拟地址映射后的有效性仅限于当前上下文
- 物理地址使用
错误处理:
- 必须检查所有可能失败的操作
- 使用
pr_err
输出错误信息到系统日志
该代码展示了内核态内存操作的基本模式,实际使用时需要根据具体需求添加同步机制、错误恢复等功能。对于高性能场景,可能需要使用 kmap_atomic
等原子映射方法。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Helloeuler!