Magenta源代码笔记(1) —— 代码结构以及构建系统

来源:互联网 发布:淘宝女装店铺介绍? 编辑:程序博客网 时间:2024/06/07 23:33
Google今年新公开了以新内核Magenta为基础的Fuchsia操作系统,在代码量还在我可以承受的范围时,准备开始阅读Magenta的代码。


Google现在将代码托管在 https://fuchsia.googlesource.com/magenta
无奈网站在墙外,幸好Google在Github上提供了对应的镜像Repo https://github.com/fuchsia-mirror/magenta
有关Magenta内核的介绍在Google的Readme文档里可以找到。


代码结构以及构建系统
┣ kernel Magenta内核代码
┣ scripts 工具脚本
┣ system 用户空间代码
┗ third-party 第三方库代码


kernel目录中为Magenta内核的代码,Magenta是基于Google开发的lk内核修改过来的,查看lk的Repo,其内容与kernel目录中的结构基本一致
kernel
┣ app 内核空间应用
┣ arch 芯片架构适配代码(启动代码等)
┣ dev 设备系统
┣ include 头文件
┣ lib 内核所用库
┣ make 构建所需的mk文件
┣ platform 平台相关适配代码
┣ project 顶层项目配置文件
┣ target 目标相关适配代码
┗ top 内核顶层初始化代码


system目录为用户空间的代码
system
┣ private 私有头文件 (用户空间内核空间交互)
┣ public 公有头文件 (用户空间内核空间交互,如系统调用等)
┣ tools 用户空间调试以及构建使用的工具 (host运行)
┣ uapps 用户空间应用
┣ udev 用户空间设备驱动
┣ ulib 用户空间所用库
┗ utest 用户空间测试代码


third-party目录为第三方代码
现在该目录主要提供了用户空间使用的libc库musl-libc:https://www.musl-libc.org/


接下来关于Magenta的构建系统,沿用了lk代码的构建系统
makefile:
引入kernel/engine.mk
LKROOT := kernel...$(MAKECMDGOALS) _top:@$(MAKE) -C $(LKMAKEROOT) --no-print-directory -rR -f $(LKROOT)/engine.mk $(addprefix -I,$(LKINC)) $(MAKECMDGOALS)kernel/engine.mk:
按顺序引入project,platform,target目录中的mk文件
...-include project/$(PROJECT).mkifndef TARGET$(error couldn't find project or project doesn't define target)endifinclude target/$(TARGET)/rules.mkifndef PLATFORM$(error couldn't find target or target doesn't define platform)endifinclude platform/$(PLATFORM)/rules.mk$(info PROJECT = $(PROJECT))$(info PLATFORM = $(PLATFORM))$(info TARGET = $(TARGET))include arch/$(ARCH)/rules.mkinclude top/rules.mk...
project名为make参数传入,对应project中的mk文件名
下面以magenta-qemu-arm64为例
kernel/project/magenta-qemu-arm64.mk:
EMBED_USER_BOOTFS:=trueMODULES +=include project/virtual/test.mkinclude project/virtual/user.mkinclude project/target/qemu-virt-a53.mk
分别引入了三个mk文件
test.mk:测试所依赖代码
user.mk:用户空间代码
qemu-virt-a53.mk:目标配置文件
kernel/project/target/qemu-virt-a53.mk:
ARCH := arm64ARM_CPU := cortex-a53include project/target/qemu-virt.mkkernel/project/target/qemu-virt.mk:TARGET := qemu-virt
主要指定了芯片的架构以及型号和目标的类型,从而可以导入对应的target的mk文件
kernel/target/qemu-virt/rules.mk:
LOCAL_DIR := $(GET_LOCAL_DIR)KERNEL_INCLUDES += \    $(LOCAL_DIR)/includePLATFORM := qemu-virt#include make/module.mk
主要将target有关文件加入include路径,并且指定所使用的platform
kernel/platform/qemu-virt/rules.mk:
LOCAL_DIR := $(GET_LOCAL_DIR)MODULE := $(LOCAL_DIR)ifeq ($(ARCH),)ARCH := arm64endififeq ($(ARCH),arm64)ARM_CPU ?= cortex-a53endififeq ($(ARCH),arm)ARM_CPU ?= cortex-a15endifWITH_SMP ?= 1LK_HEAP_IMPLEMENTATION ?= cmpctmallocMODULE_SRCS += \    $(LOCAL_DIR)/debug.c \    $(LOCAL_DIR)/platform.c \    $(LOCAL_DIR)/secondary_boot.S \    $(LOCAL_DIR)/uart.cMEMBASE := 0x40000000MEMSIZE ?= 0x08000000   # 512MBKERNEL_LOAD_OFFSET := 0x10000 # 64kMODULE_DEPS += \    lib/cbuf \    lib/fdt \    dev/pcie \    dev/timer/arm_generic \    dev/interrupt/arm_gicv2mKERNEL_DEFINES += \    MEMBASE=$(MEMBASE) \    MEMSIZE=$(MEMSIZE) \    PLATFORM_SUPPORTS_PANIC_SHELL=1KERNEL_DEFINES += MMU_WITH_TRAMPOLINE=1 \LINKER_SCRIPT += \    $(BUILDDIR)/system-onesegment.ldinclude make/module.mk
platform为构建系统中最具象的一层,包括了引入了底层驱动代码(?),链接相关参数,和一些需要依赖的库。
未完
0 0
原创粉丝点击