摘要:
根据boot.S里的内容,最后会跳转到kernel_main里,在这里会进行设置gpio引脚配置串口的初始化,然后循环运行,不断打印接受到的内容。 //主函数 void kernel_main() { //串口初始化 uart_init(); //串口发送hello world uart_send_ 阅读全文
摘要:
在内核启动时需要将bss段的所有数据清0,这里就需要memzero函数。 .global memzero ;全局可见 memzero: str xzr, [x0], #8 subs x1, x1, #8 b.gt memzero ret 内核启动时需要经常读写soc内部寄存器的值,这里就需要用到对应 阅读全文
摘要:
上一节的链接脚本中定义了text.boot段,这一节中就用汇编语言实现。 #include "mm.h" ;定义段名 .section = "text.boot" ;定义全局变量 .global _start _start: ;获取处理器的id mrs x0, mpidr_el1 ;判断id号是否为 阅读全文
摘要:
链接脚本主要是将.o目标文件链接成可执行文件,里面包含了程序各个段在内存中的布局。 SECTIONS { #用于启动的程序 .text.boot : { *(.text.boot) } #程序段 .text : { *(.text) } #只读数据 .rodata : { *(.rodata) } 阅读全文
摘要:
编写树莓派内核映像的过程可以等同于gcc的编译过程:预处理、编译、汇编、链接,后面还会加一步:将可执行文件转换成二进制的镜像文件。 在MakeFile里的构建过程分为3步: 1.将.c文件经过预处理、编译、汇编生成.o文件,将.S文件经过汇编生成.o文件。 2.将.o文件经过链接生成.elf可执行文 阅读全文
摘要:
编写树莓派内核映像的过程可以等同于gcc的编译过程:预处理、编译、汇编、链接,后面还会加一步:将可执行文件转换成二进制的镜像文件。 在MakeFile里的构建过程分为3步: 1.将.c文件经过预处理、编译、汇编生成.o文件,将.S文件经过汇编生成.o文件。 2.将.o文件经过链接生成.elf可执行文 阅读全文