基于PowerPC的Linux内核之旅:第2站-__secondary_start(start_here)-上

    前面一篇的early_init执行完成后,CPU启动早期的基本初始化工作算是做完了,这时内核会开始重定向并复制运行,代码如下:

bl	reloc_offset
	mr	r26,r3
	addis	r4,r3,KERNELBASE@h	/* current address of _start */
	lis	r5,PHYSICAL_START@h
	cmplw	0,r4,r5			/* already running at PHYSICAL_START? */
	bne	relocate_kernel     /*Juan内核重定向,经典启动必备*/

    这里的第一句mr是将当前偏移量保存在r26中,后面relocate_kernel会使用。之后内核会判断是否需要重定向,KERNELBASE为内核的虚拟起始地址,PHYSICAL_START为内核的实际起始地址,而内核则必须要从物理地址运行start函数。下面是relocate_kernel的详细代码:

relocate_kernel:
	addis	r9,r26,klimit@ha	/* fetch klimit */
	lwz	r25,klimit@l(r9)   /*r25 = kilmit + offset*/
	addis	r25,r25,-KERNELBASE@h    /*最后得到的r25为内核大小*/
	lis	r3,PHYSICAL_START@h   	/* 拷贝目标基地址 */
	li	r6,0			/* 实际地址,不偏移 */
	li	r5,0x4000		/* 先拷贝 16K字节*/
	bl	copy_and_flush 
	addi	r0,r3,4f@l		/* 跳到4f */
	mtctr	r0			/* in copy and do the rest. */
	bctr				/* jump to the copy */
4:	mr	r5,r25
	bl	copy_and_flush		/* copy the rest */
	b	turn_on_mmu    /*打开MMU*/

    机制很简单,就是获取内核大小后,先拷16K,再把剩下的拷过去,然后打开MMU,打开MMU的代码和关闭的类似,这里就不再列举了,看一下拷贝函数copy_and_flush,实现的是拷贝内核到内存物理起始处,并关闭cache。代码如下:

_ENTRY(copy_and_flush)
	addi	r5,r5,-4
	addi	r6,r6,-4
4:	li	r0,L1_CACHE_BYTES/4   /*L1_CACHE_BYTES:0b10000=16*/
	mtctr	r0
3:	addi	r6,r6,4			/* copy a cache line */
	lwzx	r0,r6,r4     /*读单字(4Byte),通过Cache*/
	stwx	r0,r6,r3     /*写单字,从r4加载,存在r3*/
	bdnz	  3b     /*递减计数器,循环每次拷4个字*/
	dcbst	r6,r3			/*Data Cache Block Store,再将r3的值写到内存*/
	sync
	icbi	r6,r3			/*Instruction Cache Block Invalidate,强制清空指令Cache */
	cmplw	0,r6,r5
	blt	4b     /*循环写内存,直到写完(r6>=r5)*/
	sync				/* additional sync needed on g4 */
	isync
	addi	r5,r5,4
	addi	r6,r6,4
	blr

    这里的r4是在上面调用relocate_kernel的时候赋的值,为虚拟起始地址-偏移量(偏移量是负的,remember?),即拷贝的源地址。执行完拷贝后,内核会跳转到trun_on_mmu中,该函数在SRR0中写入了start_here的地址,执行完使能MMU后,中断返回指令自动将SRR1更新为MSR,并在新的MSR控制下将SRR0更新为PC指针,实现绝对跳转,处理器即正式跳到start_here中。在此之后,就不再有前面说的链接地址与实际运行地址不同的事情了,即访问变量时也不用加上reloc

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
非常抱歉,`python-pptx`库中没有直接支持组合图表的选项。但是,您仍然可以通过创建两个图表并将它们叠加在一起,以实现类似的效果。您可以使用次坐标轴来显示第二个图表类型的数据。 以下是一个示例代码,演示如何在`python-pptx`中创建一个包含柱状图和折线图的组合图表,并使用次坐标轴: ```python from pptx import Presentation from pptx.enum.chart import XL_CHART_TYPE from pptx.util import Inches # 创建演示文稿和幻灯片 prs = Presentation() slide = prs.slides.add_slide(prs.slide_layouts[5]) # 创建图表 x, y, cx, cy = Inches(2), Inches(2), Inches(6), Inches(4.5) chart = slide.shapes.add_chart( XL_CHART_TYPE.BAR_CLUSTERED, x, y, cx, cy ).chart # 添加柱状图数据 categories = ['A', 'B', 'C', 'D'] # 横坐标 series_1_data = (1, 2, 3, 4) # 柱状图数据 chart_data = chart.chart_data chart_data.categories = categories chart_data.add_series('Bar Chart', series_1_data) # 添加折线图数据 series_2_data = (2, 4, 6, 8) # 折线图数据 series_2 = chart_data.add_series('Line Chart', series_2_data) series_2.graphical_properties.line.dash_style = 'sysDot' # 设置折线样式 # 创建次坐标轴 chart.has_secondary_category_axis = True chart.has_secondary_value_axis = True # 设置折线图数据使用次坐标轴 series_2.format.secondary_plot = True # 设置次坐标轴的最小和最大值 chart.secondary_category_axis.minimum = 0 chart.secondary_category_axis.maximum = len(categories) - 1 chart.secondary_value_axis.minimum_scale = 0 chart.secondary_value_axis.maximum_scale = max(series_2_data) # 保存演示文稿 prs.save('combo_chart.pptx') ``` 在上面的示例中,我们创建了一个柱状图,并添加了柱状图数据。然后,我们添加了折线图数据,并设置了折线图的样式。接下来,我们创建了一个次坐标轴,并将折线图数据指定为使用次坐标轴。 最后,我们设置了次坐标轴的范围,以确保数据正确显示。请根据自己的需求修改数据和样式来创建您想要的组合图表。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值