OpenHarmony(鸿蒙南向开发)——小型系统内核(LiteOS-A)【LMS调测】
往期知识点记录:
- 鸿蒙(HarmonyOS)应用层开发(北向)知识点汇总
- 鸿蒙(OpenHarmony)南向开发保姆级知识点汇总~
- 持续更新中……
基本概念
LMS全称为Lite Memory Sanitizer,是一种实时检测内存操作合法性的调测工具。LMS能够实时检测缓冲区溢出(buffer overflow),释放后使用(use after free) 和重复释放(double free), 在异常发生的第一时间通知操作系统,结合backtrace等定位手段,能准确定位到产生内存问题的代码行,极大提升内存问题定位效率。
OpenHarmony LiteOS-A内核的LMS模块提供下面几种功能:
-
支持多内存池检测;
-
支持LOS_MemAlloc、LOS_MemAllocAlign、LOS_MemRealloc申请出的内存检测;
-
支持安全函数的访问检测(默认开启);
-
支持libc 高频函数的访问检测,包括:memset、memcpy、memmove、strcat、strcpy、strncat、strncpy。
运行机制
LMS使用影子内存映射标记系统内存的状态,一共可标记为三个状态:可读写,不可读写,已释放。影子内存存放在内存池的尾部。
-
内存从堆上申请后,会将数据区的影子内存设置为“可读写”状态,并将头节点区的影子内存设置为“不可读写”状态。
-
内存在堆上被释放时,会将被释放内存的影子内存设置为“已释放”状态。
-
编译代码时,会在代码中的读写指令前插入检测函数,对地址的合法性进行检验。主要是检测访问内存的影子内存的状态值,若检测到影子内存为不可读写,则会报溢出错误;若检测到影子内存为已释放,则会报释放后使用错误。
-
在内存释放时,会检测被释放地址的影子内存状态值,若检测到影子内存非可读写,则会报重复释放错误。
接口说明
内核态
OpenHarmony LiteOS-A内核的LMS模块提供下面几种功能,接口详细信息可以查看 API 参考。
表1 LMS模块接口说明
| 功能分类 | 接口名 | 描述 |
|---|---|---|
| 添加指定内存池被检测 | LOS_LmsCheckPoolAdd | 将指定内存池的地址范围添加到LMS的内存检测链表上,当访问的地址在链表范围内时,LMS才进行合法性校验;且LOS_MemInit接口会调用该接口,默认将初始化的内存池挂入到检测链表中。 |
| 删除指定内存池不被检测 | LOS_LmsCheckPoolDel | 不检测指定内存池地址范围内的合法性校验。 |
| 使能指定内存段锁保护 | LOS_LmsAddrProtect | 为某段内存地址上锁,设置为不可读写,一旦访问则报错。 |
| 去能指定内存段锁保护 | LOS_LmsAddrDisableProtect | 为某段内存地址解锁,设置为可读写。 |
用户态
用户态仅提供LMS检测库,不提供对外接口。
开发指导
内核态开发流程
开启LMS调测的典型流程如下:
-
配置LMS模块相关宏。 配置LMS控制宏LOSCFG_KERNEL_LMS,默认关,在kernel/liteos_a目录下执行 make update_config命令配置"Kernel->Enable Lite Memory Sanitizer"中打开YES:
宏 menuconfig选项 含义 取值 LOSCFG_KERNEL_LMS Enable Lms Feature Lms模块的裁剪开关 YES/NO LOSCFG_LMS_MAX_RECORD_POOL_NUM Lms check pool max num LMS支持的检测内存池最大个数 INT LOSCFG_LMS_LOAD_CHECK Enable lms read check LMS内存读检测的裁剪开关 YES/NO LOSCFG_LMS_STORE_CHECK Enable lms write check LMS内存写检测的裁剪开关 YES/NO LOSCFG_LMS_CHECK_STRICT Enable lms strict check, byte-by-byte LMS内存逐字节严格检测的裁剪开关 YES/NO -
在被检测模块的编译脚本中,修改编译选项。 增加LMS检测编译选项-fsanitize=kernel-address。为避免编译器优化,增加-O0编译选项。
gcc与clang编译选项存在差异,参照如下示例:
if ("$ohos_build_compiler_specified" == "gcc") {cflags_c = ["-O0","-fsanitize=kernel-address",] } else {cflags_c = ["-O0","-fsanitize=kernel-address","-mllvm","-asan-instrumentation-with-call-threshold=0","-mllvm","-asan-stack=0","-mllvm","-asan-globals=0",] } -
重新编译,查看串口输出。如果检测到内存问题,会输出检测结果。
内核态编程实例
本实例实现如下功能:
-
创建一个用于Lms测试的任务。
-
构造内存溢出错误和释放后使用错误。
-
添加-fsanitize=kernel-address后编译执行,观察输出结果。
内核态示例代码
该示例代码的测试函数可以加在 kernel /liteos_a/testsuites /kernel /src /osTest.c 中的 TestTaskEntry 中进行测试。 实例代码如下:
#define PAGE_SIZE (0x1000U)
#define INDEX_MAX 20
UINT32 g_lmsTestTaskId;
char g_testLmsPool[2 * PAGE_SIZE];
STATIC VOID testPoolInit(void)
{UINT32 ret = LOS_MemInit(g_testLmsPool, 2 * PAGE_SIZE);if (ret != 0) {PRINT_ERR("%s failed, ret = 0x%x\n", __FUNCTION__, ret);return;}
}
static VOID LmsTestOsmallocOverflow(VOID)
{PRINTK("\n######%s start ######\n", __FUNCTION__);UINT32 i;CHAR *str = (CHAR *)LOS_MemAlloc(g_testLmsPool, INDEX_MAX);PRINTK("str[%2d]=0x%2x ", INDEX_MAX, str[INDEX_MAX]); /* trigger heap overflow at str[INDEX_MAX] */PRINTK("\n######%s stop ######\n", __FUNCTION__);
}
static VOID LmsTestUseAfterFree(VOID)
{PRINTK("\n######%s start ######\n", __FUNCTION__);UINT32 i;CHAR *str = (CHAR *)LOS_MemAlloc(g_testLmsPool, INDEX_MAX);(VOID)LOS_MemFree(g_testLmsPool, str);PRINTK("str[%2d]=0x%2x ", 0, str[0]); /* trigger use after free at str[0] */PRINTK("\n######%s stop ######\n", __FUNCTION__);
}
VOID LmsTestCaseTask(VOID)
{testPoolInit();LmsTestOsmallocOverflow();LmsTestUseAfterFree();
}
UINT32 Example_Lms_test(VOID)
{UINT32 ret;TSK_INIT_PARAM_S lmsTestTask;/* 创建用于lms测试的任务 */memset(&lmsTestTask, 0, sizeof(TSK_INIT_PARAM_S));lmsTestTask.pfnTaskEntry = (TSK_ENTRY_FUNC)LmsTestCaseTask;lmsTestTask.pcName = "TestLmsTsk"; /* 测试任务名称 */lmsTestTask.uwStackSize = 0x800; // 0x800: lms test task stack sizelmsTestTask.usTaskPrio = 5; // 5: lms test task prioritylmsTestTask.uwResved = LOS_TASK_STATUS_DETACHED;ret = LOS_TaskCreate(&g_lmsTestTaskId, &lmsTestTask);if (ret != LOS_OK) {PRINT_ERR("LmsTestTask create failed .\n");return LOS_NOK;}return LOS_OK;
}
LOS_MODULE_INIT(Example_Lms_test, LOS_INIT_LEVEL_KMOD_EXTENDED);
c
内核态结果验证
输出结果如下:
######LmsTestOsmallocOverflow start ######
[ERR][KProcess:LmsTestCaseTask]* Kernel Address Sanitizer Error Detected Start *
[ERR][KProcess:LmsTestCaseTask]Heap buffer overflow error detected
[ERR][KProcess:LmsTestCaseTask]Illegal READ address at: [0x4157a3c8]
[ERR][KProcess:LmsTestCaseTask]Shadow memory address: [0x4157be3c : 4] Shadow memory value: [2]
OsBackTrace fp = 0x402c0f88
runTask->taskName = LmsTestCaseTask
runTask->taskID = 2
***backtrace begin***
traceback fp fixed, trace using fp = 0x402c0fd0
traceback 0 -- lr = 0x400655a4 fp = 0x402c0ff8
traceback 1 -- lr = 0x40065754 fp = 0x402c1010
traceback 2 -- lr = 0x40044bd0 fp = 0x402c1038
traceback 3 -- lr = 0x40004e14 fp = 0xcacacaca
[LMS] Dump info around address [0x4157a3c8]:[0x4157a3a0]: 00 00 00 00 00 00 00 00 | [0x4157be3a | 0]: 1 1[0x4157a3a8]: ba dc cd ab 00 00 00 00 | [0x4157be3a | 4]: 2 2[0x4157a3b0]: 20 00 00 80 00 00 00 00 | [0x4157be3b | 0]: 2 0[0x4157a3b8]: 00 00 00 00 00 00 00 00 | [0x4157be3b | 4]: 0 0[0x4157a3c0]: 00 00 00 00 00 00 00 00 | [0x4157be3c | 0]: 0 0[0x4157a3c8]: [ba] dc cd ab a8 a3 57 41 | [0x4157be3c | 4]: [2] 2[0x4157a3d0]: 2c 1a 00 00 00 00 00 00 | [0x4157be3d | 0]: 2 3[0x4157a3d8]: 00 00 00 00 00 00 00 00 | [0x4157be3d | 4]: 3 3[0x4157a3e0]: 00 00 00 00 00 00 00 00 | [0x4157be3e | 0]: 3 3[0x4157a3e8]: 00 00 00 00 00 00 00 00 | [0x4157be3e | 4]: 3 3[0x4157a3f0]: 00 00 00 00 00 00 00 00 | [0x4157be3f | 0]: 3 3
[ERR][KProcess:LmsTestCaseTask]* Kernel Address Sanitizer Error Detected End *
str[20]=0xffffffba
######LmsTestOsmallocOverflow stop ######
###### LmsTestUseAfterFree start ######
[ERR][KProcess:LmsTestCaseTask]* Kernel Address Sanitizer Error Detected Start *
[ERR][KProcess:LmsTestCaseTask]Use after free error detected
[ERR][KProcess:LmsTestCaseTask]Illegal READ address at: [0x4157a3d4]
[ERR][KProcess:LmsTestCaseTask]Shadow memory address: [0x4157be3d : 2] Shadow memory value: [3]
OsBackTrace fp = 0x402c0f90
runTask->taskName = LmsTestCaseTask
runTask->taskID = 2
***backtrace begin***
traceback fp fixed, trace using fp = 0x402c0fd8
traceback 0 -- lr = 0x40065680 fp = 0x402c0ff8
traceback 1 -- lr = 0x40065758 fp = 0x402c1010
traceback 2 -- lr = 0x40044bd0 fp = 0x402c1038
traceback 3 -- lr = 0x40004e14 fp = 0xcacacaca
[LMS] Dump info around address [0x4157a3d4]:[0x4157a3a8]: ba dc cd ab 00 00 00 00 | [0x4157be3a | 4]: 2 2[0x4157a3b0]: 20 00 00 80 00 00 00 00 | [0x4157be3b | 0]: 2 0[0x4157a3b8]: 00 00 00 00 00 00 00 00 | [0x4157be3b | 4]: 0 0[0x4157a3c0]: 00 00 00 00 00 00 00 00 | [0x4157be3c | 0]: 0 0[0x4157a3c8]: ba dc cd ab a8 a3 57 41 | [0x4157be3c | 4]: 2 2[0x4157a3d0]: 2c 1a 00 00 [00] 00 00 00 | [0x4157be3d | 0]: 2 [3][0x4157a3d8]: 00 00 00 00 00 00 00 00 | [0x4157be3d | 4]: 3 3[0x4157a3e0]: 00 00 00 00 00 00 00 00 | [0x4157be3e | 0]: 3 3[0x4157a3e8]: ba dc cd ab c8 a3 57 41 | [0x4157be3e | 4]: 2 2[0x4157a3f0]: 0c 1a 00 00 00 00 00 00 | [0x4157be3f | 0]: 2 3[0x4157a3f8]: 00 00 00 00 00 00 00 00 | [0x4157be3f | 4]: 3 3
[ERR][KProcess:LmsTestCaseTask]* Kernel Address Sanitizer Error Detected End *
str[ 0]=0x 0
######LmsTestUseAfterFree stop ######
输出的关键信息包括:
-
错误类型:
- Heap buffer overflow堆内存越界
- Use after free 释放后使用
-
错误操作:
- Illegal Read非法读
- Illegal Write非法写
- Illegal Double free重复释放
-
上下文:
- 当前任务信息(taskName, taskId)
- 回溯栈(backtrace)
-
出错地址的内存信息:
- 内存的值、及对应影子内存的值
- 内存地址:内存值| [影子内存地址 | 影子内存字节内偏移]:影子内存值
- 影子内存值:0(可读可写)、3(已释放)、2(红区)、1(填充值)。
用户态开发流程
在待检测的app编译脚本中,添加如下参数即可, 完整示例可参见 /kernel/liteos_a/apps/lms/BUILD.gn。
if ("$ohos_build_compiler_specified" == "gcc") {cflags_c = ["-O0","-fsanitize=kernel-address","-funwind-tables","-fasynchronous-unwind-tables",]} else {cflags_c = ["-O0","-fsanitize=kernel-address","-mllvm","-asan-instrumentation-with-call-threshold=0","-mllvm","-asan-stack=0","-mllvm","-asan-globals=0","-funwind-tables","-fasynchronous-unwind-tables",]}ldflags = ["-rdynamic","-lunwind","-lusrlms","-Wl,--wrap=realloc","-Wl,--wrap=calloc","-Wl,--wrap=malloc","-Wl,--wrap=free","-Wl,--wrap=valloc","-Wl,--wrap=aligned_alloc","-Wl,--wrap=memset","-Wl,--wrap=memcpy","-Wl,--wrap=memmove","-Wl,--wrap=strcpy","-Wl,--wrap=strcat",]deps = [ "//kernel/liteos_a/kernel/extended/lms/usr:usrlmslib" ]
用户态编程实例
本实例实现如下功能:
-
构造内存溢出错误和释放后使用错误。
-
添加对应编译选项后,重新编译执行。
用户态示例代码
实例代码如下:
static void BufWriteTest(void *buf, int start, int end)
{for (int i = start; i <= end; i++) {((char *)buf)[i] = 'a';}
}
static void BufReadTest(void *buf, int start, int end)
{char tmp;for (int i = start; i <= end; i++) {tmp = ((char *)buf)[i];}
}
static void LmsMallocTest(void)
{printf("\n-------- LmsMallocTest Start --------\n");char *buf = (char *)malloc(16); // 16: buffer size for testBufReadTest(buf, -1, 16);free(buf);printf("\n-------- LmsMallocTest End --------\n");
}
static void LmsFreeTest(void)
{printf("\n-------- LmsFreeTest Start --------\n");char *buf = (char *)malloc(16); // 16: buffer size for testfree(buf);BufReadTest(buf, 1, 1);free(buf);printf("\n-------- LmsFreeTest End --------\n");
}
int main(int argc, char * const * argv)
{printf("\n############### Lms Test start ###############\n");char *tmp = (char *)malloc(5000); // 5000: temp buffer sizeLmsMallocTest();LmsFreeTest();printf("\n############### Lms Test End ###############\n");
}
c
用户态结果验证
输出结果如下:
* Lite Memory Sanitizer Error Detected *
Heap buffer overflow error detected!
Illegal READ address at: [0x1f8b3edf]
Shadow memory address: [0x3d34d3ed : 6] Shadow memory value: [2]
Accessible heap addr 0
Heap red zone 2
Heap freed buffer 3
Dump info around address [0x1f8b3edf]:[0x1f8b3eb8]: 74 55 8b 1f 74 55 8b 1f | [0x3d34d3eb | 4]: 0 0[0x1f8b3ec0]: f8 9c 8b 1f 00 00 00 00 | [0x3d34d3ec | 0]: 0 0[0x1f8b3ec8]: 00 00 00 00 9c fc fc fc | [0x3d34d3ec | 4]: 0 0[0x1f8b3ed0]: 21 00 00 00 41 00 00 00 | [0x3d34d3ed | 0]: 0 0[0x1f8b3ed8]: 60 55 8b 1f 60 55 8b [1f]| [0x3d34d3ed | 4]: 2 [2][0x1f8b3ee0]: 50 4e 0b 00 00 00 00 00 | [0x3d34d3ee | 0]: 0 0[0x1f8b3ee8]: 09 00 00 00 00 00 00 00 | [0x3d34d3ee | 4]: 0 0[0x1f8b3ef0]: 00 00 00 00 08 03 09 00 | [0x3d34d3ef | 0]: 2 2[0x1f8b3ef8]: 00 00 00 00 00 00 00 00 | [0x3d34d3ef | 4]: 2 2
* Lite Memory Sanitizer Error Detected End *
Backtrace() returned 5 addresses#01: <LMS_ReportError+0x284>[0x4d6c] -> ./sample_usr_lms#02: <(null)+0x2004074>[0x4074] -> ./sample_usr_lms#03: <(null)+0x2003714>[0x3714] -> ./sample_usr_lms#04: <main+0x40>[0x363c] -> ./sample_usr_lms#05: <(null)+0x1f856f30>[0x56f30] -> /lib/libc.so
-------- LMS_malloc_test End --------
* Lite Memory Sanitizer Error Detected *
Use after free error detected!
Illegal Double free address at: [0x1f8b3ee0]
Shadow memory address: [0x3d34d3ee : 0] Shadow memory value: [3]
Accessible heap addr 0
Heap red zone 2
Heap freed buffer 3
Dump info around address [0x1f8b3ee0]:[0x1f8b3ec0]: f8 9c 8b 1f 00 00 00 00 | [0x3d34d3ec | 0]: 0 0[0x1f8b3ec8]: 00 00 00 00 fc fd fc fc | [0x3d34d3ec | 4]: 0 0[0x1f8b3ed0]: 21 00 00 00 20 01 00 00 | [0x3d34d3ed | 0]: 0 0[0x1f8b3ed8]: 60 55 8b 1f 60 55 8b 1f | [0x3d34d3ed | 4]: 2 2[0x1f8b3ee0]: [20] 60 9a 1f 40 61 9a 1f | [0x3d34d3ee | 0]: [3] 3[0x1f8b3ee8]: 60 62 9a 1f 80 63 9a 1f | [0x3d34d3ee | 4]: 3 3[0x1f8b3ef0]: 20 40 8b 1f 20 20 8b 1f | [0x3d34d3ef | 0]: 3 3[0x1f8b3ef8]: 00 00 00 00 00 00 00 00 | [0x3d34d3ef | 4]: 3 3[0x1f8b3f00]: 00 00 00 00 00 00 00 00 | [0x3d34d3f0 | 0]: 3 3
* Lite Memory Sanitizer Error Detected End *
Backtrace() returned 5 addresses#01: <LMS_ReportError+0x284>[0x4d6c] -> ./sample_usr_lms#02: <LMS_free+0xcc>[0x5548] -> ./sample_usr_lms#03: <(null)+0x2003fc4>[0x3fc4] -> ./sample_usr_lms#04: <main+0x68>[0x3664] -> ./sample_usr_lms#05: <(null)+0x1f856f30>[0x56f30] -> /lib/libc.so
-------- LMS_free_test End --------
输出的Backtrace中包含地址所在的文件名,用户需查找对应文件中地址对应的代码行号。
最后
经常有很多小伙伴抱怨说:不知道学习鸿蒙开发哪些技术?不知道需要重点掌握哪些鸿蒙应用开发知识点?
为了能够帮助到大家能够有规划的学习,这里特别整理了一套纯血版鸿蒙(HarmonyOS Next)全栈开发技术的学习路线,包含了鸿蒙开发必掌握的核心知识要点,内容有(ArkTS、ArkUI开发组件、Stage模型、多端部署、分布式应用开发、WebGL、元服务、OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、OpenHarmony驱动开发、系统定制移植等等)鸿蒙(HarmonyOS NEXT)技术知识点。

《鸿蒙 (Harmony OS)开发学习手册》(共计892页):https://gitcode.com/HarmonyOS_MN/733GH/overview
如何快速入门?
1.基本概念
2.构建第一个ArkTS应用
3.……

鸿蒙开发面试真题(含参考答案):

《OpenHarmony源码解析》:
- 搭建开发环境
- Windows 开发环境的搭建
- Ubuntu 开发环境搭建
- Linux 与 Windows 之间的文件共享
- ……
- 系统架构分析
- 构建子系统
- 启动流程
- 子系统
- 分布式任务调度子系统
- 分布式通信子系统
- 驱动子系统
- ……

OpenHarmony 设备开发学习手册:https://gitcode.com/HarmonyOS_MN/733GH/overview


相关文章:
OpenHarmony(鸿蒙南向开发)——小型系统内核(LiteOS-A)【LMS调测】
往期知识点记录: 鸿蒙(HarmonyOS)应用层开发(北向)知识点汇总 鸿蒙(OpenHarmony)南向开发保姆级知识点汇总~ 持续更新中…… 基本概念 LMS全称为Lite Memory Sanitizer,是一种实时…...
2024.9.24 数据分析
资料 111个Python数据分析实战项目,代码已跑通,数据可下载_python数据分析项目案例-CSDN博客 【数据挖掘六大项目实战】敢说这是全B站讲的最详细最通俗易懂的数据挖掘教程!整整60集!学不会来找我!-数据挖掘、数据挖掘…...
企业急于采用人工智能,忽视了安全强化
对主要云提供商基础设施上托管的资产的安全分析显示,许多公司为了急于构建和部署 AI 应用程序而打开安全漏洞。常见的发现包括对 AI 相关服务使用默认且可能不安全的设置、部署易受攻击的 AI 软件包以及不遵循安全强化指南。 这项分析由 Orca Security 的研究人员进…...
【深海王国】初中生也能画的电路板?目录合集
Hi٩(๑ ^ o ^ ๑)۶, 各位深海王国的同志们,早上下午晚上凌晨好呀~辛勤工作的你今天也辛苦啦 (o゜▽゜)o☆ 今天大都督为大家带来系列文章《初中生也能画的电路板》,帮你一周内快速入门PCB设计,手把手教你从元器件库添加、电路原理图绘制、…...
Java日期格式化注解@DateTimeFormat和@JsonFormat
DateTimeForma 这个注解主要用于处理从前端传递到后端的日期和时间数据。当你的 Spring 应用程序接收到一个 http请求,并且请求参数包含日期和时间数据时,DateTimeFormat 可以帮助你将这些数据解析为 Java Date 或 LocalDateTime 对象。 JsonFormat 这…...
阿里巴巴中国站商品详情API返回值的国际化支持
阿里巴巴中国站(通常指的是1688.com或淘宝、天猫等平台的API,但具体到商品详情API时,由于阿里巴巴的API体系庞大且不断更新,我无法直接提供一个特定于某个版本或接口的完整代码示例。不过,我可以给你一个概念性的指导&…...
TCP/IP - IP
目录 1. IPv4地址1.1. NAT技术2. IPv4数据报3. IP 分片与重组回见TCP/IP IP 网际互连协议(Internet Protocol)根据「IP地址」将数据传输到指定的目标主机,是一种 「不可靠」的 「端到端」的数据包 「传输服务」 所有的 TCP、UDP 及 ICMP 帧都以 IP 数据报格式传输。IP 协议…...
《JKTECH柔性振动盘:原理与多行业应用》东莞市江坤自动化科技有限公司
一、柔性振动盘的原理 柔性振动盘是一种新型的自动化上料设备,它采用先进的音圈电机技术和柔性振动技术,实现了对各种不规则形状、微小尺寸、易损伤零部件的高效上料和分拣。 其工作原理主要包括以下几个方面: 1. 音圈电机驱动 柔性振动盘内部…...
成功使用DDNS动态域名访问我的群晖NAS(TP-link路由器)
当NAS设备部署在动态IP环境中(如家庭或小型办公室宽带),远程访问常常受到IP地址频繁变动的困扰。为了解决这一问题,结合神卓互联NAS公网助手提供的DDNS(动态域名服务)功能,我们可以轻松实现通过…...
MySQL GROUP BY 分区大小写问题解析
在数据库操作中,GROUP BY 是一个常用的SQL语句,用于根据一个或多个列的值对结果集进行分组。然而,在使用MySQL时,你可能会遇到一个常见问题:大小写敏感性。本文将探讨MySQL中GROUP BY的大小写敏感性问题,并…...
jQuery——jQuery的基本使用
1、使用 jQuery 核心函数:$ / jQuery 2、使用 jQuery 核心对象:执行 $()返回的对象 3、引入 jQuery 函数库:可以本地引入(不用联网),也可以远程引入(需联网)…...
使用vite+react+ts+Ant Design开发后台管理项目(三)
前言 本文将引导开发者从零基础开始,运用vite、react、react-router、react-redux、Ant Design、less、tailwindcss、axios等前沿技术栈,构建一个高效、响应式的后台管理系统。通过详细的步骤和实践指导,文章旨在为开发者揭示如何利用这些技术…...
AUTOSAR_EXP_ARAComAPI的5章笔记(11)
5.4.5 轮询和事件驱动处理模式 接下来,我们探讨服务提供方同时支持事件驱动和轮询行为的情况。从服务实例(此处指骨架子类实例)的角度来看,服务消费者的请求(包括服务方法或字段的 getter/setter 调用)可能…...
面经3——中和农信
今天参加了中和农信的面试,先进行60分钟的笔试,笔试完参加面试,面试官有两个人,面试了大概四十多分钟,因为没有亮点的项目,简历看起来十分单薄。现在来复盘一下。 笔试 事务ACID、事务隔离级别、乐观锁的…...
线程1(重点知识)
线程 1.线程的概念: 线程是进程中的⼀个执行单元,负责当前进程中程序的执行,⼀个进程中至少有⼀个线程 ⼀个进程中是可以有多个线程 多个线程共享同一个进程的资源,每个线程参与操作系统的统一调度 可以简单理解: 进程 进程资源…...
Python中requests模块(爬虫)基本使用
Python的requests模块是一个非常流行的HTTP库,用于发送HTTP/1.1请求。 一、模块导入 1、requests模块的下载: 使用包管理器下载,在cmd窗口,或者在项目的虚拟环境目录下: pip3 install -i https://pypi.tuna.tsingh…...
快递上门取件API接口代码
官网:快递鸟 API列表 功能功能描述应用场景超区校验接口校验该地区是否支持上门取件,以及3天内可支持的上门取件时间段。场景一:寄件人老七,选择从深圳向北极村寄快递,通过超区检验接口,提前了解到深圳寄…...
sklearn特征选取之RFE
sklearn.feature_selection.RFE 是一种递归特征消除(Recursive Feature Elimination, RFE)方法,用于通过反复训练模型和消除不重要的特征,逐步减少特征数量,最终选择最重要的特征。它是一种用于特征选择的算法…...
vue.js 展示树状结构数据,动态生成 HTML 内容
展示树状结构数据: 从 jsonData 读取树状结构的 JSON 数据,将其解析并生成 HTML 列表来展示。树状结构数据根据 id 和 label 属性组织,节点可以包含子节点 children。 展示评级信息: 从预定义的表单字段 form 中读取 arRateFlag 和…...
科技赋能安全,财谷通助力抖音小店腾飞!
在数字经济的浪潮中,短视频与直播带货已成为新时代的商业风口,抖音小店作为这一领域的佼佼者,正引领着无数小微商家踏上创业与转型的快车道。然而,随着市场的日益繁荣,如何有效管理店铺、提升运营效率、保障交易安全成…...
Gemma-3-270m多场景落地:政务热线知识库问答、医疗术语解释系统
Gemma-3-270m多场景落地:政务热线知识库问答、医疗术语解释系统 1. 快速上手:部署你的第一个Gemma-3-270m服务 想要快速体验Gemma-3-270m的强大能力?通过Ollama部署只需几个简单步骤。 1.1 环境准备与模型选择 首先确保你已经安装了Ollam…...
MIKE URBAN中污水处理厂如何进行概化
01 前言应用厂网一体化耦合模型研究水厂间调度和厂前溢流入河污染量等内容时,由于不需要关注污水处理厂内部的具体处理工艺,需要对污水处理厂的关键设施进行概化处理。02 水厂资料收集收集污水处理的工艺流程图和设施设计参数。依据厂网一体化模型的研究…...
Java基础实战:用快马平台快速构建学生成绩管理系统巩固核心知识
最近在复习Java基础知识,发现光看理论很容易遗忘,于是决定通过一个小项目来巩固核心概念。这个简易学生成绩管理系统虽然功能简单,但涵盖了Java基础的多个重要知识点,特别适合像我这样的初学者练手。 项目整体设计思路 首先考虑…...
企业开始用 AI 后,最容易被忽略的其实是这件事!
这两年,越来越多企业开始尝试把 AI 用到日常办公中。从写邮件、整理纪要,到查询知识库、生成文档,AI 正在从个人工具变成企业工作的一部分。但很多企业在推进 AI 时,首先关注的往往是功能和效率,比如“能不能写”“能不…...
Ostrakon-VL像素UI设计细节:16色限定调色板与可访问性对比度达标
Ostrakon-VL像素UI设计细节:16色限定调色板与可访问性对比度达标 1. 项目背景与设计理念 1.1 从工业UI到像素艺术的转变 在零售与餐饮行业的AI应用场景中,传统工业级UI往往给人冰冷、复杂的印象。Ostrakon-VL扫描终端大胆采用8-bit复古像素风格&#…...
原神帧率解锁器:告别60帧限制,开启高刷新率游戏新时代
原神帧率解锁器:告别60帧限制,开启高刷新率游戏新时代 【免费下载链接】genshin-fps-unlock unlocks the 60 fps cap 项目地址: https://gitcode.com/gh_mirrors/ge/genshin-fps-unlock 对于追求极致游戏体验的《原神》玩家来说,60帧的…...
Graphormer效果对比评测:vs GCN、GAT、GIN在分子回归任务上的表现
Graphormer效果对比评测:vs GCN、GAT、GIN在分子回归任务上的表现 1. 引言 在药物发现和材料科学领域,准确预测分子属性是一个关键挑战。传统方法依赖昂贵的实验或复杂的量子化学计算,而图神经网络(GNN)提供了一种更高效的替代方案。本文将…...
C++实战:高精度阶乘算法的实现与优化
1. 为什么我们需要高精度阶乘算法? 当你第一次学习编程时,可能会用循环或递归来实现阶乘计算。比如用C写个简单的for循环,轻松计算出5! 120。但当你尝试计算20!时,事情就开始变得有趣了——你会发现结果完全不对,甚至…...
全网资源一键下载:res-downloader终极资源嗅探工具使用指南
全网资源一键下载:res-downloader终极资源嗅探工具使用指南 【免费下载链接】res-downloader 视频号、小程序、抖音、快手、小红书、直播流、m3u8、酷狗、QQ音乐等常见网络资源下载! 项目地址: https://gitcode.com/GitHub_Trending/re/res-downloader 还在为…...
毕业设计实战:基于SpringBoot的饮食分享平台设计与实现全攻略
毕业设计实战:基于SpringBoot的饮食分享平台设计与实现全攻略 在开发“饮食分享平台”这套毕设时,我曾因“菜谱信息与趣味答题数据脱节”踩过一个关键坑。初期设计时,我将“菜谱推荐”和“趣味答题”视为两个独立模块,导致用户在浏…...
