当前位置: 首页 > news >正文

百度一下建设部网站专业提供网站建设服务的企业

百度一下建设部网站,专业提供网站建设服务的企业,线上营销推广方案有哪些,谷歌推广关键词匹配文章目录 一、page_address1.1 page_address1.2 page_to_pfn1.3 PFN_PHYS1.4 __va(x)1.5 总结1.6 page_to_virt 二、使用demo 一、page_address 1.1 page_address 内核用 struct page 结构体来表示系统中的每个物理页面#xff0c;该结构体用来跟踪和管理这些物理页面的使用… 文章目录 一、page_address1.1 page_address1.2 page_to_pfn1.3 PFN_PHYS1.4 __va(x)1.5 总结1.6 page_to_virt 二、使用demo 一、page_address 1.1 page_address 内核用 struct page 结构体来表示系统中的每个物理页面该结构体用来跟踪和管理这些物理页面的使用情况。 page_address函数根据给定的struct page 结构体返回该物理页面的内核起始虚拟地址 // linux-3.10/include/linux/mm.hstatic __always_inline void *lowmem_page_address(const struct page *page) {return __va(PFN_PHYS(page_to_pfn(page))); }#if !defined(HASHED_PAGE_VIRTUAL) !defined(WANT_PAGE_VIRTUAL) #define page_address(page) lowmem_page_address(page)对于内核高版本 // linux-5.4.18/include/linux/mm.hstatic __always_inline void *lowmem_page_address(const struct page *page) {return page_to_virt(page); }#if !defined(HASHED_PAGE_VIRTUAL) !defined(WANT_PAGE_VIRTUAL) #define page_address(page) lowmem_page_address(page)1.2 page_to_pfn # cat /boot/config-3.10.0-1160.el7.x86_64 | grep CONFIG_SPARSEMEM_VMEMMAP CONFIG_SPARSEMEM_VMEMMAPy//linux-3.10/include/asm-generic/memory_model.hif defined(CONFIG_SPARSEMEM_VMEMMAP)/* memmap is virtually contiguous. */ #define __page_to_pfn(page) (unsigned long)((page) - vmemmap)#define page_to_pfn __page_to_pfnpage_to_pfn宏根据给定struct page 结构体获取该物理页面的页帧号pfn。 1.3 PFN_PHYS # cat /boot/config-3.10.0-1160.el7.x86_64 | grep CONFIG_PHYS_ADDR_T_64BIT CONFIG_PHYS_ADDR_T_64BITy#ifdef CONFIG_PHYS_ADDR_T_64BIT typedef u64 phys_addr_t;/* PAGE_SHIFT determines the page size */ #define PAGE_SHIFT 12#define PFN_PHYS(x) ((phys_addr_t)(x) PAGE_SHIFT)PFN_PHYS宏根据给定的物理页面的页帧号pfn获取其该物理页面的物理起始地址。 参数 x 是一个页框号PFNPAGE_SHIFT 是一个常量表示页的大小的位移值通常为 12在 x86 架构上表示 4KB 大小的页面。 这个宏通过将页框号左移 PAGE_SHIFT 位来计算物理地址。由于页框号是以页为单位计数的每个页的大小为 2^PAGE_SHIFT 字节所以将页框号左移 PAGE_SHIFT 位相当于将其乘以页的大小得到物理地址。 1.4 __va(x) 1x86_64 在x86_64等64位架构中因为内核虚拟空间较大所以直接把所有物理内存直接线性映射到内核虚拟地址当中物理地址和内核虚拟地址仅仅一个PAGE_OFFSET的偏移 #define __PAGE_OFFSET _AC(0xffff880000000000, UL)#define PAGE_OFFSET ((unsigned long)__PAGE_OFFSET)// linux-3.10/arch/x86/include/asm/page.h #define __va(x) ((void *)((unsigned long)(x)PAGE_OFFSET))__va() 宏用于将给定的物理地址转换为对应的内核虚拟地址。 这个宏将物理地址转换为虚拟地址的过程是将物理地址转换为无符号长整型然后加上 PAGE_OFFSET 值。PAGE_OFFSET 是一个常量表示内核虚拟地址的偏移量是内核代码和数据在虚拟地址空间中的起始位置。 通过将物理地址加上 PAGE_OFFSET就可以将物理地址转换为对应的虚拟地址。 备注 内核虚拟地址空间都是直接映射区地址连续和物理地址空间是简单的线性映射关系。虽然内核虚拟地址空间是直接映射区但还是会建立页表。 ffff880000000000 - ffffc7ffffffffff (64 TB) direct mapping of all phys. memory2arm64架构 # cat /boot/config-5.4.18-74-generic | grep CONFIG_ARM64_VA_BITS CONFIG_ARM64_VA_BITS_39y # CONFIG_ARM64_VA_BITS_48 is not set CONFIG_ARM64_VA_BITS39CONFIG_ARM64_VA_BITS_39 是一个内核配置选项用于指定 ARM64 架构中虚拟地址的位数。该选项设置为 y 表示启用 39 位虚拟地址。 ARM64 架构支持不同的虚拟地址位数配置可以根据系统需求进行调整。虚拟地址位数决定了虚拟地址空间的大小。 其中39 位配置是较为常见的配置适用于大多数 ARM64 架构的系统。它提供了 512 GB 的虚拟地址空间。 // /arch/arm64/include/asm/memory.h/* PHYS_OFFSET - the physical address of the start of memory. */ #define PHYS_OFFSET ({ VM_BUG_ON(memstart_addr 1); memstart_addr; })/** PAGE_OFFSET - the virtual address of the start of the linear map, at the* start of the TTBR1 address space.* PAGE_END - the end of the linear map, where all other kernel mappings begin.* KIMAGE_VADDR - the virtual address of the start of the kernel image.* VA_BITS - the maximum number of bits for virtual addresses.*/ #define VA_BITS (CONFIG_ARM64_VA_BITS) #define _PAGE_OFFSET(va) (-(UL(1) (va))) #define PAGE_OFFSET (_PAGE_OFFSET(VA_BITS))// linux-5.4.18/arch/arm64/mm/init.cvoid __init arm64_memblock_init(void) {......physvirt_offset PHYS_OFFSET - PAGE_OFFSET;...... }// linux-5.4.18/arch/arm64/include/asm/memory.h#define __phys_to_virt(x) ((unsigned long)((x) - physvirt_offset))#define __va(x) ((void *)__phys_to_virt((phys_addr_t)(x)))参数 x 是一个物理地址physvirt_offset 是一个常量表示物理地址和虚拟地址之间的偏移量。 这个宏通过将给定的物理地址减去 physvirt_offset 来计算对应的虚拟地址。偏移量 physvirt_offset 可能因架构和环境而异它表示物理地址与虚拟地址之间的差距。 s64 physvirt_offset __ro_after_init; EXPORT_SYMBOL(physvirt_offset);# cat /proc/kallsyms | grep physvirt_offset ffffffc01123d2e8 R physvirt_offset1.5 总结 通过伙伴系统接口分配得到一个struct page以后调用page_address函数过程 1page_to_pfn宏根据给定struct page 结构体获取该物理页面的页帧号pfn。 2PFN_PHYS宏根据给定的物理页面的页帧号pfn获取其该物理页面的物理起始地址。 3__va() 宏用于将给定的物理地址转换为对应的内核虚拟地址。 struct page -- 页帧号pfn -- 物理页面的物理起始地址 -- 内核虚拟起始地址1.6 page_to_virt page_to_virt 和 page_address 功能一样 13.10.0内核版本 #define __va(x) ((void *)((unsigned long)(x)PAGE_OFFSET))// linux-3.10/include/asm-generic/page.h#define pfn_to_virt(pfn) __va((pfn) PAGE_SHIFT)#define page_to_virt(page) pfn_to_virt(page_to_pfn(page))25.4.18内核版本 static __always_inline void *lowmem_page_address(const struct page *page) {return page_to_virt(page); }#if !defined(HASHED_PAGE_VIRTUAL) !defined(WANT_PAGE_VIRTUAL) #define page_address(page) lowmem_page_address(page)对于 x86_64和之前一样 #define __va(x) ((void *)((unsigned long)(x)PAGE_OFFSET))#define pfn_to_virt(pfn) __va((pfn) PAGE_SHIFT)#define page_to_virt(page) pfn_to_virt(page_to_pfn(page))对于aarch64 # cat /boot/config-5.4.18-74-generic | grep CONFIG_SPARSEMEM_VMEMMAP CONFIG_SPARSEMEM_VMEMMAPy#if defined(CONFIG_SPARSEMEM_VMEMMAP)#define page_to_virt(x) ({ \__typeof__(x) __page x; \u64 __idx ((u64)__page - VMEMMAP_START) / sizeof(struct page);\u64 __addr PAGE_OFFSET (__idx * PAGE_SIZE); \(void *)__tag_set((const void *)__addr, page_kasan_tag(__page));\ })二、使用demo # include linux/init.h # include linux/kernel.h # include linux/module.h # include linux/mm_types.h # include linux/mm.h # include linux/gfp.h//内核模块初始化函数 static int __init lkm_init(void) {struct page *page alloc_pages(GFP_KERNEL, 0);unsigned long virt_address (unsigned long)page_address(page);printk(virtual addr 0x%lx\n, virt_address);unsigned int pfn page_to_pfn(page);printk(pfn %d\n, pfn);unsigned long phys_address PFN_PHYS(pfn);printk(phys addr 0x%lx\n, phys_address);unsigned long virt_address1 (unsigned long)__va(phys_address);printk(virtual addr1 0x%lx\n, virt_address1);free_pages(virt_address, 0);return 0;}//内核模块退出函数 static void __exit lkm_exit(void) {printk(Goodbye\n); }module_init(lkm_init); module_exit(lkm_exit);MODULE_LICENSE(GPL);[159158.806456] virtual addr 0xffff9d991dc92000 [159158.806463] pfn 384146 [159158.806467] phys addr 0x5dc92000 [159158.806471] virtual addr1 0xffff9d991dc92000可以看到 virtual addr 和 virtual addr1 值一样。
http://www.w-s-a.com/news/707844/

相关文章:

  • 网站开发问题杭州制作公司网站
  • 网站推广seo是什么wordpress 去除顶部
  • 建筑学不会画画影响大吗电子商务沙盘seo关键词
  • 重庆网站建设找承越上海建设工程招投标网
  • 网站建设四个步骤下单的网站建设教程
  • 网站建设合同的验收表响应式网站建设哪家好
  • 手机网站建设视频长沙百家号seo
  • 网站未备案怎么访问网站开发前端需要学什么
  • 正黄集团博弘建设官方网站wordpress设置固定链接和伪静态
  • wordpress 建网站视频如何实现网站生成网页
  • 杭州品牌网站建设推广个人的网站建设目标
  • 济南有哪些网站是做家具团购的贸易公司自建免费网站
  • wap网站psd成立公司在什么网站
  • 网站建设婚恋交友聊城网站建设费用
  • 沈阳网站建设联系方式尉氏县金星网架公司
  • 医院网站建设实施方案基础微网站开发信息
  • 网站建设开发服务费记账百度指数搜索
  • 网站建设备案流程windows优化大师有必要安装吗
  • 怎么网站定制自己做网站卖视频
  • 网站开发二线城市网站制作过程中碰到的问题
  • 最好网站建设公司制作平台小程序开发教程资料
  • 陕西省高速建设集团公司网站国内做会展比较好的公司
  • 建设学校网站的原因网页设计实训报告1500
  • 网站建设客户来源江门网站设计华企立方
  • 自己如何做棋牌网站宁波网络推广优化方案
  • 深圳招聘网站推荐seo网站推广方案
  • 彩票网站开发 合法学术会议网站建设
  • 商务网站建设论文答辩pptseo技术博客
  • 怎样才能有自己的网站桂林搭建公司
  • 哪个网站做视频赚钱万科