我编写了一个用于测试目的的简单字符设备(Linux)。 我有2个核心的VM。 CPU0和CPU1。
我在字符设备中有以下代码:
native_irq_enable();
smp_call_function_single(#Other CPU#,native_irq_enable);
如果我在不使用smp_call的情况下编译字符设备,则一切正常。
例如,如果我调用另一个函数:smp_call_function_single(#Othe CPU#,native_halt())
,内核不会崩溃。但是,如果我调用smp_call_function_single(#Othe CPU#,native_safe_halt())
,则内核将崩溃,因为我设置了IF(中断标志)。
我从第二个CPU设置IF时内核崩溃有什么原因吗? (如果我从CPU0设置IF,则内核不会崩溃。)
谢谢
答案 0 :(得分:0)
当您使用render() {
let {loading, error, product_categories} = this.props;
if(error) {
return (
<View style={styles.errorWrapperStyle}>
<Text style={styles.errorTextStyle}>{error}</Text>
</View>
);
}
if(product_categories & !loading){
const ds = new ListView.DataSource({rowHasChanged: (r1, r2) => r1 !== r2});
this.dataSource = ds.cloneWithRows(product_categories);
return (
<ListView
dataSource={ this.dataSource }
renderRow={ this.renderRow }
enableEmptySections={ true }
/>
);
}
return (
<Spinner size="small" />
);
}
将函数发送到另一个 CPU时,该函数将由IPI处理程序执行,因此重新启用中断处理程序中的所有中断都不会不是您想做的事。特别是执行您的功能explicitly states that all IRQs must be disabled的功能的文档。
当CPU相同时,您的函数仅执行而无需发送IPI,因此smp_call_function_single
和中断处理程序的限制不适用。