解读OBJ_KERNEL_HANDLE

本文深入解析了在创建文件对象时使用宏InitializeObjectAttributes初始化OBJECT_ATTRIBUTES结构体时,设置属性中OBJ_KERNEL_HANDLE的意义。解释了不包含此掩码时,句柄在当前上下文所属进程句柄表中的行为;以及包含此掩码时,句柄在系统上下文句柄表中的特性,强调了其对于跨进程访问的重要性。

我们在创建文件对象时,会使用宏InitializeObjectAttributes初始化OBJECT_ATTRIBUTES结构体,InitializeObjectAttributes声明如下:

VOID 
  InitializeObjectAttributes(
    OUT POBJECT_ATTRIBUTES  InitializedAttributes,
    IN PUNICODE_STRING  ObjectName,
    IN ULONG  Attributes,
    IN HANDLE  RootDirectory,
    IN PSECURITY_DESCRIPTOR  SecurityDescriptor
    );


 

其中属性Attributes可以设置OBJ_KERNEL_HANDLE,这个常量值代表什么意思呢?

若属性中不包括这个掩码,则创建的句柄属于当前上下文所属进程的句柄表中,若包括此掩码,创建的句柄属于系统上下文句柄表中(也可以叫全局句柄表吧),且不可被用户模式程序访问。假设对象属性不包含OBJ_KERNEL_HANDLE,进程A访问属于进程B的句柄,估计蓝屏(没测过),至少不会有正确的结果,所以一般情况下的设置为OBJ_CASE_INSENSITIVE|OBJ_KERNEL_HANDLE。

 

 

== 异常报告v2.3(仅供参考) == 报告解读: MediaTek On-Line> Quick Start> NE/KE分析报告解读> KE分析报告 详细描述: 看门狗复位, 其中CPU3没有喂狗, 请检查对应调用栈是否存在死锁或长时间关中断 参考信息: MediaTek On-Line> Quick Start> 深入分析看门狗框架 平台 : MT6769 (88720AAD,07C18490) 版本 : alps-vf-mp-s0.mp1unknown-V15.215.V5.10/userdebug build 异常时间: 4437.885178秒, Wed Feb 28 10:36:36 WAT 2024 == 平台信息 == -- CPU 0 1 2 [3] 4 5 6 7 -- L opp: 0( 931mV, 1800MHz, 0C) 4433.735593s B opp: 0( 987mV, 2000MHz, 0C) 4437.881161s CCI opp: 3( 831mV, 1014MHz, 0C) 4437.881161s vproc: 931mV,987mV, vsram: 1031mV,1087mV PTP ver: 0 -- LPDDR4(8G)|eMMC -- vcore dvfs opp: [-140472788.122015]12(700mV, 1534MHz) 已热重启: 4次 -- Low Power -- SPM last pc: 0xa8e == CPU信息 == 无喂狗CPU信息: CPU3: (null), pid: 0, 中断: 关 本地调用栈: vmlinux irqtime_account_irq() + 48 vmlinux __do_softirq() + 176 vmlinux run_ksoftirqd() + 48 vmlinux smpboot_thread_fn() + 380 vmlinux kthread() + 332 vmlinux ret_from_fork() + 16 == 栈结束 == 其他CPU信息: CPU0: (null), pid: 0 本地调用栈: aee_hangdet.ko 0xFFFFFFEB436EC370() aee_hangdet.ko 0xFFFFFFEB436EC09C() vmlinux call_timer_fn() + 84 vmlinux expire_timers() + 220 vmlinux __run_timers() + 492 vmlinux run_timer_softirq() + 36 vmlinux __do_softirq() + 356 vmlinux __irq_exit_rcu() + 260 vmlinux __handle_domain_irq(参数3=1) + 276 vmlinux gic_handle_irq.34851() + 104 vmlinux el1_irq() + 224 == 栈结束 == CPU1: (null), pid: 0, EL0t 本地调用栈: ...... 0x00000078F358B7A0() == 栈结束 == CPU2: (null), pid: 0, 中断: 关 本地调用栈: mcdi.ko 0xFFFFFFEB45220B4C() mcdi.ko 0xFFFFFFEB45228A90() vmlinux cpuidle_enter_state(参数3=0x0000000008113F90) + 572 vmlinux do_idle() + 772 vmlinux cpu_startup_entry() + 128 vmlinux secondary_start_kernel() + 604 == 栈结束 == CPU4: (null), pid: 0, 中断: 关 本地调用栈: mcdi.ko 0xFFFFFFEB45220B4C() mcdi.ko 0xFFFFFFEB45228A90() vmlinux cpuidle_enter_state(参数3=0x0000000008123F90) + 572 vmlinux do_idle() + 772 vmlinux cpu_startup_entry() + 128 vmlinux secondary_start_kernel() + 604 == 栈结束 == CPU5: (null), pid: 0, 中断: 关 本地调用栈: mcdi.ko 0xFFFFFFEB45220B4C() mcdi.ko 0xFFFFFFEB45228A90() vmlinux cpuidle_enter_state(参数3=0x000000000812BF90) + 572 vmlinux do_idle() + 772 vmlinux cpu_startup_entry() + 128 vmlinux secondary_start_kernel() + 604 == 栈结束 == CPU6: (null), pid: 0 本地调用栈: vmlinux __mod_memcg_lruvec_state() + 96 vmlinux __page_add_new_anon_rmap() + 556 vmlinux mfill_atomic_install_pte() + 472 vmlinux mcopy_atomic_pte() + 352 vmlinux mcopy_atomic() + 480 vmlinux userfaultfd_copy() + 404 vmlinux userfaultfd_ioctl() + 348 vmlinux __arm64_sys_ioctl() + 368 vmlinux el0_svc_common() + 208 vmlinux el0_svc() + 36 vmlinux el0_sync_handler(参数1=0xFFFFFFC01E393FE0) + 136 vmlinux el0_sync() + 436 == 栈结束 == CPU7: (null), pid: 0, 中断: 关 本地调用栈: mcdi.ko 0xFFFFFFEB45220B4C() mcdi.ko 0xFFFFFFEB45228A90() vmlinux cpuidle_enter_state(参数3=0x000000000813BF90) + 572 vmlinux do_idle() + 772 vmlinux cpu_startup_entry() + 128 vmlinux secondary_start_kernel() + 604 == 栈结束 == == 日志信息 == kernel log: [ 4414.489510] [C301344] mix1:0: Call trace: [ 4414.500103] [C301344] mix1:0: Call trace: [ 4435.530431] [C300033] ksoftirqd/3: Call trace: [ 4437.729379] [ C623] irq/154-mtk-tpd: Call trace: [ 4437.732502] [ C623] irq/154-mtk-tpd: Call trace: [ 4437.732727] [ C623] irq/154-mtk-tpd: Call trace: [ 4437.732763] [ C623] irq/154-mtk-tpd: Call trace: [ 4437.732792] [ C623] irq/154-mtk-tpd: Call trace: [ 4437.732814] [ C623] irq/154-mtk-tpd: Call trace: [ 4437.732843] [ C623] irq/154-mtk-tpd: Call trace: [ 4437.732871] [ C623] irq/154-mtk-tpd: Call trace: [ 4437.732894] [ C623] irq/154-mtk-tpd: Call trace: 分析KE还需以下文件, 请提供out/target/product/$proj/obj/KERNEL_OBJ目录下相应的文件(必须同一次编译生成, 详情请查看MOL上的'[FAQ06985]KE发生后如何判断vmlinux和log是否匹配'): mcdi.ko mtk_iommu.ko iommu_debug.ko aee_hangdet.ko vmlinux 分析报告如下,怎么获取这个log的各种信息
04-02
<think>根据提供的代码片段,这是一个使用LVGL图形库(Light and Versatile Graphics Library)的函数。函数名为`lv_100ask_demo_course_2_2_4`,用于创建一个演示界面,展示LVGL中对象对齐的功能。 ### 代码解析: 1. 首先,创建一个对象`obj1`,并使其在屏幕(lv_scr_act())上居中显示。 2. 然后,在预编译指令`#if 1`和`#endif`之间(始终会编译,因为条件为真)创建了5个对象:`obj2`、`obj_out_top`、`obj_out_bottom`、`obj_out_left`、`obj_out_right`。 3. 接着,对`obj1`重新进行居中(这一步可以省略,因为之前已经居中,可能是为了确保位置正确)。 4. 然后,使用`lv_obj_align_to`函数将四个对象分别对齐到`obj1`的四个方向的外部中间位置: - `obj_out_top`对齐到`obj1`的顶部中间外部 - `obj_out_bottom`对齐到`obj1`的底部中间外部 - `obj_out_left`对齐到`obj1`的左侧中间外部 - `obj_out_right`对齐到`obj1`的右侧中间外部 5. 最后,将`obj2`对齐到`obj_out_right`的顶部中间外部位置。 ### 效果描述: - `obj1`位于屏幕中心。 - `obj_out_top`位于`obj1`的正上方,顶部与`obj1`的顶部对齐(垂直方向上紧贴`obj1`的上边界)。 - `obj_out_bottom`位于`obj1`的正下方,底部与`obj1`的底部对齐(垂直方向上紧贴`obj1`的下边界)。 - `obj_out_left`位于`obj1`的正左侧,左侧与`obj1`的左侧对齐(水平方向上紧贴`obj1`的左边界)。 - `obj_out_right`位于`obj1`的正右侧,右侧与`obj1`的右侧对齐(水平方向上紧贴`obj1`的右边界)。 - `obj2`位于`obj_out_right`的正上方,顶部与`obj_out_right`的顶部对齐(垂直方向上紧贴`obj_out_right`的上边界)。注意,此时`obj_out_right`是一个对象,所以`obj2`会紧贴在`obj_out_right`的顶部中间位置。 ### 注意事项: - 在LVGL中,默认创建的对象是可见的,并且有默认的样式(如背景色、边框等)。 - 代码中被注释掉的部分(设置边框和轮廓宽度)可能是用于调试或样式设置,当前未启用。 - 由于没有设置这些对象的大小,它们将使用默认大小。通常默认大小可能较小,可能不易观察,可以适当设置大小。 ### 改进建议: 为了使演示更明显,可以设置对象的大小和颜色,以便区分。 ### 修改后的代码(添加了大小和颜色设置): ```c void lv_100ask_demo_course_2_2_4(void) { lv_obj_t * obj1 = lv_obj_create(lv_scr_act()); lv_obj_set_size(obj1, 100, 100); // 设置大小 lv_obj_set_style_bg_color(obj1, lv_color_hex(0xff0000), LV_PART_MAIN); // 设置背景色为红色 lv_obj_align(obj1, LV_ALIGN_CENTER, 0, 0); #if 1 lv_obj_t * obj2 = lv_obj_create(lv_scr_act()); lv_obj_t * obj_out_top = lv_obj_create(lv_scr_act()); lv_obj_t * obj_out_bottom = lv_obj_create(lv_scr_act()); lv_obj_t * obj_out_left = lv_obj_create(lv_scr_act()); lv_obj_t * obj_out_right = lv_obj_create(lv_scr_act()); // 设置每个对象的大小和颜色以便区分 lv_obj_set_size(obj_out_top, 50, 50); lv_obj_set_style_bg_color(obj_out_top, lv_color_hex(0x00ff00), LV_PART_MAIN); // 绿色 lv_obj_set_size(obj_out_bottom, 50, 50); lv_obj_set_style_bg_color(obj_out_bottom, lv_color_hex(0x0000ff), LV_PART_MAIN); // 蓝色 lv_obj_set_size(obj_out_left, 50, 50); lv_obj_set_style_bg_color(obj_out_left, lv_color_hex(0xffff00), LV_PART_MAIN); // 黄色 lv_obj_set_size(obj_out_right, 50, 50); lv_obj_set_style_bg_color(obj_out_right, lv_color_hex(0xff00ff), LV_PART_MAIN); // 紫色 lv_obj_set_size(obj2, 30, 30); lv_obj_set_style_bg_color(obj2, lv_color_hex(0x00ffff), LV_PART_MAIN); // 青色 // 对齐操作 lv_obj_align(obj1, LV_ALIGN_CENTER, 0, 0); lv_obj_align_to(obj_out_top, obj1, LV_ALIGN_OUT_TOP_MID, 0, 0); lv_obj_align_to(obj_out_bottom, obj1, LV_ALIGN_OUT_BOTTOM_MID, 0, 0); lv_obj_align_to(obj_out_left, obj1, LV_ALIGN_OUT_LEFT_MID, 0, 0); lv_obj_align_to(obj_out_right, obj1, LV_ALIGN_OUT_RIGHT_MID, 0, 0); lv_obj_align_to(obj2, obj_out_right, LV_ALIGN_OUT_TOP_MID, 0, 0); #endif } ``` ### 代码解释: - 在修改后的代码中,我们为每个对象设置了不同的颜色和大小,以便在屏幕上清晰地区分它们。 - `lv_obj_set_size(obj, width, height)`用于设置对象的大小。 - `lv_obj_set_style_bg_color(obj, color, LV_PART_MAIN)`用于设置对象的背景颜色。 - 对齐函数`lv_obj_align_to`的参数说明: - 第一个参数:要对齐的对象 - 第二个参数:基准对象 - 第三个参数:对齐方式(这里使用了外部对齐:顶部中间、底部中间、左侧中间、右侧中间) - 最后两个参数:x和y方向的偏移量,这里都是0,表示紧贴基准对象。 ### 预期效果: - 屏幕中心有一个红色的正方形(100x100)。 - 它的正上方有一个绿色的正方形(50x50),紧贴红色正方形的上边。 - 正下方有一个蓝色的正方形(50x50),紧贴红色正方形的下边。 - 左侧有一个黄色的正方形(50x50),紧贴红色正方形的左边。 - 右侧有一个紫色的正方形(50x50),紧贴红色正方形的右边。 - 在紫色正方形的正上方,紧贴紫色正方形的上边,有一个青色的小正方形(30x30)。 这样我们就可以直观地看到LVGL的对齐功能。 §§相关问题§§: 1. LVGL中还有哪些常用的对齐方式? 2. 如何动态改变LVGL对象的位置? 3. 在LVGL中,如何实现对象的相对布局(比如一个对象在另一个对象的右下角)? 4. LVGL中的对象层次关系(父子关系)如何影响布局? </think>### 代码解析:LVGL对象对齐布局示例 以下是对`lv_100ask_demo_course_2_2_4`函数的详细解析。该函数展示了LVGL库中对象对齐的高级用法,特别是`lv_obj_align_to()`函数的嵌套使用。 ```c void lv_100ask_demo_course_2_2_4(void) { // 创建主对象并居中显示 lv_obj_t * obj1 = lv_obj_create(lv_scr_act()); lv_obj_align(obj1, LV_ALIGN_CENTER, 0, 0); #if 1 // 条件编译块始终执行 // 创建5个新对象 lv_obj_t * obj2 = lv_obj_create(lv_scr_act()); lv_obj_t * obj_out_top = lv_obj_create(lv_scr_act()); lv_obj_t * obj_out_bottom = lv_obj_create(lv_scr_act()); lv_obj_t * obj_out_left = lv_obj_create(lv_scr_act()); lv_obj_t * obj_out_right = lv_obj_create(lv_scr_act()); // 重新确认主对象居中(冗余操作,可省略) lv_obj_align(obj1, LV_ALIGN_CENTER, 0, 0); // 将四个对象分别对齐到主对象的外部边缘 lv_obj_align_to(obj_out_top, obj1, LV_ALIGN_OUT_TOP_MID, 0, 0); lv_obj_align_to(obj_out_bottom, obj1, LV_ALIGN_OUT_BOTTOM_MID, 0, 0); lv_obj_align_to(obj_out_left, obj1, LV_ALIGN_OUT_LEFT_MID, 0, 0); lv_obj_align_to(obj_out_right, obj1, LV_ALIGN_OUT_RIGHT_MID, 0, 0); // 将obj2对齐到右侧对象的顶部中间外部 lv_obj_align_to(obj2, obj_out_right, LV_ALIGN_OUT_TOP_MID, 0, 0); #endif } ``` ### 关键点解释: 1. **对象创建** - `lv_obj_create(lv_scr_act())`:在当前屏幕创建基础对象(默认白色矩形) - 创建了6个对象:`obj1`(主对象)+ 5个辅助对象 2. **对齐操作** - `lv_obj_align(target, align, x_ofs, y_ofs)`:绝对对齐 - `lv_obj_align_to(target, base, align, x_ofs, y_ofs)`:相对于另一个对象对齐 3. **对齐类型解析** ```c // 相对于obj1的外部对齐示例: lv_obj_align_to(obj_out_top, obj1, LV_ALIGN_OUT_TOP_MID, 0, 0); ``` - `LV_ALIGN_OUT_TOP_MID`:将目标对象的底部对齐到基准对象的顶部中间 - 其他类似对齐方式: - `OUT_BOTTOM_MID`:目标顶部对齐基准底部 - `OUT_LEFT_MID`:目标右侧对齐基准左侧 - `OUT_RIGHT_MID`:目标左侧对齐基准右侧 4. **嵌套对齐** ```c lv_obj_align_to(obj2, obj_out_right, LV_ALIGN_OUT_TOP_MID, 0, 0); ``` - 先将`obj_out_right`对齐到`obj1`的右侧 - 再将`obj2`对齐到`obj_out_right`的顶部 - 形成对象链:`obj1 → obj_out_right → obj2` 5. **布局效果** ``` +---------------------+ | obj2 | ← 对齐到obj_out_right的顶部 +---------------------+ ↑ +-----+ | +-----+ | | | | | | obj1| | |right| ← obj_out_right对齐obj1右侧 | | | | | +-----+ | +-----+ | +---------------------+ | obj_out_top | ← 对齐obj1顶部 +---------------------+ ``` 6. **注释掉的样式设置** - 被注释的边框/轮廓设置(`lv_obj_set_style_border/outline_width`)暗示了调试布局的常用方法 ### 典型应用场景: - 创建围绕中心对象的导航元素 - 实现工具栏/状态栏布局 - 构建仪表盘控件组 - 实现环绕式菜单系统
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值