risc-v 怎么使用内存呢?

news/2024/7/8 6:23:48 标签: risc-v

内存地址对齐
一般写法

#define ALIGN_4_BYTES 4
#define ALIGN_4_MASK (ALIGN_4_BYTES - 1)
//4字节地址对齐
static inline uintptr_t align_4_bytes(uintptr_t address) {
    return (address + ALIGN_4_MASK) & ~ALIGN_4_MASK;
}
//定义页大小是4k,2的12次方是4096
#define PAGE_SIZE 4096
#define PAGE_ORDER 12

//4k地址对齐
static inline ptr_t _align_page(ptr_t address) {
 ptr_t order = (1 << PAGE_ORDER) - 1;
  return (address + order) & (~order);
}

解释

1 << PAGE_ORDER =2的12方 order-1 的值是 0xFFF,它的二进制表示是 1111 1111 1111。
address加上 order(即 0xFFF 或 4095)是为了确保任何未对齐的地址在加上 order 后会超过下一个页面边界。然后,通过清空低12位,可以将地址对齐到下一个4KB边界。

示例:

对于已经对齐的地址,例如 0x1000:
0x1000 + 0xFFF = 0x1FFF
0x1FFF & 0xFFFFF000 = 0x1000(保持不变)

对于未对齐的地址,例如 0x1003:
0x1003 + 0xFFF = 0x2002
0x2002 & 0xFFFFF000 = 0x2000(对齐到下一个4KB边界)


保留页

内存就是一段数组,可以有多种使用策略,好比进入一个小区, 要先登记, 然后,有人带路不迷路。
内部的分配单位是页,保留页就是小区物业,看大门的大爷, 你大爷还是你大爷。那么需要多少的保留页呢?

  1. 管理页面状态:每个页面需要一个数据结构来存储其状态信息。
  2. 内存管理效率:集中存储页面描述符可以提高内存管理的效率。
  3. 避免内存碎片:集中存储页面描述符可以减少内存碎片。
#define PAGE_SIZE 4096

struct Page {
  uint8_t flags;
};

void calculate_reserved_pages(uint32_t length_ram) {
  uint32_t total_pages = length_ram / PAGE_SIZE;
  //向上取整,给够充足的空间
  uint32_t num_reserved_pages = (total_pages * sizeof(struct Page) + PAGE_SIZE - 1) / PAGE_SIZE;
  printf("Total pages: %u\n", total_pages);
  printf("Reserved pages: %u\n", num_reserved_pages);
}

int main() {
  uint32_t length_ram = 256 * 1024 * 1024; // 256MB
  calculate_reserved_pages(length_ram);
  return 0;
}

为开发者,我们需要保持好奇心和学习热情,不断探索新的技术,只有这样,我们才能在这个快速发展的时代中立于不败之地。介绍一款程序员都应该知道的软件JNPF快速开发平台,很多人都尝试用过它,它是功能的集大成者,任何信息化系统都可以基于它开发出来。

JNPF可以实现应用从创建、配置、开发、测试到发布、运维、升级等完整生命周期的管理。减少了传统应用程序的代码编写量,通过图形化、可视化的界面,以拖放组件的方式,即可快速生成应用程序的产品,大幅降低了开发企业管理类软件的难度。

感谢阅读本文

如果有什么建议,请在评论中让我知道。我很乐意改进。

 


http://www.niftyadmin.cn/n/5536740.html

相关文章

AGI|Transformer自注意力机制超全扫盲攻略,建议收藏!

一、前言 2017年&#xff0c;谷歌团队推出一篇神经网络的论文&#xff0c;首次提出将“自注意力”机制引入深度学习中&#xff0c;这一机制可以根据输入数据各部分重要性的不同而分配不同的权重。当ChatGPT震惊世人时&#xff0c;Transformer也随之进入大众视野。一夜之间&…

蓝桥杯开发板STM32G431RBT6高阶HAL库学习FreeRtos——完成第一个小项目点灯

一、配置LED引脚(注意引脚都配置为高电平) 二、新建两个任务&#xff0c;一个为动态创建&#xff0c;一个静态创建&#xff08;以后大多数情况进行动态创建&#xff09;//将两个优先级设置成一样 补充&#xff1a; 1.FreeRTOS创建静态任务和动态任务的各自优缺点 静态任务和动…

opencv第一课-cnblog

opencv第一课 创建窗口 import timeimport cv2 #创建窗口 cv2.namedWindow(window,cv2.WINDOW_NORMAL)#cv2.WINDOW_AUTOSIZE自动大小&#xff0c;不允许修改窗口大小#更改窗口的大小 cv2.resizeWindow(window,800,600)#展示名字为window的窗口 cv2.imshow(window,0)key cv2.w…

用免费的可视化工具制作3D智慧城市大屏,融合数字孪生,引领数据升级

在如今数据驱动的时代&#xff0c;越来越多的场景中都有可视化大屏的身影&#xff0c;许多企业和政府部门也从常规的二维看板渐渐地转向更加炫酷&#xff0c;立体的3D可视化大屏。3D可视化大屏成为了展示复杂数据、实时监控业务动态的重要工具。本文将详细介绍如何使用免费的数…

Websocket通信实战项目(图片互传应用)+PyQt界面+python异步编程(async) (上)服务器端python实现

Rqtz : 个人主页 ​​ 共享IT之美&#xff0c;共创机器未来 ​ Sharing the Beauty of IT and Creating the Future of Machines Together 目录 项目背景 ​编辑​专有名词介绍 服务器GUI展示 功能(位置见上图序号) 客户端GUI展示&#xff08;h5cssjs&#xf…

2024.07使用gradle上传maven组件到central.sonatype,非常简单

sonatype Uploader 2.6新版本传送门 本文基于sonatypeUploader2.0版本 在1.0版本我们还需要手动去添加maven-publish和signing插件&#xff0c;在2.0版本他已经内置了&#xff0c;如果你仍然需要手动配置&#xff0c;你可以手动添加这两个插件及逻辑。 具体信息参考开源仓库&…

iCloud照片库全指南:云端存储与智能管理

iCloud照片库全指南&#xff1a;云端存储与智能管理 在数字化时代&#xff0c;照片和视频成为了我们生活中不可或缺的一部分。随着手机摄像头质量的提升&#xff0c;我们记录生活点滴的方式也越来越丰富。然而&#xff0c;这也带来了一个问题&#xff1a;如何有效管理和存储日…

从硬件角度看Linux的内存管理

1. 分页机制 分段机制的地址映射颗粒度太大&#xff0c;以整个进程地址空间为单位的分配方式导致内存利用率不高。 分页机制把这个分配机制的单位继续细化为固定大小的页(Page)&#xff0c;进程的虚拟地址空间也按照页来分割&#xff0c;这样常用的数据和代码就可以以页为单位…