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

    上篇中介绍了基于PowerPC的Linux第二阶段启动过程的一部分,由于MMU的初始化涉及的内容较多,而且代码量很大,所以这部分分为上下两部。本部分继续阐述MMU硬件的初始化和最终真正使能MMU的过程。

    在开始之前,先指出前面文章出现的一个错误,在对mmu_off函数中的RFI指令的介绍时,我简单的认为是中断返回,但后来想想,CPU初始化时,中断还没有使能,所以中断返回的说法是不正确的,查了下资料,原来使用RFI指令也可以做程序跳转使用,使用RFI进行程序跳转的好处是,程序跳转后将自动执行isync指令,以保证指令空间的同步,在Linux的初始化阶段,使用RFI指令进行程序跳转比较常见,这里的RFI指令与中断返回是没有任何关系的。造成误解请见谅。

    另外,最近被工作上的事情困扰的有些力不从心了,感觉这篇对MMU的硬件初始化分析写的极其的烂,待以后收拾了心情,我一定会加以改进的,当然,也希望高手能不吝指教,就当交个朋友吧。

    先来看一下MMU_init_hw的详细代码(位于mm/ppc_mmu_32.c):

void __init MMU_init_hw(void)
{
	unsigned int hmask, mb, mb2;
	unsigned int n_hpteg, lg_n_hpteg;
    /*定义于hash_low_32.S,填充和清除Hash表*/
	extern unsigned int hash_page_patch_A[];
	extern unsigned int hash_page_patch_B[], hash_page_patch_C[];
	extern unsigned int hash_page[];
	extern unsigned int flush_hash_patch_A[], flush_hash_patch_B[];

	if (!mmu_has_feature(MMU_FTR_HPTE_TABLE)) {
/*在hash_page的开始处放置blr指令,因为在603处理器中仍能接收到DSI(Data Storage Interrupt)异常*/
		hash_page[0] = 0x4e800020;
		flush_icache_range((unsigned long) &hash_page[0],
				   (unsigned long) &hash_page[1]);  /*清空指令cache*/
		return;
	}

	if ( ppc_md.progress ) ppc_md.progress("hash:enter", 0x105);

#define LG_HPTEG_SIZE	6		/* 每个PTEG为64个字节 */
#define SDR1_LOW_BITS	((n_hpteg - 1) >> 10)
#define MIN_N_HPTEG	1024		/* min 64kB hash table */

	/*允许每页内存都有一个HPTE*/
	n_hpteg = total_memory / (PAGE_SIZE * 8);
	if (n_hpteg < MIN_N_HPTEG)
		n_hpteg = MIN_N_HPTEG;
	lg_n_hpteg = __ilog2(n_hpteg);
	if (n_hpteg & (n_hpteg - 1)) {
		++lg_n_hpteg;		/* round up if not power of 2 */
		n_hpteg = 1 << lg_n_hpteg;
	}
	Hash_size = n_hpteg << LG_HPTEG_SIZE;

	/*为哈希表申请内存地址,这两步就类似于malloc和memset*/
	if ( ppc_md.progress ) ppc_md.progress("hash:find piece", 0x322);
	Hash = __va(memblock_alloc_base(Hash_size, Hash_size,
				
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
非常抱歉,`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') ``` 在上面的示例中,我们创建了一个柱状图,并添加了柱状图数据。然后,我们添加了折线图数据,并设置了折线图的样式。接下来,我们创建了一个次坐标轴,并将折线图数据指定为使用次坐标轴。 最后,我们设置了次坐标轴的范围,以确保数据正确显示。请根据自己的需求修改数据和样式来创建您想要的组合图表。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值