zoukankan      html  css  js  c++  java
  • 龙芯地址空间

    https://www.cnblogs.com/cmlighters/p/loongson_address_resolution.html

    https://blog.csdn.net/qq_26989627/article/details/109107667

    https://blog.csdn.net/Life_Maze/article/details/97916874

    用户态核心态
    其实所谓的用户态和核心态是针对CPU来说,cpu处于核心态时其访问特权比较大,用户态是访问特权小,那用户态核心态如何
    https://www.cnblogs.com/Allen-rg/p/7171105.html

    Q5: 用户态和内核态的内存地址空间
    A: MIPS除了用户态,还有内核态,在内核态下可以访问全部资源如CP0、MMU等;而用户态用户态是不可以访问这些的。

    那用户态核心态如何切换,每次访问前都要切换下CPU所处的状态?

    mips体系架构问答?
    https://www.cnblogs.com/blogernice/articles/9856255.html

    CPU拿到地址(虚拟地址),其转换过程如下步骤:
    (1) 判断当前是kernel mode还是user mode
    (2) 如果是kernel mode
    (A) 访问的地址是kuseg或者kseg2,进行 TLB 查找;如果查找不成功,exception。如果查找成功,得到物理地址
    (B) 如果访问的地址是 kseg0/kseg1,不进行TLB 查找;通过减去一个偏移量得到物理地址
    (3) 如果是user mode
    (A) 访问地址kuseg,进行TLB 查找。如果查找不成功,exception。如果查找成功,得到物理地址
    (B) 访问kseg0/1/2,exception

    mips地址空间,地址映射基本概念。
    https://www.cnblogs.com/hzl6255/archive/2012/10/10/2717799.html

    为什么启动入口向量是0xBFC00000?(这个原因也解释了为什么star.s中定义的链接地址是0xbfc00000)
    将地址的高三位清零可映射到相应的物理地址上,与kseg0映射的物理地址一样,但kseg1是非cache存取的。kseg1是唯一在系统重启时能正常工作的地址空间。这也是为什么启动入口向量是0xBFC00000,这个向量对应的物理地址是0x1FC00000,因此要使用这个地址区域去存取初始的程序ROM

    pmon中为何需要做mmu tlb映射表?
    mmu对应的地址的访问权限和cpu的状态相关核心态还是用户态,那pmon中如果不使用kseg2kuseg,为何还要做mmu,因为这个表格做好后是给操作系统os做的

    以龙芯2F为例
    总结:龙芯2k物理地址空间为
    0-0FFFFFFF (0-256M)
    0x90000000-0xFFFFFFFF(256M-2G)

    虚拟地址空间:
    kuseg:0x0000 0000-0x7FFF FFFF(低端2G) :用户太可用地址,必须通过MMU进行地址映射后才能正常访问。

    kseg0:0x8000 0000 - 0x9FFF FFFF(512M):最高位清零就是对应的物理地址,映射到连续的低端512M物理地址。该地址空间通过高速缓存存取,主要用来存放操作系统核心。由于物理地址不连续所以,虚拟地址(0x80000000~0x80000000+256M)==>对应物理地址0-0xFFFFFFF (0-256M,即低端256M) 虚拟地址(0x900000000x90000000+256M)=====>对应物理地址(0x900000000x90000000+256M),pmon起来后由于256M-512M是寄存器空间,所以只能使用低端256M物理内存

    kseg1:0xA000 0000 - 0xBFFF FFFF(512M):高3位清零就是对应的物理地址,映射到连续的低端512M物理地址。该地址空间不通过高速缓存存取,该区域主要用做I/O寄存器,系统ROM和启动时入口向量(0xBFC00000)就存于这个地址段内,因为系统启动时cache还未进行初始化。
    kseg1:0xC000 0000 - 0xFFFF FFFF (1G):该地址段只能在核心态使用,并且需要经过MMU转换

    pmon代码搬家
    把固件本身从 ROM( SPI nor flash)拷贝到内存 RAM 中
    上电时, CPU 映射了 1M 的 Boot 内存到 SPI( NOR FLASH)或 NAND( FLASH),可是这部分内存是只读的,并且不经过
    cache。当内存和 cache 初始化完成后,需要将 ROM(位于 kseg1 地址段)上的代码拷贝到 kseg0 地址段内, kseg0 上的内
    存可写,同时经过 cache,还有利于提高性能。
    链接时指定的起始地址为 0x80010000,而上电后运行的起始地址是 0xBFC00000,所以在拷贝时需要做地址修正。

    -------------------------------------- 适合自己的才是最好的!-----------------------------------------
  • 相关阅读:
    内存分配方式与变量的生存周期【转】
    C++动态内存创建与内存管理学习笔记【转】
    C内存分配问题(内存达人请进)【转】
    Singular Value Decomposition(SVD)奇异值分解【转】
    Euclidean space欧几里得空间【转】
    C语言面试题汇总(华为公司) 【转】
    C语言内存分配问题和C语言中的内存【转】
    iPhone无法在Mac的Finder中显示?如何解决问题
    OGRE 入门 三、Basic Tutorial 2 : Cameras, Lights, and Shadows
    leetcode 一个算法面试题相关的网站
  • 原文地址:https://www.cnblogs.com/retry/p/14484461.html
Copyright © 2011-2022 走看看