




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、数字集成电路设计与系统应用专业数字集成电路设计与系统应用专业Porting Embedded Linux数字集成电路设计与系统应用专业数字集成电路设计与系统应用专业All rights reserveduBUAA All rights reserved;uThe information contained in this document is subject to change without notice ;数字集成电路设计与系统应用专业数字集成电路设计与系统应用专业内容提纲nLinuxLinux内核源码的层次关系内核源码的层次关系nLinux Linux 启动流程启动流程以以 arm a
2、rm 平台为例说明平台为例说明 Linux Linux 启动流程和相关代码启动流程和相关代码n移植移植 Linux Linux 的相关工作的相关工作n移植移植 Linux Linux 举例举例基本的平台相关代码基本的平台相关代码修改基本的平台相关代码修改基本的平台相关代码数字集成电路设计与系统应用专业数字集成电路设计与系统应用专业LinuxLinux内核源码的层次关系内核源码的层次关系体系结构、平台相关代码arch/Arch/arm/mach-s3c6410所有的驱动代码 (drivers/usb/, etc.) drivers/Linux 内核基本源码kernel/混合库代码 (zlib,
3、crc32.) lib/文件系统代码 (fs/ext3/, etc.) fs/进程通讯相关代码ipc/内存管理代码mm/网络协议代码net/内核头文件体系结构相关头文件Linux内核基本的头文件(保留类型和配置)include/:include/asm-include/linux数字集成电路设计与系统应用专业数字集成电路设计与系统应用专业boot包括启动内核所使用的部分或全部平台特有代码。kernel存放支持体系结构特有的诸如信号处理和SMP之类特征的实现。lib存放高速的体系结构特有的诸如strlen和memcpy之类的通用函数的实现。mm存放体系结构特有的内存管理程序的实现。math-em
4、u模拟FPU的代码。对于ARM处理器来说,此目录用mach-xxx代替。 arch/arm 目录数字集成电路设计与系统应用专业数字集成电路设计与系统应用专业包括编译核心所需要的大部分头文件,例如与平台无关的头文件在include/linux子目录下 不同的平台需要的头文件会有所不同,因此该目录和arch目录一样,按平台划分了多个子目录。 include目录数字集成电路设计与系统应用专业数字集成电路设计与系统应用专业内核的启动流程内核的启动流程数字集成电路设计与系统应用专业数字集成电路设计与系统应用专业启动流程启动流程第一个用户空间程序-配置用户环境和执行服务进程Kernel-内核自解压(zIm
5、age)-初始化静态编译进内核的驱动模块 (needed to access the root filesystem) -挂载根文件系统 (needed to access and run userspace programs) -直接执行第一个用户空间程序Bootloader-硬件上电后跳到一个固定位置执行相应的代码-初始化相应的设备 (local storage, network, removable media) -加载内核的代码到内存-跳到内核代码起始位置执行数字集成电路设计与系统应用专业数字集成电路设计与系统应用专业使用使用 RAMDISK作为根文件系统时的启动流程作为根文件系统时的
6、启动流程用户空间: /sbin/init-运行配置设备的命令 (if not done yet in the initrd) -启动系统服务进程 (daemons, servers)和用户程序Initrd上用户空间的 /linuxrc脚步-运行用户空间的命令,配置设备(如:网络配置,挂载/proc 和 /sys 文件系统) -加载存放在initrd中的内核模块 (drivers), 需要访问一个新的根文件系统.-挂载一个新的根文件系统. 切换到新的根文件系统(pivot_root) -运行 /sbin/init (or sometimes a new /linuxrc script) Kern
7、el-内核自解压-初始化静态编译到内存中的驱动模块 (needed to access the initrd filesystem) -挂载 initrd 作为根文件系统-执行根文件系统上的第一个用户空间程序Bootloader-硬件上电,跳到固定位置去执行-初始化相关硬件 (local storage, network, removable media) -加载内核和ramdisk(initrd)到内存-执行内核代码数字集成电路设计与系统应用专业数字集成电路设计与系统应用专业内核启动相关代码(1) arch/arm/boot/compressed/head.Sstart:wont_overw
8、rite:bl decompress_kernelb call_kernelarch/arm/boot/compressed/misc.cdecompress_kernel() puts(Uncompressing Linux.);gunzip();puts( done, booting the kernel.n);数字集成电路设计与系统应用专业数字集成电路设计与系统应用专业内核启动相关代码(2) arch/arm/kernel/head.SENTRY(stext) _entry:bl _lookup_processor_typebl _lookup_architecture_typebl _
9、create_page_tables _mmap_switched:b SYMBOL_NAME(start_kernel) 数字集成电路设计与系统应用专业数字集成电路设计与系统应用专业内核启动相关代码(3) start_kernel( ) printk(linux_banner);setup_arch(&commaind_line); - arch/arm/kernel/setup.csetup_processor() mdesc = setup_machine(machine_arch_type);MACHINE_START - arch/arm/mach-s3c2410/smdk.cpar
10、se_options(command_line); - init/main.ctrap_init(); - arch/arm/kernel/traps.cinit_IRQ(); - arch/arm/kernel/irq.csched_init(); - kernel/sched.csoftirq_init(); - kernel/softirq.ctime_init(); - arch/arm/kernel/time.c console_init(); - drivers/char/tty_io.c数字集成电路设计与系统应用专业数字集成电路设计与系统应用专业内核启动相关代码(4) init_
11、modules(); - kernel/module.c kmem_cache_init(); - mm/slab.csti();/* interrupt first open */calibrate_delay(); - init/main.cmem_init(); - arch/arm/mm/init.cprintk(POSIX conformance testing by UNIFIXn); smp_init(); - init/main.crest_init(); - init/main.c kernel_thread(init,NULL, CLONE_FS | CLONE_FILES
12、 | CLONE_SIGNAL); - arch/arm/kernel/process.c cpu_idle(); - arch/arm/kernel/process.c数字集成电路设计与系统应用专业数字集成电路设计与系统应用专业内核启动相关代码(5) init() lock_kernel(); do_basic_setup(); - init/main.csock_init(); - net/socket.cstart_context_thread();- kernel/context.cdo_initcalls(); - init/main.cCall functions from _in
13、itcall_start to _initcall_endprepare_namespace(); - init/main.c mount_initrd CONFIG_BLK_DEV_INITRD mount_root(); - init/do_mounts.c mount_devfs_fs (); - fs/devfs/base.cfree_initmem(); - arch/arm/mm/init.cunlock_kernel();数字集成电路设计与系统应用专业数字集成电路设计与系统应用专业内核启动相关代码(6) if (open(/dev/console, O_RDWR, 0) 18)
14、& 0 xfffc,.boot_params= S3C6410_SDRAM_PA + 0 x100,.map_io= smdk6410_map_io,.init_irq= s3c64xx_init_irq,.init_machine= smdk6410_init,.timer= &s3c64xx_timer,MACHINE_ENDMACHINE_START 定义include/asm-arm/mach/arch.hstruct machine_desc “_mach_desc_#_type” is defined数字集成电路设计与系统应用专业数字集成电路设计与系统应用专业Smdk6410静态i
15、o空间映射(1)narch/arm/mach-s3c6410/mach-smdk6410.cstatic struct map_desc smdk6410_iodesc _initdata = /* nothing here yet */;static void _init smdk6410_map_io(void) s3c64xx_init_io(smdk6410_iodesc, ARRAY_SIZE(smdk6410_iodesc);s3c64xx_init_clocks(0);s3c64xx_init_uarts(smdk6410_uartcfgs, ARRAY_SIZE(smdk641
16、0_uartcfgs);数字集成电路设计与系统应用专业数字集成电路设计与系统应用专业Smdk6410静态io空间映射(2)narch/arm/mach-s3c6410/s3c6410.cstatic struct map_desc s3c6410_iodesc _initdata = IODESC_ENT(CLKPWR), /定义了I/o映射后的地址IODESC_ENT(TIMER),/定义了中断相关的地址 IODESC_ENT(WATCHDOG),/定义了mem相关寄存器的地址;void _init s3c6410_map_io(struct map_desc *mach_desc, int
17、 mach_size) /* register our io-tables */iotable_init(s3c6410_iodesc, ARRAY_SIZE(s3c6410_iodesc);iotable_init(mach_desc, mach_size);数字集成电路设计与系统应用专业数字集成电路设计与系统应用专业Smdk6410静态io空间映射(3)narch/arm/plat-s3c64xx/cpu.cstatic struct map_desc s3c_iodesc _initdata = IODESC_ENT(GPIO),IODESC_ENT(IRQ),IODESC_ENT(ME
18、MCTRL),IODESC_ENT(UART) ;void _init s3c64xx_init_io(struct map_desc *mach_desc, int size) n.数字集成电路设计与系统应用专业数字集成电路设计与系统应用专业IO映射和内存映射(1)n从CPU连出来一把线:数据总线、地址总线、控制总线,这把线上挂着N个接口,有相同的,有不同的,名字叫做存储器接口、中断控制接口、DMA接口、并行接口、串行接口、AD接口一个设备要想接入,就用自己的接口和总线上的某个匹配接口对接于是总线上出现了各种设备:内存、硬盘,鼠标、键盘,显示器n通常X86体系结构具有内存映射和IO映射,AR
19、M只有内存映射关于IO与内存空间: 在X86处理器中存在着I/O空间的概念,I/O空间是相对于内存空间而言的,它通过特定的指令in、out来访问。端口号标识了外设的寄存器地址。Intel语法的in、out指令格式为: IN 累加器累加器, 端口号端口号DX OUT 端口号端口号DX,累加器累加器 目前,大多数嵌入式微控制器如ARM、PowerPC等中并不提供I/O空间,而仅存在内存空间。内存空间可以直接通过地址、指针来访问,程序和程序运行中使用的变量和其他数据都存在于内存空间中。即便是在X86处理器中,虽然提供了I/O空间,如果由我们自己设计电路板,外设仍然可以只挂接在内存空间。此时,CPU可
20、以像访问一个内存单元那样访问外设I/O端口,而不需要设立专门的I/O指令。因此,内存空间是必须的,而I/O空间是可选的。 数字集成电路设计与系统应用专业数字集成电路设计与系统应用专业IO映射和内存映射(2)n对于CPU而言,如果它要发数据到某个设备,其实是发到对应的接口,接口电路里有多个寄存器(也称为端口),访问设备实际上是访问相关的端口,所有的信息会由接口转给它的设备。那么CPU会准备数据到数据总线,但是诸多接口,该发给谁呢?这时就须要为各接口分配一个地址,然后把地址放在地址总线上,需要的控制信息放到控制总线上,就可以和设备通信了数字集成电路设计与系统应用专业数字集成电路设计与系统应用专业I
21、O映射和内存映射(3)n对一个系统而言,通常会有多个外设,每个外设的接口电路中,又会有多个端口,每个端口都需要一个地址,为他们标识一个具体的地址值,是系统必须解决的事,与此同时,你还有个内存条,可能是512M或1G或更大的金士顿、现代DDR2之类,他们的每一个地址也都需要分配一个标识值,另外,很多外设有自己的内存、缓冲区,就像你的内存条一样,你同样需要为它们分配内存你的CPU可能需要和它们的每一个字节都打交道,n所以:别指望偷懒,它们的每一寸土地都要规划好!这听起来就很烦,做起来可能就直接导致脑细胞全部阵亡。但事情总是得有人去做,ARM可能会这样做:他这次设计的CPU是32位的,最多也就能寻址
22、232=4G空间,于是把这4GB空间丢给内存和端口,让他们瓜分。但英特尔或许有更好的分配方式数字集成电路设计与系统应用专业数字集成电路设计与系统应用专业地址的概念地址的概念n物理地址:CPU地址总线传来的地址,由硬件电路控制其具体含义n总线地址:总线的地址线或在地址周期上产生的信号。外设使用的是总线地址,CPU使用的是物理地址。n虚拟地址:现代操作系统普遍采用虚拟内存管理(Virtual Memory Management)机制,这需要MMU(Memory Management Unit)的支持。数字集成电路设计与系统应用专业数字集成电路设计与系统应用专业Linux内存空间分配内存空间分配数字
23、集成电路设计与系统应用专业数字集成电路设计与系统应用专业编址方式编址方式n对于某一既定的系统,它要么是独立编址、要么是统一编址,具体采用哪一种则取决于CPU的体系结构。如,PowerPC、m68k等采用统一编址,而X86等则采用独立编址,存在IO空间的概念。n目前,大多数嵌入式微控制器如ARM、PowerPC等并不提供I/O空间,仅有内存空间,可直接用地址、指针访问。n对于Linux内核而言,它可能用于不同的CPU,所以它必须都要考虑这两种方式,于是它采用一种新的方法,将基于I/O映射方式的或内存映射方式的I/O端口通称为“I/O区域”(I/O region),不论你采用哪种方式,都要先申请I
24、O区域:request_resource(),结束时释放它:release_resource()。数字集成电路设计与系统应用专业数字集成电路设计与系统应用专业Nand 平台设备定义 narch/arm/plat-s3c64xx/devs.c static struct resource s3c_nand_resource = 0 = .start = S3C6410_PA_NAND, .end = S3C6410_PA_NAND + S3C64XX_SZ_NAND - 1, .flags = IORESOURCE_MEM, ; struct platform_device s3c_device
25、_nand = .name = s3c6410-nand, .id = -1, .num_resources = ARRAY_SIZE(s3c_nand_resource), .resource = s3c_nand_resource, ;EXPORT_SYMBOL(s3c_device_nand);数字集成电路设计与系统应用专业数字集成电路设计与系统应用专业include/linux/platform_device.hplatform_device结构数字集成电路设计与系统应用专业数字集成电路设计与系统应用专业Nand flash 分区定义(1) narch/arm/plat-s3c64xx
26、/common-static struct mtd_partition smdk_default_nand_part = 0 = .name= Boot Agent,.size= SZ_16K,.offset= 0,1 = .name= S3C6410 flash partition 1,.offset = 0,.size= SZ_2M,2 = .name= S3C6410 flash partition 2,.offset = SZ_4M,.size= SZ_4M,7 = .name= S3C6410 flash partition 7,.offset = SZ_1M * 48,.size=
27、 SZ_16M,;数字集成电路设计与系统应用专业数字集成电路设计与系统应用专业Nand flash 分区定义(2) nstatic struct s3c6410_nand_set smdk_nand_sets = n 0 = n .name= NAND,n .nr_chips = 1,n .nr_partitions= ARRAY_SIZE(smdk_default_nand_part),n .partitions = smdk_default_nand_part,n ,n;/* choose a set of timings which should suit most 512Mbit *
28、chips and beyond.*/nstatic struct s3c6410_platform_nand smdk_nand_info = nn .tacls= 20,n .twrph0= 60,n .twrph1= 20,n .nr_sets= ARRAY_SIZE(smdk_nand_sets),n .sets= smdk_nand_sets,n;数字集成电路设计与系统应用专业数字集成电路设计与系统应用专业archarmplat-s3c64xxcommon-smdk.cstatic struct platform_device _initdata *smdk_devs = &s3c_
29、device_nand, &smdk_led4, &smdk_led5, &smdk_led6, &smdk_led7,;平台相关代码分析-common-smdk6410.c static struct s3c64xx_board smdk6410_board _initdata = .devices = smdk6410_devices,.devices_count = ARRAY_SIZE(smdk6410_devices) ;数字集成电路设计与系统应用专业数字集成电路设计与系统应用专业 平台设备注册narch/arm/plat-s3c64xx/common-void _init smdk
30、_machine_init(void)n/* Configure the LEDs (even if we have no LED support)*/n s3c2410_gpio_cfgpin(S3C2410_GPF4, S3C2410_GPF4_OUTP);n s3c2410_gpio_cfgpin(S3C2410_GPF5, S3C2410_GPF5_OUTP);n s3c2410_gpio_cfgpin(S3C2410_GPF6, S3C2410_GPF6_OUTP);n s3c2410_gpio_cfgpin(S3C2410_GPF7, S3C2410_GPF7_OUTP);n s3
31、c2410_gpio_setpin(S3C2410_GPF4, 1);n s3c2410_gpio_setpin(S3C2410_GPF5, 1);n s3c2410_gpio_setpin(S3C2410_GPF6, 1);n s3c2410_gpio_setpin(S3C2410_GPF7, 1);n if (machine_is_smdk2443()n smdk_nand_info.twrph0 = 50;n s3c_device_nand.dev.platform_data = &smdk_nand_info;n platform_add_devices(smdk_devs, ARRA
32、Y_SIZE(smdk_devs);n s3c6410_pm_init();n数字集成电路设计与系统应用专业数字集成电路设计与系统应用专业drivers/mtd/nand/s3c6410.c /* chip-eccmode = NAND_ECC_SOFT; */chip-eccmode = NAND_ECC_NONE; 禁用ECC数字集成电路设计与系统应用专业数字集成电路设计与系统应用专业Boot options Default kernel command string:noinitrd root=/dev/mtdblock/2 init=/linuxrc console=ttySAC0,1
33、15200内核启动参数数字集成电路设计与系统应用专业数字集成电路设计与系统应用专业交叉编译交叉编译 Makefile (1) n顶层MakefileMakefileARCH=armCROSS_COMPILER=arm-linux-数字集成电路设计与系统应用专业数字集成电路设计与系统应用专业交叉编译交叉编译 Makefile (2) narch/arm/Makefilemachine-$(CONFIG_ARCH_S3C6410) := s3c6410ifneq ($(machine-y),) MACHINE := arch/arm/mach-$(machine-y)/elseMACHINE :=
34、Endiftextofs-y:= 0 x00008000TEXT_OFFSET := $(textofs-y) narch/arm/mach-s3c6410/Makefile.boot zreladdr-y:= 0 x30008000params_phys-y:= 0 x30000100narch/arm/boot/Makefile ZRELADDR := $(zreladdr-y) PARAMS_PHYS := $(params_phys-y) INITRD_PHYS := $(initrd_phys-y)export ZRELADDR INITRD_PHYS PARAMS_PHYS数字集成
35、电路设计与系统应用专业数字集成电路设计与系统应用专业交叉编译交叉编译 Makefile (3) narch/arm/boot/compressed/Makefileifeq ($(CONFIG_ZBOOT_ROM),y) ZTEXTADDR:= $(CONFIG_ZBOOT_ROM_TEXT) ZBSSADDR:= $(CONFIG_ZBOOT_ROM_BSS) elseZTEXTADDR:= 0ZBSSADDR:= ALIGN(4) endififneq ($(INITRD_PHYS),) LDFLAGS_vmlinux += -defsym initrd_phys=$(INITRD_PHY
36、S) endififneq ($(PARAMS_PHYS),) LDFLAGS_vmlinux += -defsym params_phys=$(PARAMS_PHYS) endifnInclude/asm-arm/memory.h#ifndef PAGE_OFFSET#define PAGE_OFFSETUL(0 xc0000000) #endifn关于地址的定义参考 Documentation/arm/Porting数字集成电路设计与系统应用专业数字集成电路设计与系统应用专业DM9000网卡移植(1)n需要修改或添加的文件arch/arm/mach-s3c6400/include/mach
37、/map.harch/arm/mach-s3c6410/smdk-6410.cdrivers/net/arm/Kconfigdrivers/net/arm/MakefileLinux 内核下的 drivers/net/dm9000.c 实现了与体系结构无关的 DM9000 网卡驱动,只需要在 BSP 的板文件(arch/arm/mach-s3c6410/smdk-6410.c)中定义相关的 platform 设备和数据:数字集成电路设计与系统应用专业数字集成电路设计与系统应用专业1.添加引脚宏定义在arch/arm/mach-s3c6400/include/mach/map.h文件中添加宏定义#define S3C64XX_PA_DM9000 (0 x1800000
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 心理咨询机构首诊负责制及流程设计
- 婚姻终止协议骑缝章认证与财产分割执行合同
- 影视级虚拟摄影测量系统租赁及数据采集服务协议
- 抖音生活服务类目商家会员体系合作协议
- 幼儿园看图写话活动的技巧与范文
- 2025年成人教育教师绩效考核方案范文
- 高档住宅小区客服人员派遣与服务协议
- 暖通工程安全培训与应急预案合同
- 婚后共同购房权益界定及经济补偿协议细则
- 文化创意产业知识产权登记服务协议
- 抑郁症与rTMS治疗
- DB23T 3630-2023黑龙江省超低能耗建筑节能工程施工质量验收标准
- 吊篮安装安全技术交底
- 2024版建筑工程外架拆除承包合同2篇
- T-CBIA 009-2022 饮料浓浆标准
- 2025届高三地理一轮复习课件第二部分+4.2区域发展对交通运输布局的影响
- 乳腺癌术后出血护理
- 《快速时尚品牌》课件
- 2024中华人民共和国学前教育法详细解读课件
- 2024-2030年中国吡啶行业发展可行性及投资规划分析报告
- 无人机在应急救灾领域下的应用
评论
0/150
提交评论