代码拉取完成,页面将自动刷新
同步操作将从 殊蕤/xv6-course 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
首先 xv6-public 是通过 make 编译系统构建,构建流程如下
make -nB | sed 's/gcc.*-c/gcc -c/'
gcc -c bootmain.c gcc -c bootasm.S ld -m elf_i386 -N -e start -Ttext 0x7C00 -o bootblock.o bootasm.o bootmain.o objdump -S bootblock.o > bootblock.asm objcopy -S -O binary -j .text bootblock.o bootblock ./sign.pl bootblock gcc -c -o bio.o bio.c gcc -c -o console.o console.c gcc -c -o exec.o exec.c gcc -c -o file.o file.c gcc -c -o fs.o fs.c gcc -c -o ide.o ide.c gcc -c -o ioapic.o ioapic.c gcc -c -o kalloc.o kalloc.c gcc -c -o kbd.o kbd.c gcc -c -o lapic.o lapic.c gcc -c -o log.o log.c gcc -c -o main.o main.c gcc -c -o mp.o mp.c gcc -c -o picirq.o picirq.c gcc -c -o pipe.o pipe.c gcc -c -o proc.o proc.c gcc -c -o sleeplock.o sleeplock.c gcc -c -o spinlock.o spinlock.c gcc -c -o string.o string.c gcc -c -o swtch.o swtch.S gcc -c -o syscall.o syscall.c gcc -c -o sysfile.o sysfile.c gcc -c -o sysproc.o sysproc.c gcc -c -o trapasm.o trapasm.S gcc -c -o trap.o trap.c gcc -c -o uart.o uart.c ./vectors.pl > vectors.S gcc -c -o vectors.o vectors.S gcc -c -o vm.o vm.c gcc -c -o entry.o entry.S gcc -c entryother.S ld -m elf_i386 -N -e start -Ttext 0x7000 -o bootblockother.o entryother.o objcopy -S -O binary -j .text bootblockother.o entryother objdump -S bootblockother.o > entryother.asm gcc -c initcode.S ld -m elf_i386 -N -e start -Ttext 0 -o initcode.out initcode.o objcopy -S -O binary initcode.out initcode objdump -S initcode.o > initcode.asm ld -m elf_i386 -T kernel.ld -o kernel entry.o bio.o console.o exec.o file.o fs.o ide.o ioapic.o kalloc.o kbd.o lapic.o log.o main.o mp.o picirq.o pipe.o proc.o sleeplock.o spinlock.o string.o swtch.o syscall.o sysfile.o sysproc.o trapasm.o trap.o uart.o vectors.o vm.o -b binary initcode entryother objdump -S kernel > kernel.asm objdump -t kernel | sed '1,/SYMBOL TABLE/d; s/ .* / /; /^$/d' > kernel.sym dd if=/dev/zero of=xv6.img count=10000 dd if=bootblock of=xv6.img conv=notrunc dd if=kernel of=xv6.img seek=1 conv=notrunc
启动编译阶段:
系统启动文件 ../../study/os/xv6-public/bootasm.S
读取磁盘函数 readsect ../../study/os/xv6-public/bootmain.c
磁盘读取发展 IO 操作读取硬盘的三种方式:
LBA 方式访问使用了 data 寄存器,LBA 寄存器(总共 3 个),device 寄存器,command 寄存器来完成的。
LBA28 和 LBA48 方式:LBA28 方式使用 28 位来描述一个扇区地址,最大支持 128GB 的硬 磁盘容量。
xv6 使用 LBA28 方式读取硬盘中的数据
0x1F0
data 寄存器
0x1F1
features 寄存器
0x1F2
sector count 寄存器
0x1F3
LBA low 寄存器
0x1F4
LBA mid 寄存器
0x1F5
LBA high 寄存器
0x1F6
device 寄存器
0x1F7
command 寄存器
内联汇编形式
asm [volatile] (“Instruction list”:Output:Input:Clobber/Modify)
从 port 端口读取一个 byte,返回这个读取的值。 使用内联汇编,指定把 data 放在%al 存储,port 放在%dx 存储,然后调用 inb %dx, %al
static inline uchar
inb(ushort port)
{
uchar data;
asm volatile("in %1,%0" : "=a" (data) : "d" (port)); // =a, al 寄存器, d 表示 dx 寄存器
return data;
}
读取端口的字节到给定地址
static inline void
insl(int port, void *addr, int cnt) // 从端口 port 读 4*cnt 个字节到地址 addr
{
asm volatile("cld; rep insl" : // 清零 DF 位,重复指令 insl
"=D" (addr), "=c" (cnt) : // addr 目的地址绑定寄存器 edi,cnt 循环次数绑定 ecx
"d" (port), "0" (addr), "1" (cnt) : // port 端口绑定 dx,addr,cnt 同上
"memory", "cc"); // 改变了内存,改变了eflags寄存器
}
重复执行 insl 指令来读取多个字节的数据到目的地址,
查看 ELF 头
readelf -h kernel
ELF Header: Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00 Class: ELF32 Data: 2's complement, little endian Version: 1 (current) OS/ABI: UNIX - System V ABI Version: 0 Type: EXEC (Executable file) Machine: Intel 80386 Version: 0x1 Entry point address: 0x10000c Start of program headers: 52 (bytes into file) Start of section headers: 134731012 (bytes into file) Flags: 0x0 Size of this header: 52 (bytes) Size of program headers: 32 (bytes) Number of program headers: 3 Size of section headers: 40 (bytes) Number of section headers: 16 Section header string table index: 15
参考程序段
readelf -l kernel
Elf file type is EXEC (Executable file) Entry point 0x10000c There are 3 program headers, starting at offset 52 Program Headers: Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align LOAD 0x001000 0x80100000 0x00100000 0x07b6b 0x07b6b R E 0x1000 LOAD 0x009000 0x80108000 0x00108000 0x804a5c6 0x8055590 RW 0x1000 GNU_STACK 0x000000 0x00000000 0x00000000 0x00000 0x00000 RWE 0x10 Section to Segment mapping: Segment Sections... 00 .text .rodata 01 .data .bss 02
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。