您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 管理学资料 > 龙芯Linux内核移植和优化
龙芯Linux内核移植和优化张福新江苏中科龙梦科技有限公司中科院计算所2008.10.20内容提要•准备工作•移植步骤•性能优化案例准备工作•打好基础–学习C编程,大致了解MIPS汇编–掌握操作系统的基本概念:中断,进程,内存管理等–学习配置和编译内核•获得和熟悉龙芯硬件平台–阅读龙芯处理器手册–阅读相关平台的主板手册•准备编译环境–交叉编译–本地编译•取得内核源代码准备工作--参考资源•龙芯相关:–中科龙梦,–龙芯技术服务中心:•Linux/MIPS资源––内核代码、工具链、模拟器和各类文档参考平台•我们就以目前放PPT的这台龙芯笔记本的内核开发为例移植步骤1.试通我们的开发环境2.添加代码3.编译第一个龙芯内核并用早期的printk输出内核信息4.Kgdb5.CPU支持6.主板相关支持7.PCI子系统8.驱动程序9.调试,调试,调试,再调试试通开发环境•我们采用串口来作为调试信息窗口–本主板预留串口接口–串口简单、容易获得,适合做调试界面•串口设置–终端仿真程序:minicom(Linux),hyperterm(windows)–端口设置,波特率,奇偶校验,流控等设置:龙芯PMON缺省设置1152008N1•连接龙芯笔记本主板和调试主机•启动–应该能够看到PMON启动信息–可进入PMON命令行进行各项操作添加代码•代码位置–需要添加的代码包括板级支持、驱动和一些与系统接口的添加信息。板极支持代码按照习惯应该放在arch/mips目录下,驱动应该在driver/目录下,接口代码主要在include/asm-mips和arch/mips下–建立arch/mips/lemote目录添加代码(续)•arch/mips/lemote–提供主板相关的中断分派,PMON接口,时钟,IO,内存等平台相关资源设置–Linux-2.6.23中,需要实现的接口如下:•PMON相关:prom_init,prom_putchar•中断相关:plat_irq_dispatch,arch_init_irq•资源设置:plat_mem_setup,plat_timer_setup,pcibios_init,set_io_port_base,get_system_type,_machine_restart,_machine_halt,pm_power_off,board_time_init,mips_rtc_get_time,_wbflush等添加代码(续)•和linux/mips内核集成–Include/asm-mips/{cpu.h,module.h,chacheops.h,bootinfo.h}:龙芯相关宏定义–include/asm-mips/mach-lemote/{dma-coherency.h,mc146818rtc.h}:由于平台特殊行,需要覆盖mach-generic的内容–Arch/mips/kernel/cpu-info.c:添加龙芯CPU处理代码–Arch/mips/kernel/proc.c:把机器组名字添加到mach_group_to_name数组–Arch/mips/kernel/Makefile:根据config把龙芯CPU需要用的存储管理模块选上–Arch/mips/Makefile:增加一节把新增的代码代码链进去–Arch/mips/Kconfig:添加必要的配置选项Makefile修改样例•#•#lemotefulongmini-PCboard•#•core-$(CONFIG_LEMOTE_FULONG)+=arch/mips/lemote/lm2e/•load-$(CONFIG_LEMOTE_FULONG)+=0xffffffff80100000•cflags-$(CONFIG_LEMOTE_FULONG)+=-Iinclude/asm-mips/mach-lemoteKconfig修改•加一个CPU节,一个平台节•configCPU_LOONGSON2•boolLoongson2•dependsonSYS_HAS_CPU_LOONGSON2•selectCPU_SUPPORTS_32BIT_KERNEL•selectCPU_SUPPORTS_64BIT_KERNEL•selectCPU_SUPPORTS_HIGHMEM•help•TheLoongson2EprocessorimplementstheMIPSIIIinstructionset•withmanyextensions.Kconfig修改•configLEMOTE_FULONG•boolLemoteFulongmini-PC•selectARCH_SPARSEMEM_ENABLE•.....•selectCPU_HAS_WB•selectGENERIC_ISA_DMA_SUPPORT_BROKEN•help•LemoteFulongmini-PCboardbasedontheChineseLoongson-2ECPUandaFPGAnorthbridge配置和编译内核•选择LEMOTE_FULONGG板,别选其它任何板•选择LOONGSON2CPU•选择'characterdevices'下的串口设备和串口控制台支持,别选virtualconsole支持•在'kernelhacking'下选择cross-compilation•其它选项要么缺省,要么选择no•检查交叉编译工具路径和Makefile。makedep;make早期的printk•终端设备初始化太迟•简单的串口输出prom_printf串口驱动和控制台•Prom_printf不能满足要求(中断方式)•添加串口支持的两种方式:–静态定义include/asm/serial.h•2.6.23废止,可采用platform_device方式–运行时设置•串口参数(标准串口):–Io_type:•SERIAL_IO_MEMmemorymapped方式(writeb,readb)访问.Iomem_base+shiftedoffset•SERIAL_IO_PORTinb,outb访问.•非标准串口,可参照drivers/char/generic_serial.c•KGDB--内核调试•支持代码:putDebugChar,getDebugChar•使用:–选择'kernelhacking'下的CONFIG_REMOTE_DEBUG–准备串口连接–主机:mipsel-linux-gdbvmlinux,targetremote/dev/ttyS0–目标机:运行,停于断点处•注意事项–__init函数影响断点精确–断点别设置在函数入口(防止为初始化的指针被kgdb引用)–有时变量和栈回溯不正常一会(可能由于优化引起)CPU相关的支持代码•不支持指令的模拟或者替代–早期龙芯的除法指令,非对齐访问指令模拟•cache和TLB管理–龙芯cache管理指令有特殊性板级支持--中断•了解硬件:中断源,控制器,路由(连线)•列出方案:–一个静态的中断路由图–中断源列表–相应的中断控制器–中断控制器的级连方式8259BonitoCPUKB:1RTC:8MS:12UHCI:10/11IDE:14/15PCI:58,59,60MIPStimer中断概述•四部分代码完成中断服务:–中断检测和分派:genex.S-plat_irq_dispatch,功能是确定那个中断源发生了中断,调用do_IRQ–Do_IRQ:arch/mips/irq.c,通用框架,调用相应的中断控制器禁止/使能相应的中断,调用真正的驱动–Hw_irq_handler:每个中断源对应一个这个结构,告诉do_IRQ如何处理某个中断.如果你有一个新的中断控制器,那么就要写一段这个代码。–驱动代码:做真正的事情系统时间和时钟•rtc用于保持日历时间(启动时读)•一个系统时钟(常常是mipscpu提供的counter/compare硬件时钟)用于计算jiffies,推进系统时间PCI子系统•Documentation/mips/pci/pci.README•PCI总线的一些简单概括•启动次序•驱动接口•板级相关的函数和变量PCI总线的一些简单概括•PCI总线有三个独立的地址空间:config,IO,memory.•每个PCI设备都能响应配置命令,可以响应IO和/或memory访问。•启动时,BIOS或者OS通过配置空间设置基址寄存器。基址寄存器决定了一个设备应该响应的IO/mem范围。一条总线上的设备基址寄存器范围不能重叠•多条pci总线可以通过pci-pci桥连接pci启动次序•Do_basic_setup调用pci_init().drivers/pci/pci.c•Pci_init()首先调用pcibios_init•pcibios_init会调用pciauto_assign_resources做一个资源分配•Pcibios_init调用pci_scan_bus•Pcibios_init调用一些修正代码,调整资源分配•从pcibios_init返回后,pci_init会做最后一次基于设备的修正PCI驱动接口•Inb/outb/inw/outw/inl/outl:include/asm/io.h用于访问pciio空间.Mips_io_port_base应该初始化为pciio空间的起始地址•Readb/writebetc.include/asm/io.h驱动程序用它们来访问pcimem空间。•Pci_{read/write}_config_{byte,word,dword}:include/linux/pci.h。驱动程序用它们来访问pci配置空间•Pci_map_single等。用于把虚拟地址映射到总线地址,例如DMA时板级函数和变量接口•Structpci_opsmy_pci_ops:提供配置空间读写例程•Mips_pci_channels[]:用于给PCIAUTO的代码指定系统所有的PCI总线和地址范围•Pcibios_fixup_resources:传给pci_scan_bus,发现新设备时调用•Pcibios_fixup:pci_scan_bus结束时调用•Pcibios_fixup_irqs:pci_scan_bus结束时调用,用于修正中断分配。•Pcibios_assign_all_busses调试•Oops•四个关:–串口出字→基本硬件配置ok–cache打开→存储管理初始化ok–bogoMips计算通过(打开中断)→中断通路至少部分正确。–Init启动→用户态ok•思考,通路法代码整理和提交•编码风格–KernelsourceDocumentationdir•命名、文件组织整理•生成patch•提交和修改交互–Documenatio/SubmittingPatches性能分析和改进•存储管理–例:pagesize/TLB•网络性能TLB优化•通过增加页的大小来减少TLB失效的次数•通过软TLB减少TLB失效开销–在内存系统中建立一个硬件TLB的缓冲区•通过FAST_TLB_REFILL减少TLB失效开销–在64位操作系统内核中缓存第3级页表指针图4多种页系统下部分SPEC测试程序性能比较60.00%70.00%80.00%90.00%100.00%110.00%120.00%130.00%140.00%vprmcfcraparvorBziswiammlucaps16K64KMultipagesgzivprgccmcfcrapareonperbzitwowupswimgrappmesartequammsixapsvor0.00%1.00%2.00%3.00%4.00%5.00%6.00%7.00%8.00%Improvingpercentage6.48%0.19%3.74%7.17%1.96%1.75%5.32%0.00%1.00
本文标题:龙芯Linux内核移植和优化
链接地址:https://www.777doc.com/doc-4521448 .html