方法论1 :本人主张用通俗、简短的语言来描述一个知识点。通过归纳总结,将知识用自己的语言文字表达出来。学习=时间+方法+归纳总结。
方法论2:以为自己知道了–>发现自己不知道–>知其用法–>知其原理–>反复熟练细节–>思考为何是这样设计的–>能够设计出类似的东西
前言 :
程序的本质:一个大循环。如何充分利用这个大循环,协同完成一个复杂的功能,需要精美的程序结构设计。
SOC(含单片机) 的本质:一个计算控制单元+总线+“外设”。计算控制单元通过总线系统,控制各个外设寄存器的读和写,从而控制各个外设的工作。这里的外设指计算控制单元外的一切。
片内外设的本质:片内外设是集成电路设计人员在芯片内部设计的可以完成一个独立功能的电路单元。外设通过总线接口,挂在总线上面,从而可以受到CPU(单指计算控制单元)的控制。
个人理解难免有时会存在偏差,请指正。座右铭:一生万物,而万物归一。
MMU:
- 作用:讲CPU发出的访存地址(虚拟地址)转换为总线上的物理地址。
- 基本构成:
- 页表
- TBL的作用:缓存最近访问的页表项;
- cache:
- MMU属于CPU核的一部分。(疑问:4核处理器有4个MMU?)

linux相关基本知识
- Linux的虚拟地址划分:1G用于内核(高地址范围),3G用于用户;
- Linux进程的页表:页表的前面1G内容相同,即所有进程的1G内存都映射到相同的物理地址上。
- 驱动如果需要访问一个外设的绝对物理地址:需要使用ioremap函数进行映射,该函数会修改页表,将该物理地址映射到对应的虚拟地址(内核空间)上面。(在一个进程中,同一个(一组)寄存器可以多次ioremap,每次ioremap,都会为其建立新的页表,即也会有不同的虚拟地址。但这些虚拟地址都是映射的同一片物理地址,所以无论操纵那一个ioremap返回的虚拟地址,最终都操作能够的是那块物理地址。即页表中会存在相同的页表项)
64位操作系统下的虚拟内存空间大小:
地址空间大小不是232,也不是264,而一般是248。因为并不需要264那么大的寻址空间,过大的空间只会造成资源的浪费。所以64位Linux一般使用48位表示虚拟空间地址,40位标识物理地址。
0x0000000000000000~0x00007fffffffffff 表示用户空间,
0xFFFF800000000000~ 0xFFFFFFFFFFFFFFFF 表示内核空间,

本文深入探讨了程序的本质和SOC结构,强调了MMU在地址转换中的关键作用。MMU将CPU的虚拟地址转化为物理地址,通过页表实现。在Linux系统中,内存被划分为1G内核空间和3G用户空间。ioremap函数用于驱动程序访问外设物理地址。64位系统中,虚拟地址空间通常为48位,区分用户和内核空间。同时,文章提及Linux进程页表的共享特性以及多核处理器中MMU的配置问题。
723

被折叠的 条评论
为什么被折叠?



