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

门户网站建设哪里有配音网站赚钱

门户网站建设哪里有,配音网站赚钱,查询wordpress主题,一个wordpress程序搭建多个网站目录 虚拟地址转换为物理地址内核启动Multiboot头部结构启动时的寄存器状态real_start段选择子初始化BSS段 页表转换设置CR4、CR3、EFER寄存器设置页表映射 初始化IDT#xff0c;执行lk_main 虚拟地址转换为物理地址 // start.S#define PHYS_LOAD_ADDRESS (MEMBASE KERNEL_L… 目录 虚拟地址转换为物理地址内核启动Multiboot头部结构启动时的寄存器状态real_start段选择子初始化BSS段 页表转换设置CR4、CR3、EFER寄存器设置页表映射 初始化IDT执行lk_main 虚拟地址转换为物理地址 // start.S#define PHYS_LOAD_ADDRESS (MEMBASE KERNEL_LOAD_OFFSET) #define PHYS_ADDR_DELTA (KERNEL_BASE KERNEL_LOAD_OFFSET - PHYS_LOAD_ADDRESS) #define PHYS(x) ((x) - PHYS_ADDR_DELTA)PHYS(x) 将x转换为物理地址 内核启动 Multiboot头部结构 // start.S.section .text.boot .code32 .global _start _start:jmp real_start.align 8/* flags for multiboot header */ #define MULTIBOOT_HEADER_FLAGS (MULTIBOOT_PAGE_ALIGN | MULTIBOOT_MEMORY_INFO | MULTIBOOT_AOUT_KLUDGE) //MULTIBOOT_PAGE_ALIGN 0x00000001 MULTIBOOT_MEMORY_INFO 0x00000002 MULTIBOOT_AOUT_KLUDGE 0x00010000 .type multiboot_header,STT_OBJECT multiboot_header:/* magic */.int MULTIBOOT_HEADER_MAGIC/* flags */.int MULTIBOOT_HEADER_FLAGS/* checksum */.int -(MULTIBOOT_HEADER_MAGIC MULTIBOOT_HEADER_FLAGS)/* header_addr */.int PHYS(multiboot_header)/* load_addr */.int PHYS(_start)/* load_end_addr */.int PHYS(__data_end)/* bss_end_addr */.int PHYS(__bss_end)/* entry_addr */.int PHYS(real_start) 刚启动时使用32位指令集MULTIBOOT_HEADER_FLAGS 指定启动加载程序的功能此处设置了4K字节对齐、multiboot_info需要包含mem_*字段以及设Multiboot偏移12-28处的字段有效 图中代码在multiboot.h 图中代码在start.S Multiboot header地址含义可以参考Multiboot技术文档3.1.3小节Multiboot_info可参考3.3小节 启动时的寄存器状态 Multiboot协议规定EAX 0x2BADB002魔数 表明操作系统是被符合Multiboot的加载程序进行加载的此外Multiboot协议规定EBX必须包含Multiboot_info的32位物理地址。有关机器启动时的状态可参考文档3.2小节。 real_start // start.Sreal_start:cmpl $MULTIBOOT_BOOTLOADER_MAGIC, %eaxjne 0fmovl %ebx, PHYS(_multiboot_info)0:/* load our new gdt by physical pointer */lgdt PHYS(_gdtr_phys)/* load our data selectors */movw $DATA_SELECTOR, %axmovw %ax, %dsmovw %ax, %esmovw %ax, %fsmovw %ax, %ssmovw %ax, %gsmovw %ax, %ss/* load initial stack pointer */movl $PHYS(_kstack 4096), %esp/* far jump to load the CS from our GDT */pushl $CODE_SELECTORpushl $PHYS(.Lfarjump)lret 在real_start开始部分先检查EAX中的值是否等于Multiboot魔数等于则将EBX的值加载到multiboot_info的物理地址否则直接跳转到标号0处执行。 将全局描述符表gdt的物理地址加载到GDTR中然后将段寄存器的值设置为DATA_SELECTOR 0x10 0001 0000 段选择子 Requestor Privilege-Level (RPL)表示处理器正在运行的特权级别 Table Indicator (TI)表示选择哪个描述符表TI0使用GDTTI1使用LDT Selector Index Field(SI)表示索引 因此DATA_SELECTOR 0x10 0001 0000 表示CPL0即最高权限使用GDTIndex为2使用GDT中的第二个段描述符 图中代码在gdt.S 段寄存器设置好后用一个4K的数组作为栈数组末尾作为栈顶然后将CODE_SELECTOR和.Lfarjump的物理地址压栈再跳转到.Lfarjump处运行。 CODE_SELECTOR 0x08 0000 1000 即选择GDT的第一个段描述符 初始化BSS段 //start.S.Lfarjump:/* zero the bss section */ bss_setup:movl $PHYS(__bss_start), %edi /* starting address of the bss */movl $PHYS(__bss_end), %ecx /* find the length of the bss in bytes */subl %edi, %ecxshrl $2, %ecx /* convert to 32 bit words, since the bss is aligned anyway */ 2:movl $0, (%edi)addl $4, %ediloop 2b 初始化BSS段其中_bss_start _bss_end在kernel.ld文件中在链接阶段分配地址 页表转换设置 CR4、CR3、EFER寄存器设置 //start.Spaging_setup:/* Preparing 64 bit paging. We will use 2MB pages covering 1GB* for initial bootstrap, this page table will be 1 to 1.*//* PAE bit must be enabled for 64 bit paging*/mov %cr4, %eaxbtsl $(5), %eaxmov %eax, %cr4/* load the physical pointer to the top level page table */movl $PHYS(kernel_pml4), %eaxmov %eax, %cr3/* Long Mode Enabled at this point*/movl $MSR_EFER ,%ecxrdmsrorl $EFER_LME,%eaxwrmsr 将CR4位5置1启用PAE(Physical-Address Extensions)并将PML4的地址存储在CR3中然后设置MSR_EFER寄存器启用长模式。 //start.S#define MSR_EFER 0xc0000080 #define EFER_LME 0x00000100MSR_EFER 0xc0000080 看似是一个宏定义其实是EFER寄存器的地址在AMD手册3.1.7中给出 页表映射 //mmu.c/* top level kernel page tables, initialized in start.S */ map_addr_t kernel_pml4[NO_OF_PT_ENTRIES] __ALIGNED(PAGE_SIZE); map_addr_t kernel_pdp[NO_OF_PT_ENTRIES] __ALIGNED(PAGE_SIZE); /* temporary */ map_addr_t kernel_pte[NO_OF_PT_ENTRIES] __ALIGNED(PAGE_SIZE);/* top level pdp needed to map the -512GB..0 space */ map_addr_t kernel_pdp_high[NO_OF_PT_ENTRIES] __ALIGNED(PAGE_SIZE);/* a big pile of page tables needed to map 64GB of memory into kernel space using 2MB pages */ map_addr_t kernel_linear_map_pdp[(64ULL*GB) / (2*MB)]; kernel_pml4、kernel_pdp、kernel_pte都是一个4K大小的数组kernel_linear_map_pdp是一个4*64K大小的数组在这里的作用是作为64个4K的kernel_pte //start.S/* Setting the First PML4E with a PDP table reference at index 0 */movl $PHYS(kernel_pdp), %eaxorl $X86_KERNEL_PD_FLAGS, %eaxmovl %eax, PHYS(kernel_pml4)/* Setting the First PDPTE with a Page table reference at index 0 */movl $PHYS(kernel_pte), %eaxorl $X86_KERNEL_PD_FLAGS, %eaxmovl %eax, PHYS(kernel_pdp)/* point the pml4e at the second high PDP (for -2GB mapping) at index 511 */movl $PHYS(kernel_pdp_high), %eaxorl $X86_KERNEL_PD_FLAGS, %eaxmovl %eax, PHYS(kernel_pml4 8*511)/* point the second pdp at the same low level page table */movl $PHYS(kernel_pte), %eaxorl $X86_KERNEL_PD_FLAGS, %eaxmovl %eax, PHYS(kernel_pdp_high 8*510)/* map the first 1GB in this table */movl $PHYS(kernel_pte), %esimovl $0x200, %ecx /* 512 entries */xor %eax, %eax /* start off at address 0 */0:mov %eax, %ebxshll $21, %ebxorl $X86_KERNEL_PD_LP_FLAGS, %ebxmovl %ebx, (%esi)addl $8,%esiinc %eaxloop 0b /* dec ecx and loop while 0 */ 使用的是2M的页表实际上kernel_pte换成kernel_pde会更好但只是个名字并不影响实际运行。映射的结果如图 /* set up a linear map of the first 64GB at 0xffffff8000000000 */movl $PHYS(kernel_linear_map_pdp), %esimovl $32768, %ecxxor %eax, %eax/* loop across these page tables, incrementing the address by 2MB */ 0:mov %eax, %ebxshll $21, %ebxorl $X86_KERNEL_PD_LP_FLAGS, %ebx # lower word of the entrymovl %ebx, (%esi)mov %eax, %ebxshrl $11, %ebx # upper word of the entrymovl %ebx, 4(%esi)addl $8,%esiinc %eaxloop 0b/* point the high pdp at our linear mapping page tables */movl $PHYS(kernel_pdp_high), %esimovl $64, %ecxmovl $PHYS(kernel_linear_map_pdp), %eaxorl $X86_KERNEL_PD_FLAGS, %eax0:movl %eax, (%esi)add $8, %esiaddl $4096, %eaxloop 0b/* Enabling Paging and from this point we are in 32 bit compatibility mode */mov %cr0, %eaxbtsl $(31), %eaxmov %eax, %cr0 页表初始化完成后通过CR0启动页表映射的结果如下其中PA大小是64G内核区为1G。图中有个问题PA前1G和内核是同一个区域并不是分开的 初始化IDT执行lk_main /* Use a far jump to get into 64bit mode */pushl $CODE_64_SELECTORpushl $PHYS(farjump64)lret.align 8 .code64 farjump64:/* branch to our high address */mov $highaddr, %raxjmp *%raxhighaddr:/* load the high kernel stack */mov $(_kstack 4096), %rsp/* reload the gdtr */lgdt _gdtr/* set up the idt */call setup_idt/* call the main module */call lk_main0: /* just sit around waiting for interrupts */hlt /* interrupts will unhalt the processor */pausejmp 0b /* so jump back to halt to conserve power */ 最后将CODE_64_SELECTOR和farjump64物理地址压栈CODE_64_SELECTOR 0x28 0010 1000选择GDT第5个段描述符。 重新初始化栈顶以及GDTR并调用setup_idt初始化IDT以及调用lk_main。 此时因为已经启用页表所以不再使用物理地址而是逻辑地址。
http://www.yutouwan.com/news/78927/

相关文章:

  • wordpress添加前台广州seo网站管理
  • 黑龙江省网站备案深圳市羽堂品牌设计顾问有限公司
  • 珠海cp网站建设营销品牌有哪些
  • 征婚网站咋做温州网站制作的公司
  • 如何制作自己的网站链接教程天津网站建设价格
  • 男女做暖暖网站北京互联网公司开发的网站
  • vs做的网站如何使用株洲网站建设方案咨询
  • 网页设计素材网站有哪些erp软件有哪些软件
  • 商城网站开发解决方案wordpress+小米
  • 建购物网站要多少钱手机端怎么打开响应式的网站
  • uc网站模板dw做网站可以做毕业设计吗
  • 做促销的网站中国宣布入境最新消息2023
  • 岑溪网络推广营销一分钟看懂seo
  • 网站建设提议个人制作网站工具
  • 做一个网站需要哪些成都小程序开发价格
  • 晋城做网站的郴州网红打卡餐厅
  • 山东省济宁市嘉祥县建设局网站广东建设厅的网站查询
  • 泉州网站建设公司推荐qianhu微建站
  • 2016网站设计风格重庆做网站建设团队
  • 免费友情链接网页wordpress安装双seo插件
  • 呼伦贝尔北京网站建设wordpress 中英文网站
  • 优秀设计作品的网站微网站 手机网站
  • 企业网站优化甲薇g71679做同等效果下拉词电商怎么做的步骤
  • 公司做网站报价吐鲁番seo招聘
  • 网站模板下载之后怎么做营销到底是干嘛的
  • 邯郸网站设计怎么做做自动化设备哪个网站
  • 深圳建设集团网站自己创造网站
  • 如何使用模板网站建设网页长沙网站设计公司重庆标志
  • 广州营销网站建设设计青建设厅官方网站
  • 本机怎么放自己做的网站昆山规划与建设局网站