本站提倡有节制游戏,合理安排游戏时间,注意劳逸结合。

【变身源码】【腾讯广点通源码】【archlinux查看命令的源码】14源码

2024-11-26 19:10:13 来源:娱乐 分类:娱乐

1.Android Cuttlefish模拟器(Android Automotive)
2.PostgreSQL内核Trigger的源码一生
3.intel14代i9编译linux内核源码需要多久?
4.PostgreSQL14基于源码安装和入门教程
5.iOS 14泄密:iPhone 9配置如何?新iPad Pro的AR功能如何?
6.CANOpen系列教程14_协议源码移植(二)

14源码

Android Cuttlefish模拟器(Android Automotive)

       为了在实际工作和学习中体验Android Automotive的多屏区划和特殊交互,本文将指导如何基于Android 源码自建一个 Automotive 模拟器,源码特别针对网络受限的源码用户,通过清华大学开源软件镜像站获取AOSP源码。源码

       首先,源码准备下载AOSP源码。源码变身源码在~/bin目录下创建repo工具,源码并通过curl获取存储网上的源码资源,确保可执行权限。源码具体步骤可参考"不懂内核的源码小潘"的文章中关于repo命令的总结。

       接下来,源码访问mirrors.tuna.tsinghua.edu.cn下载android repo仓库,源码由于代码隐藏在.repo目录中,源码下载后解压并使用repo sync命令获取完整目录。源码找到对应版本,源码如android-.0.1_r1。

       编译前,请确保源码目录有足够的空间(至少GB以上,我编译的x_版本耗用超过GB)。在源码根目录下,了解Cuttlefish与默认模拟器的区别,Cuttlefish更侧重底层调试,而emulator更偏向应用测试。

       通过lunch命令选择构型,如aosp_cf_x__auto-userdebug,其中cf表示Cuttlefish,auto专为Automotive设计。选择x版本,速度较快,arm版本则表现不佳。启动模拟器需要执行相应的命令,如launch_cvd,注意配置环境变量并保持网络连接。

       成功启动后,在浏览器访问mit id 如下。此外还引用了 PG 官方文档。

       触发器简介

       Trigger 即触发器,它可以在特定事件发生时,对数据库中的对象执行特定操作:

       根据触发事件的不同,PG 的触发器分为两类:

       不同数据库中触发器的分类有所不同,比如 Oracle 分为 DML Trigger 和 System Trigger,SQL Server 分为 DML Trigger、DDL Trigger 和 Login Trigger,不论其如何划分,多数都可以与 PG 的腾讯广点通源码触发器对应上。

       创建触发器语法

       首先介绍创建触发器的 SQL 和 PLpgSQL 语法。

       Trigger

       根据 PG 官方文档,创建 Trigger 的语法如下:

       下面以表 t1、t2 为例创建一个简单的触发器示例。表的定义如下:

       触发器定义如下,是表 t1 上的行级触发器,对 t1 进行 INSERT 之后会触发,并执行 insert_into_t2 函数,将插入到 t1 的数据也插入到 t2。

       insert_into_t2 函数定义如下,其中引用了上下文信息 NEW,表示插入到 t1 的数据,并将其插入到 t2。

       Event Trigger

       创建 Event Trigger 的语法如下,相比 Trigger 的语法要简单很多

       以下是 PG 官方文档中的一个简单示例,该 Event Trigger 可以在任何 DDL 语句执行之前触发,并抛出异常,禁止执行任何 DDL 语句。

       创建流程

       简单介绍创建触发器时 PG 内核中的函数调用流程。

       Trigger

       CREATE TRIGGER 命令都属于 DDL 语句,所以会进入 DDL 的处理流程,关键的调用路径为: ProcessUtilitySlow-->CreateTrigger-->CreateTriggerFiringOn,CreateTriggerFiringOn 函数代码超过 行,因此只介绍其中的关键步骤:

       Event Trigger

       CREATE EVENT TRIGGER 的关键调用路径为: standard_ProcessUtility-->CreateEventTrigger,该函数流程相对简单很多:

       触发器的存储

       用户创建的触发器必须持久化到数据库中,具体的存储位置是触发器相关的系统表中。

       Trigger

       Trigger 存储在 pg_trigger 系统表中,表中的关键字段如下,包含触发器所在的表、触发器名、触发器调用的函数、是否可推迟等属性。总之,通过 CREATE TRIGGER 创建触发器时指定的任何信息都会存储到系统表中。

       pg_trigger 系统表的各个字段在内存中用Trigger 结构体表示,定义如下,可见其成员变量与 pg_trigger 的属性是一一对应的。

       在内存中的 relcache(表缓存)中也同样保存有 Trigger 的信息:

       Event Trigger

       Event Trigger 存储在 pg_event_trigger 系统表中,关键字段如下,包含触发器名、调用的函数等信息。与 Trigger 不同的是,这里并不包含触发器所在的表,因为 Event Trigger 不属于任何一个表。archlinux查看命令的源码

       触发过程

       触发器会在特定事件场景下被触发,它识别这些事件的方式也很简单,就是在对应事件的代码处调用触发器函数。

       Trigger

       对于普通的触发器,触发时机是 INSERT、UPDATE、DELETE 等操作之前或者之后,所以在 PG 的执行器阶段触发,多数在 ProcessQuery-->ExecutorRun-->ExecModifyTable 函数中

       我们将执行触发操作的函数称为“触发器的执行函数”,各类触发器的执行函数命名格式比较统一,在此列举几种:

       以ExecBRInsertTriggers 为例说明触发过程:

       Event Trigger

       事件触发器支持的事件仅有 ddl_command_start、ddl_command_end、table_rewrite 和 sql_drop 这四类,分别对应四个执行函数,其触发时机说明如下:

       以 EventTriggerDDLCommandStart 为例说明触发过程:

       调用功能函数

       用户在创建触发器的 EXECUTE { FUNCTION | PROCEDURE } function_name 语句中指定了该触发器要执行的功能函数。在触发器被触发后,会执行该函数。

       Trigger

       在执行器阶段触发时,ResultRelInfo 结构体中存有表上的各项信息,其中就包括表上的触发器、函数等,所以直接从中就可以拿到触发器信息。关键结构体为 ResultRelInfo、TriggerDesc、Trigger,其嵌套关系如下:

       将ResultRelInfo 中获取的 Trigger 结构体的全部内容都填充到 TriggerData 结构体,ExecCallTriggerFunc 函数再从 TriggerData 中获取函数 oid,并执行该函数。

       TriggerData 结构体定义如下,其中除了 Trigger 以外还保存了各种执行上下文信息,heap 表信息等,与函数的执行有关。

       TriggerData 最终会保存到PLpgSQL_execstate 中,这是 PLpgSQL 执行过程中的一个重要结构体:

       触发器的功能函数执行的方法与普通的 PLpgSQL 函数、存储过程执行方法是类似的,关键调用路径是: ExecCallTriggerFunc-->plpgsql_call_handler-->plpgsql_exec_trigger-->exec_toplevel_block-->exec_stmt_block-->…………

       Event Trigger

       对于事件触发器,在触发阶段的EventTriggerCommonSetup 函数中,通过 EventCacheLookup 从缓存中查找触发器功能函数,然后在 EventTriggerInvoke 中根据触发器函数的 oid 进行调用。

       EventTriggerCommonSetup 中还会填充 EventTriggerData 结构体,其中保存了调用过程中的一些关键信息:

       与普通触发器的 TriggerData 结构一样,EventTriggerData 结构体也会保存到PLpgSQL_execstate 中,在 PLpgSQL 执行过程中使用:

       事件触发器的功能函数实际执行步骤与普通触发器也基本相同,关键调用路径为: ExecCallTriggerFunc-->plpgsql_call_handler-->plpgsql_exec_event_trigger-->exec_toplevel_block-->exec_stmt_block-->…………

       修改触发器

       使用 ALTER 语句修改触发器的年换手率源码定义

       Trigger

       根据 PG 官方文档,ALTER TRIGGER 的语法如下:

       仅支持重命名和修改依赖的插件。

       重命名触发器的关键调用流程为:standard_ProcessUtility-->ExecRenameStmt-->renametrig,基本原理也是读取 pg_trigger 系统表的信息,修改以后写回系统表。

       修改触发器依赖插件的关键调用流程为:standard_ProcessUtility-->ExecAlterObjectDependsStmt,会修改 pg_depend 系统表。

       Event Trigger

       根据 PG 官方文档,ALTER EVENT TRIGGER 语法为:

       支持对事件触发器进行重命名、禁用、启用、修改 owner 的操作。

       ALTER TRIGGER 的关键函数是AlterEventTrigger,其内容较为简单:

       删除触发器

       使用 DROP 语句删除触发器

       Trigger

       PG 文档中 DROP TRIGGER 语法如下:

       删除触发器的关键函数是RemoveTriggerById,调用流程如下: ProcessUtilitySlow-->ExecDropStmt-->RemoveObjects-->performMultipleDeletions-->deleteObjectsInList-->deleteOneObject-->doDeletion-->RemoveTriggerById

       RemoveTriggerById 函数流程:

       Event Trigger

       PG 文档中 DROP EVENT TRIGGER 语法如下:

       删除事件触发器的关键函数是DropObjectById,这是一个公用的函数,可以删除多种类型的对象。

       调用流程如下: ProcessUtilitySlow-->ExecDropStmt-->RemoveObjects-->performMultipleDeletions-->deleteObjectsInList-->deleteOneObject-->doDeletion-->DropObjectById

intel代i9编译linux内核源码需要多久?

       编译Linux内核源码所需时间受多种因素影响,包括硬件性能、内核版本、编译选项等。以Intel第代i9处理器为例,其性能相较于上一代显著提升,能为编译过程提供更强支持。根据历史数据,著名Linux内核开发者Linus Torvalds在使用Intel i9-K时,编译过程大约需要秒,而使用AMD Threadripper X时,编译时间则缩短至大约秒。

       然而,Linus Torvalds本人对顶级旗舰处理器并不“舍得”,更未购买当时性能最强的X。这表明顶级硬件并非编译Linux内核的必要条件。实际上,即便是使用中高端Intel i9处理器,也已能显著减少编译时间。

       编译Linux内核的性能优化同样至关重要。合理的编译选项、并行编译、预编译等策略均能有效提升编译效率。同时,保持内核版本的适度更新,避免过时的代码和功能,也能减少编译所需时间。

       综上所述,趋势成本线源码使用Intel第代i9处理器编译Linux内核源码时,预估的编译时间可能介于秒至秒之间,实际时间则需根据具体配置和优化策略而定。而通过硬件升级、优化编译策略和保持内核版本更新,均可有效缩短编译时间,提升开发效率。

PostgreSQL基于源码安装和入门教程

       PostgreSQL 源码安装入门教程

       本文将引导您在openEuler . LTS-SP3系统上基于源码安装并配置PostgreSQL ,包括操作系统环境设置、网络配置、软件包安装、用户和数据盘创建,以及数据库的初始化、启动和管理。

       1.1 操作系统环境

       安装openEuler后,确保系统安装了bc命令(若缺失,后续会安装)。

       1.2 网络配置

       通过Nmcli配置网络,首先检查并设置网络接口ens的IP地址,无论是自动获取还是静态配置。

       1.3 更新系统与工具安装

       更新软件包并安装bc、vim、tmux和tar等工具,以支持后续操作。

       1.4 用户与数据盘创建

       创建postgres用户和用户组,以及可能的专用数据盘,如NVMe SSD,用于提高性能。

       2. 安装与配置

       2.1 下载与解压

       以root权限下载并解压PostgreSQL 的源代码压缩包。

       2.2 安装与初始化

       按照指导进行编译和安装,初始化数据库并设置启动参数。

       2.3 启动与管理

       启动数据库,登录并创建必要用户、数据库和表空间。

       3. 开机自动启动

       3.1 init.d环境

       使用start-scripts中的脚本配置init.d,确保PostgreSQL在系统启动时自动运行。

       3.2 systemd环境

       为PostgreSQL创建systemd服务文件,确保启动和管理的自动化。

       4. psql操作示例

       展示如何使用psql进行数据库操作,包括创建数据库、模式、表和数据插入等。

       5. 远程连接

       讲解如何配置防火墙以允许远程连接。

       通过以上步骤,您将掌握PostgreSQL 的源码安装和基本管理,准备好进行数据管理和应用程序开发。

iOS 泄密:iPhone 9配置如何?新iPad Pro的AR功能如何?

结论:苹果新品信息大曝光,iOS 揭示iPhone 9、新iPad Pro等新成员!

       在最新版本的iOS 源代码中,苹果的新品计划浮出水面。开发者的挖掘揭示了iPhone 9、新iPad Pro、AirTags及Apple TV遥控器等设备的细节,预示着即将到来的新一轮产品发布。

       关于iPhone 9,虽然信息不多,但关键点包括其将继续采用Touch ID指纹识别,沿袭iPhone 8的设计,但搭载升级版的A处理器和3GB内存,性能提升显著。

       新iPad Pro的亮点在于其后置三摄系统,包括ToF 3D传感器,旨在增强AR体验,如通过名为Gobi的新AR应用,用户能通过iPhone屏幕更直观地获取产品信息,如价格比较和详细内容。

       此外,苹果还将推出一款代号为“Seymour”的健身应用,支持iPhone、Apple Watch、iPad和Apple TV,帮助用户跟踪健身进度并获取锻炼指导。

       AirTags作为一款小巧的NFC配件,虽然硬件细节暂未详尽,但其主要功能是提供防丢功能,通过与苹果设备连接,有望带来创新的使用体验。

       最后,全新Apple TV遥控器与新Apple TV的发布日期可能在秋季,两者相辅相成,值得期待。

CANOpen系列教程_协议源码移植(二)

       本文主要阐述了在嵌入式系统开发中,将CANOpen协议源码移植到工程中并实现的具体步骤。作者首先强调了系列教程的背景,基于CanFestival架构、STMF1芯片、FreeRTOS操作系统、以及Keil MDK-ARM开发环境。接下来,文章深入讲解了移植过程中需要关注的几个关键点。

       在添加源码和路径部分,作者指出需要在现有工程中加入与CANOpen相关的组和文件,并添加CANOpen源码的inc头文件路径,确保编译时能正确找到所需文件。这部分是基础准备工作,确保开发环境能正确识别和使用新添加的代码。

       在添加代码及分析部分,文章聚焦于实际代码实现的关键点。作者提到需要修改的canfestival.h文件,以防止递归包含问题,同时解释了需要实现的底层驱动函数,如canSend,这是CANOpen源代码调用最频繁的函数。作者还详细介绍了初始化相关接口的实现方法,以及定时器调度接口的调用和实现。特别地,文中提到发送接口函数canSend的重要性,并建议尽量保持其接口原样,因为这一函数在多个源文件中被广泛调用。最后,文章还讨论了发送和接收缓存的实现、中断接收机制以及配置节点等关键功能。

       工程下载及运行效果部分展示了作者提供的示例工程,该工程展示了主站和从站的心跳功能,通过CAN分析仪抓取数据进行验证。通过这一部分,读者可以直观地了解移植后的CANOpen协议在实际应用中的表现。

       文章最后对文档的使用和版权所有进行了说明,并推荐了作者的博客、GitHub以及微信公众号,鼓励读者关注以获取更多相关资源和内容。

主力筹码趋向指标源码

       DMI指标又叫动向指标或趋向指标,是一种中长期股市技术分析(Technical Analysis)方法。学习炒股,要懂得股票的专业术语,还有炒股技巧也要掌握,那么主力筹码趋向指标源码是什么呢?

       DMI指标是通过分析股票价格在涨跌过程中买卖双方力量均衡点的变化情况,即多空双方的力量的变化受价格波动的影响而发生由均衡到失衡的循环过程,从而提供对趋势判断依据的一种技术指标。

       dmi指标如何

       主力筹码趋向指标源码:N:=;M:=6;

       MTR:=SUM(MAX(MAX(HIGH-LOW,ABS(HIGH-REF(CLOSE,1))),ABS(REF(CLOSE,1)-LOW)),N);

       HD:=HIGH-REF(HIGH,1);

       LD:=REF(LOW,1)-LOW;

       DMP:=SUM(IF(HD>0HD>LD,HD,0),N);

       DMM:=SUM(IF(LD>0LD>HD,LD,0),N);

       PDI:=DMP*/MTR;

       MDI:=DMM*/MTR;

       ADX:=MA(ABS(MDI-PDI)/(MDI+PDI)*,M);

       ADXR:=(ADX+REF(ADX,M))/2;

       XG:CROSS(PDI,MDI)AND CROSS(PDI,ADX)AND CROSS(PDI,ADXR)。

       至于dmi指标怎么看?dmi指标是一种“价格趋势”分析指标,有白、红、绿、黄四条线,分别代表四种状态,那就是买入、卖出、持股观望、持币观望。当股价走势向上发展,而同时+DI从下方向上突破-DI时,表明市场上有新多买家进场,为买入信号,如果ADX伴随上升,则预示股价的涨势可能更强劲。

iOS 开发者版本泄露源头:是哪款 iPhone 和如何流出的?

iOS 的重大漏洞源头疑云被揭示

       近期,有迹象表明iOS 的一个关键漏洞源头可能已被披露,这一泄漏事件让许多未公开的功能提前数月曝光。根据Motherboard的独家报道,早在几个月前,iOS 的早期版本已经在安全圈子内部广泛流传,比苹果原定的发布时间至少提前了八个月。

       消息人士透露,自2月份以来,iOS 源代码的访问权限被破解,允许黑客和安全研究员深入探索其内部结构。据报道,"整个操作系统版本的完整副本被泄露,随后迅速扩散",这为寻找早期漏洞提供了机会。

       至少五位知情者透露,漏洞的根源可以追溯至去年月的开发者版iPhone ,这些设备是从中国供应商处以数千美元的价格购得。买家获取了iOS 的内部版本后,将其分发给越狱开发者,从而引发了今年初一系列iOS 泄漏的序幕。

       泄露的代码揭示了苹果的一些内部计划,例如,疑似筹备中的耳罩式耳机、一个名为Clips的应用程序,以及可能通过iOS、watchOS和tvOS生态系统扩展的健身视频功能。对于这些潜在的革新,Motherboard已寻求安全专家的评估,Ryan Duff表示:“虽然它可能还处于预发布阶段,变化频繁,但它提供了一个深入了解iOS文件系统的宝贵窗口。它并不意味着轻松的越狱,但无疑,泄露的信息比我们通常所见的对即将发布的新版iOS来说,更为详尽丰富。”

       这一漏洞的出现,不仅引发了关于苹果安全措施的质疑,也预示着未来的iOS更新将面临更严峻的挑战,用户和开发者都需密切关注苹果的回应与应对策略。

模拟器tiny源码分析()add

       本文详细解析add指令在模拟器中的实现。

       add指令有三种格式,本文重点分析第三种格式:立即数与寄存器或寄存器间的相加。例如:add ax,0x 或 add al,0x。

       对应的指令码为:0x,0x,0x 或 0x,0x。分析时,需关注xlat_opcode_id为7的部分。

       在xlat_opcode_id为7的代码中,rm_addr指向ax寄存器,同时也指向al寄存器。在xlat_opcode_id为8时,写入的寄存器取决于指令,为ax或al。需要确定源操作数。

       在xlat_opcode_id为7时,i_data0指向立即数的位变量。在xlat_opcode_id为8时,立即数被保存在REG_SCRATCH寄存器中,同时根据i_w变量选择位或8位立即数。此时,op_from_addr指向立即数。

       在xlat_opcode_id为9时,执行操作:ax或al与位或8位立即数相加。此操作通过OP宏实现,用到的是op_to_addr和op_from_addr。

       对于第二条指令,即将立即数写入寄存器或内存单元,如:add bx,0x 或 add [bx+0x],0x。指令码分别为:0x,0xc3,0x,0x 或 0x,0x,0x,0x,0x,0x。分析时,从xlat_opcode_id为8开始处理,代码相同。

       在xlat_opcode_id为8时,决定了rm_addr值为目的操作数,并将rm_addr复制到op_to_addr中,op_to_addr值不变。i_data2代表的立即数复制到REG_SCRATCH处,然后复制到op_from_addr中。接着在xlat_opcode_id为9时执行OP(+=)操作,实现add指令。

       最后,分析add指令将寄存器与寄存器或内存相加的情况,如:add ax,bx 或 add [0x],cx。指令码分别为:0x,0xc3 或 0x,0x0e,0x,0x。这种add指令具有双向性,可以将寄存器与内存相加,也可以将内存与寄存器相加。在xlat_opcode_id为9时,源操作数和目的操作数在宏DECODE_RM_REG中完成。对于此宏不熟悉的读者,可以参考前文内容。

相关推荐
一周热点