第1期 周峰等:基于CK810 LINUX3.0内核的移植实现 253 所谓ABI就是制作编译器与汇编器工具所要遵循的接口 程中解放出来,极大地提高了系统的安全性,使用户程序具有可 标准并根据编程模型定义软件对硬件资源的使用情况…。ABI 移植性。 是一个标准,可以确保所有的CK810的工具是兼容的,可互相 CK810编程模型规定CPU的两种运行级别,超级用户模式 操作,也确保兼容的二进制组件库可以创建和维护,包括处理器 和普通用户模式,正好满足Linux系统运行时的两个级别。系 特定的二进制接口——指令集,基本数据类型(如long、size4、 统调用实现并非直接和程序员或系统管理员打交道,而是一个 aign4)和异常处理,函数调用约定——如何传递参数和结果返 通过软中断机制,使用系统调用号来区分人口函数,比如x86架 回,如何分配寄存器以及如何调用堆栈。 构用int 80h实现,ARM架构用SWP指令实现,而CK810通过 针对CK810的ABI,Linux内核非常关注通用寄存器的使 trap 0软件陷阱异常来实现。 用。CK810ABI对寄存器的分配如表1所示。表中规定r0一r3用 系统调用过程:当CPU执行陷阱指令trap 0,进入异常后, 于参数传递,r14用于堆栈指针,r15用于函数返回地址,r0、r1用 处理器PSR寄存器最高位被硬件置1,实现普通用户到超级用 于函数返回值。 户的转变,紧接着把用户空间的寄存器现场保存到内核堆栈,并 表1 CK810 Register Assignments 保存epc、epsr等状态寄存器,根据r7中保存的系统调用号找到 Register Use Convention 相应处理函数处理,处理完成后根据内核堆栈恢复原用户空间 N8dale Software Name Usage Cross.call Status 寄存器。 Argument Word 1-2/Return 系统调用中现场的保存与恢复对应pt_regs结构体,严格遵 10一r1 a0.al Destroyed Buffer Address 守CK810编程模型及ABI规范,并将考虑实用及硬件上下文保 r2一r3 a2一a3 Argument Word 3-4 Destroyed 存号恢复的效率,精心设计了如下pt_regs结构体。 r4.r11 l0.17 Local Preserved struct pt—regs i Temporary registers used for unsigned long pc; r12.rl3 to.tl Preserved long origaO; expression evaluation _unsigned long sr; r14 sp Stack Pointer Preserved long a0; //rO r15 lr Link/Scratch Return Address long al; //rl r16一rl7 l8.I9 , Local Preserved long a2; //r2 Temporary registers used for Destroyed r18.r25 t2一t9 long a3; //r3 expression evaluation long regs[10]; r26 r26 Linker register long lr; //rl5 r27 r27 Assembler register long exregs[16]; r28 rdb/gb Data section base address t; r29 曲 GOT Base Address for PIC 内核规定系统调用参数一般不多于6个,当系统调用超过 r30 r30 Handler Base address 4个参数时,ABI规定传参寄存器10-r3不足以表示参数,必须在 r3l tls TLS register 进入系统调用处理函数之前,调整堆栈指针并将最后两个参数 放在内核堆栈中。 2移植过程 2.2进程管理 进程是执行程序的一个实例,Linux中每个进程有唯一的 本次移植采用的内核版本为Linux 3.0.8。Linux主要包括 PID号,进程和进程描述符(task—struct)之间有非常严格的一一 以下几个部分:进程管理、内存管理、异常中断、信号处理、系统 对应关系。进程描述符用数据结构task—struct表示,该数据结 调用及虚拟文件系统等 。 构非常庞大,用来刻画进程的状态,是内核操作和管理进程的唯 Linux移植主要是硬件抽象层的移植,包括体系结构抽象 一手段。内核采用宏定义current来快速、高效地找到当前进程 层、变体抽象层和平台抽象层。体系结构抽象层指CPU的启 的描述符,大大提升了系统的性能。Linux调用do—fork来创建 动、中断异常处理及上下文切换,变体抽象层指该类处理器所具 新进程,调用execve系统调用执行新的进程,调用exit()终止 有的特殊性,包括Cache、MMU、FPU、Profiling等,平台抽象层指 进程。 对当前系统的硬件平台进行抽象,包括平台的启动、芯片的选择 CK810为每个进程分配2个页——8 KB(2”)的空间用来 和配置、定时设备、外设I/O寄存器访问以及中断控制等。 存放内核堆栈,每个进程有独自对应的内核态堆栈。内核堆栈 Linux的移植一般通过这三个抽象层为模块来完成。对于 的底部存放进程需要快速访问的状态标记数据结构thread—in. 新的体系结构,其抽象层的建立并非那么容易。下面介绍体系 fo,thread—info结构的task成员指向自身的进程描述符 J。由于 结构移植中一些关键点。 内核态堆栈由高地址向低地址方向增长,且内核态堆栈stack所 2.1 系统调用 占空间比thread—info结构大得多,能有效防止两者的相互覆盖、 系统调用是操作系统提供给用户程序调用的一组“特殊” 造成冲突,因而内核通过当前内核堆栈可以快速取得当前进程 接口,是内核和用户程序之间沟通的桥梁 j。用户程序可以通 的描述符current。进程描述符中thread成员是一个thread— 过这组“特殊”接口来获得操作系统内核提供的服务。Linux的 struct结构类型,thread—struct结构包含体系结构相关的进程信 运行空间分为内核空间与用户空间,它们各自运行在不同的级 息比如浮点寄存器上下文,其中ksp和usp两个成员分别指向 别中,逻辑上相互隔离。通过系统调用把用户从底层的硬件编 进程的内核态堆栈和用户堆栈。这些数据结构与堆栈之间的关 第1期 何香等:三维声波方程正演多级异构并行算法设计与实现 267 4.3 多级异构并行实验结果 并行模式经过优化之后,在实验性平台上进行了测试。测 试时采用网格规模为51×641×670,炮数为32,测试过程中,暂 不考虑I/0过程。表3给出了3级并行模式并行规模为1~128 的核心计算迭代500步的计算时问、加速比和并行效率测试 结果。 平台,以提高课题的实际应用性能为目的,实现了两级MPI并 行和第3级众核并行的设计和优化,并取得了较为理想的加速 效果。本文还完成了在某实验性众核平台上多级异构算法的测 试,对课题的实际应用具有一定的意义。 参考文献 表3中的测试结果表明,采用了三级并行方式的算法在 MPI并行规模大于16时,能够保持较为理想且基本稳定的并行 效率,这是因为各炮之间数据不相关,CPU组间没有通信,因 [1]方伍宝,孙建国,赵改善,等.波动方程叠前深度偏移成像软件系统 的研制及应用[J].石油勘探,2005,44(5):486—490. [2]陈左宁,李宏亮,胡苏太.异构成为高效能计算机体系结构的新趋 此,计算通信开销比例基本保持不变。 表3 多级异构并行算法实验结果 进程 运行时间(S) 加速比 并行效率(%) l 9 993.416 l 100 4 2 805.86528 3.56 89 16 747.26432 l3.37 83.56 64 l87.16964 53.39 83.42 128 92.57896 107.94 84.32 如图5所示,上方浅色曲线为多级异构并行模式实现后的 加速比,下方深色曲线为众核并行算法的加速,从图中可以看 到,多级并行的实现对加速比的提高有很明显的作用。 lzu L00 舯 蔷60 异 40 20 n 0 20 40 60 8O 100 120 140 进程数 l+众核并行算法加速比+多级异构并行模式加速比 l 图5 多级异构并行算法实现前后加速比对比 为了验证多级并行方式对MPI扩展性能的提高,实验进行 了大规模MPI并行测试,图6中给出了3级并行模式实现后 128—1 024进程的核心计算迭代500步的加速比测试结果。 图6的曲线显示大规模运行时,多级并行异构算法的MPI 扩展性很好,因此,多级并行的实现对课题的实际应用有极大的 帮助。 图6三级异构并行算法128—1024进程加速比 5 结语 本文以三维声波正演算法为基础,基于某众核处理器计算 势[J].高性能计算技术,2007(184):1—6. [3]谢向辉,胡苏太,李宏亮.多核处理器及其对系统结构设计的影响 [J].计算机科学与探索,2008,2(6):641—650. [4]陈芳园,张冬松,王志英.异构多核处理器体系结构设计研究[J]. 计算机工程与科学,2011,33(12):27—35. [5]莫则尧,刘兴平,廖振民.应用程序并行与优化关键技术研究[J]. 数值计算与计算机应用,2002(1):31—33. (上接第255页) 3.3 Profiling应用 Profiling是CK810处理器内部的功能单元,用来统计从开 始pc到结束pc之间处理器的各项数据,包括总指令数、load store指令数、跳转预测、系统调用数目及TLB miss数等。 新增功能单元,内核需要做一定的改动才能实现其运行。 如2.2节介绍,新增的寄存器在软件方面保存在thread—struct数 据结构中,这样便于数据的读取与存放,进程切换与复制需要保 存profiling协处理器硬件上下文。 实现proifling功能,在已有的系统调用末尾增加了两个新 的系统调用(344与345号syscal1)——csky_p皿』堍实现功能: 设置触发使能位,开始与停止Pc地址,让profiling启动计数; cskyprfl—read实现功能:读取proifling协处理器的信息,即从 current线程里读取寄存器的信息存放到结构体prfl中供用户使 用。用户通过内嵌汇编把相应系统调用号写入R7寄存器就能 调用该系统调用实现proifling的功能。 4 结语 随着Linux的不断成熟,势必被越来越广泛地应用于嵌入 式领域。本文从体系结构角度阐述了Linux内核移植及应用, 更多驱动程序的开发及平台的推广应用将是下一步工作。 参考文献 [1]杭州中天微系统有限公司.C-SKY CPU ABI Standards Manual[M].浙 江.2012. [2]Ci Weuyan,Chen Xudi,Cai Suhua,et la,Methods and Skills on Transplan— ting Linux to ARM¥3C2410[C]//International Conference on Computer Engineering and Technology(ICCET 2010)2nd,Chengdu,0210,4. [3]任桥伟.Linux内核修炼之道[M].北京:人民邮电出版社,2010. [4]Robe ̄Love.Linux kernel Development[M].3版.陈莉君,康华, 译.北京:机械工业出版社,2010. [5]刘文峰,李程远,李善平.嵌入式Linux操作系统的研究[J].浙江 大学学报:工学版,2004(4). [6]韦东山.嵌入式Linux应用开发完全手册[M].、北京:人民邮电出 版社,2008.