#define ASM
#include <syscall.h>
+.extern ring3_c_text
+
# a allocatable 可分配,表示这个节在程序运行时需要加载到内存中
# x executable 可执行,表示这个节包含可执行的代码
# w writable 可写,通常用于数据节
addl $0x18, %esp
+ call ring3_c_text
+
+
# 纯消耗CPU时间
movl $0xFF0F0F0F, %ecx
1:
asm volatile("sysexit;" ::"d"(ring3_page_vaddr), "c"(ring3_stack_top_vaddr));
}
+
+// 用于触发#PF以验证COW
+__attribute__((__section__(".ring3.data"))) uint32_t ring3_x = 0;
+__attribute__((__section__(".ring3.text"))) void ring3_c_text() {
+ asm("nop;nop;nop;nop;nop;nop;nop;nop;");
+ ring3_x += 1;
+}
{
ring3_page_begin = .;
*(.ring3.entry)
+ *(.ring3.text)
. = ALIGN(0x100);
ring3_text_size = SIZEOF(.ring3);
ring3_page_end = .;
/* 带绝对 VMA 的节写完后 . 不会自动接上,而是变成 该节VMA+SIZEOF(该节名) */
. = ring3_lma + SIZEOF(.ring3);
+ . = ALIGN(0x1000);
+ ring3_data_lma = .;
+ .ring3_data 0x10000000 : AT(ring3_data_lma)
+ {
+ *(.ring3.data)
+ }
+ . = ring3_data_lma + SIZEOF(.ring3_data);
+
. = ALIGN(0x1000);
/* . = kernel_begin; */
. += kernel_virtual_addr_start;