内核探索工具集
使用YOCTO编译环境修改内核源码的方法
使用YOCTO编译环境修改内核源码的方法YOCTO Project是一个开放源代码项目,为嵌入式Linux开发提供了一个灵活的框架。
它允许开发人员根据自己的需求构建一个定制的Linux 发行版,包括内核、设备驱动和用户空间组件。
在YOCTO Project中修改内核源码的方法可以分为以下几个步骤:1.准备开发环境:在开始之前,需要安装好YOCTO Project的开发环境。
详细的安装过程可以参考YOCTO Project的官方文档。
安装完成后,需要设置好环境变量,以便可以使用YOCTO Project的工具链。
2.获取内核源码:YOCTO Project使用BitBake构建系统来构建Linux发行版。
内核源码在YOCTO Project中是使用git管理的,可以通过git命令来获取。
首先需要指定要使用的内核版本,然后使用git clone命令来获取源码。
3.创建内核工作目录:在YOCTO Project中,涉及到对内核进行修改时,最好是在源码目录以外创建一个工作目录来进行操作,以免影响原有的源码。
4.配置内核:进入内核工作目录后,可以使用bitbake -c menuconfigvirtual/kernel命令来配置内核。
这将打开一个配置菜单,可以对内核进行各种设置。
可以根据项目需求来进行配置,如开启一些硬件支持、关闭不需要的功能等。
5.修改内核源码:6.构建内核:修改完成后,需要构建内核以生成相应的内核镜像。
可以使用bitbake virtual/kernel命令进行构建。
构建过程中,YOCTO Project将自动将修改的文件编译为目标文件,并将其添加到最终生成的内核镜像中。
7.安装内核:构建完成后,可以使用bitbake virtual/kernel -c deploy命令将内核安装到目标设备上。
安装过程中,生成的内核镜像将被复制到目标设备的指定位置。
8.配置设备:在将内核安装到目标设备上后,需要进行一些配置来确保内核的正常工作。
valgrind内存查看工具介绍
Valgrind内存工具学习目录一. VALGRIND工具简介 (1)1.1V ALGRIND体系结构概述 (1)1.2L INUX内存空间布局 (2)二. VALGRIND的安装 (4)2.1在L INUX系统下的安装 (4)2.2在设备中的安装 (4)三. MEMCHECK模块使用 (4)3.1使用未初始化的内存 (5)3.2内存读写越界 (6)3.3内存覆盖 (7)3.4动态内存管理错误 (8)3.5内存泄露 (9)3.6内存管理规则 (12)四. MASSIF模块的使用 (13)4.1问题引出 (13)4.2运行MASSIF模块 (14)4.3运行MS_PRINT (14)4.4.OUT文件声明 (14)4.5内存分配趋势图说明 (15)4.6内存分配详细说明 (16)4.6.1 内存分配快照表 (16)4.6.2 分配函数内存详细 (17)4.7参数说明 (17)五. CACHEGRIND使用 (18)5.1使用命令: (18)5.2结果分析 (18)六. HELGRIND模块使用 (20)七. 附录 (20)一. Valgrind工具简介用于定位应用程序开发中的内存问题。
Valgrind是linux下开源的内存问题检测工具。
1.1 Valgrind体系结构概述Valgrind是一套Linux下,开放源代码(GPL V2)的仿真调试工具的集合。
Valgrind由内核(core)以及基于内核的其他调试工具组成。
内核类似于一个框架(framework),它模拟了一个CPU环境,并提供服务给其他工具;而其他工具则类似于插件(plug-in),利用内核提供的服务完成各种特定的内存调试任务。
Valgrind的体系结构如下图所示:图 1.1 Valgrind 体系结构Valgrind包括如下一些工具:Memcheck。
这是valgrind应用最广泛的工具,一个重量级的内存检查器,能够发现开发中绝大多数内存错误使用情况,比如:使用未初始化的内存,使用已经释放了的内存,内存访问越界等。
linux kernel5.15编译原理
linux kernel5.15编译原理Linux kernel 5.15编译原理Linux kernel是一个开源操作系统内核,其稳定版本的更新和发布对于整个Linux生态系统具有重要意义。
在内核更新的过程中,编译内核是一个重要的步骤。
本文将为您解释Linux kernel 5.15的编译原理,并逐步回答关于该主题的问题。
第一步:准备工作在开始编译内核之前,我们需要做一些准备工作。
1. 下载内核源代码要编译特定版本的Linux内核,首先需要从Linux官方网站(2. 安装必要的依赖项编译内核需要一些工具和依赖项。
在大多数Linux发行版中,您可以使用包管理器来安装它们。
例如,在Ubuntu上,您可以运行以下命令安装常见的依赖项:sudo apt-get install build-essential libncurses-dev bison flexlibssl-dev libelf-dev这些依赖项将帮助您构建所需的内核映像。
第二步:配置编译选项在编译内核之前,需要配置一些编译选项以满足特定需求。
1. 进入内核源代码目录解压下载的内核源代码,并在终端中进入解压后的目录。
例如:tar -xf linux-5.15.tar.xzcd linux-5.152. 清理旧的配置选项可以使用以下命令清理旧的内核配置选项:make mrproper3. 配置编译选项可以使用以下命令进入菜单式配置界面:make menuconfig在配置界面中,您可以选择不同的内核功能、驱动程序和选项。
根据需要进行选择,并保存配置文件。
第三步:编译内核完成配置后,我们可以开始编译Linux内核了。
1. 执行编译命令使用以下命令开始编译内核:make这个过程可能需要一些时间,具体取决于您的计算机性能。
2. 安装编译后的内核完成编译后,可以使用以下命令安装编译后的内核:sudo make install此命令将复制编译后的内核映像、模块和其他文件到适当的位置,并更新GRUB或其他引导程序配置。
galaxy nexus内核调节教程
1. 触屏唤醒。
作者Ezekeel (就是Glados的作者),支持的内核,Glados,CM Plus。
解释:关屏后一段时间之内,能通过触屏点亮屏幕。
习惯后会发现比较有用。
(比如查字典,一般30s后自动关屏了,要按电源键点亮屏幕,用这个就非常方便)用法:i。
Glados Control。
这个工具是收费的,破解版是很久以前的。
ii。
终端输入:echo "1" >/sys/class/misc/touchwake/enabled1是开启,0是关闭。
默认是关屏后监听45秒,如果觉得45秒过长或过短,也可以设置,比如30秒:echo "30000" >/sys/class/misc/touchwake/delay更正:单位是毫秒,1秒=1000毫秒,这个绝对是上瘾功能,用了之后不带touchwake的内核都不想用了************************************************************************ ******2. 震动控制。
作者Morfic,支持内核,Glados,CM Plus,Imoseyon(exp版,正式版不清楚)解释:就是控制手机震动的强度,全局的。
默认数值1450,支持数值1000-1500,数字越大越强。
用法: i。
终端输入:echo "1200" >/sys/class/misc/vibratorcontrol/vibrator_strengthii。
Imoseyon内核那个Leak Tweak也可以************************************************************************ ******3. 颜色调整。
作者Ezekeel ,支持内核,All。
解释:所有内核都是抄自Glados的,有些内核看上去颜色不同只是预设的数字不一样(比如Air),不存在XX内核比XX内核颜色准确这么荒唐的事,非要这么认为的人建议去医院检查。
内核挂钩方法
内核挂钩方法以下是 8 条关于“内核挂钩方法”的内容:1. 嘿,你知道吗,内核挂钩方法就像是给电脑程序安上一双神奇的手!比如说,当你想优化某个软件的运行速度,就可以用它来直接抓住关键地方进行调整。
这不就像你在比赛中找到了致胜的诀窍一样吗?那效果,绝对杠杠的!2. 哇塞,内核挂钩方法简直是个神器啊!想想看,比如说我们玩游戏的时候,通过它来挂钩游戏的内核,对一些参数进行微调,那玩起来岂不是更爽更带劲!这就好比给游戏装上了超级引擎啊!3. 哎呀呀,内核挂钩方法可太有意思了!就像医生给病人精准治疗一样,我们能准确地找到系统的问题所在并解决它。
比如说电脑老是卡顿,用这个方法去挂钩一下,马上就变得流畅啦,多神奇呀!4. 嘿呀,内核挂钩方法可是个厉害的家伙!就跟给汽车改装一样,让它爆发出更强的性能。
像有时候我们觉得手机反应慢,用这个方法挂钩一下内核,哇,那速度简直要飞起来了!5. 哇哦,内核挂钩方法绝对是个宝藏方法呢!好比是给你的电子世界开了一扇特别的门。
比如说电脑运行某个程序老是出错,用它去挂钩弄一弄,错误就消失啦,神奇吧!6. 哎呦喂,内核挂钩方法真的好牛啊!可以把它想象成是一个神奇的魔法棒,挥一挥就能让一切变得不一样。
假设你的电脑声音有点问题,用这个方法去挂钩相关内核,瞬间声音就清晰啦,厉害吧!7. 嘿,可别小瞧了内核挂钩方法哦!它就像是一个隐藏的高手,关键时刻总能帮上大忙。
比如在处理一些复杂的软件问题时,用它来挂钩真的能迎刃而解,这不是很牛吗!8. 哇,内核挂钩方法确实是个超有用的办法!就如同在电子世界里拥有了秘密武器。
像系统偶尔出现一些小毛病,使用它进行挂钩调整,马上就恢复正常啦,真的太绝了!我的观点结论就是:内核。
linux内核配置make menuconfig菜单详解
LINUX内核配置MAKE MENUCONFIG菜单详解我们在linux内核裁剪过程中,进入内核所在目录,键入 make menuconfig 就会看到一堆的配置菜单,它们具体代表什么含义呢?我们该如何取舍呢?这里把近期收集到的一些信息做一个总结。
1、General setup代码成熟度选项,它又有子项:1.1、prompt for development and/or incomplete code/drivers该选项是对那些还在测试阶段的代码,驱动模块等的支持。
一般应该选这个选项,除非你只是想使用 LINUX 中已经完全稳定的东西。
但这样有时对系统性能影响挺大。
1.2、Cross-compiler tool prefix交叉编译工具前缀,例如:Cross-compiler tool prefix值为: (arm-linux-)1.3、Local version - append to kernel release内核显示的版本信息,填入 64字符以内的字符串,你在这里填上的字符口串可以用uname -a 命令看到。
1.4、Automatically append version information to the version string自动在版本字符串后面添加版本信息,编译时需要有perl以及git仓库支持1.5、Kernel compression mode (Gzip) --->有四个选项,这个选项是说内核镜像要用的压缩模式,回车一下,可以看到gzip,bzip2,lzma,lxo,一般可以按默认的gzip,如果要用bzip2,lzma,lxo要先装上支持1.6、Support for paging of anonymous memory (swap)使用交换分区或交换文件来做为虚拟内存,一定要选上。
1.7、System V IPC表示系统的进程间通信Inter Process Communication,它用于处理器在程序之间同步和交换信息,如果不选这项,很多程序运行不起来,必选。
minix操作系统设计与实践 概述及解释说明
minix操作系统设计与实践概述及解释说明1. 引言1.1 概述引言部分将对整篇长文进行简要概述,并介绍文章的结构和目的。
本文将讨论MINIX操作系统的设计与实践,包括MINIX的概述、设计原则以及实践应用等方面内容。
同时,我们还会对MINIX的内核架构进行详细分析,包括内核组成部分、进程管理子系统以及文件系统子系统等。
此外,我们也会介绍MINIX的用户界面和工具集,包括用户界面概述、Shell命令解析器以及编译和调试工具链等内容。
最后,文章将以总结和展望作为结尾。
1.2 文章结构本文共分为五个部分:引言、MINIX操作系统设计与实践、MINIX内核架构分析、MINIX用户界面和工具集介绍以及结论。
其中,引言部分主要是对全文进行简要概述,并介绍了每个部分的内容安排。
1.3 目的本文旨在深入了解和解释MINIX操作系统的设计与实践,并对其各个方面进行详细探讨。
通过对MINIX操作系统的研究,在学术领域中推动操作系统领域的发展,并为读者提供一个全面了解MINIX操作系统的参考资料。
此外,通过对MINIX内核架构和用户界面工具集的分析,读者将能够更好地掌握操作系统的设计原则和实践应用,从而为自己的研究和开发工作提供有益指导。
以上是引言部分的内容,主要包括概述、文章结构和目的三个方面的说明。
希望能够清晰明了地介绍本文的主题和内容安排,以吸引读者继续阅读。
2. MINIX操作系统设计与实践:2.1 MINIX概述:MINIX是一个小型的Unix-like操作系统,由Andrew S. Tanenbaum 教授在1987年首次发布。
它的名称“MINIX”代表“Minimal Unix”,这意味着它被设计成轻量级且具有最基本的功能。
MINIX旨在用于教学目的,并作为学生了解操作系统原理和实践的工具。
2.2 MINIX设计原则:MINIX的设计遵循几个关键原则。
首先,它被设计成非常模块化和可扩展的,使得内核中的各个功能模块可以独立开发、测试和维护。
Sysinternals工具集功能全解(中文)
Sysinternals⼯具集功能全解(中⽂)Windows Sysinternals ⼯具套件简介(引⾃CnBeta)Sysinternals Suite是微软发布的⼀套⾮常强⼤的免费⼯具程序集.我想介绍就不⽤多说了吧.⽤好Windows Sysinternals Suite⾥的⼯具,你将更有能⼒处理Windows的各种问题,⽽且不花⼀⽑钱.Sysinternals 之前为Winternals公司提供的免费⼯具,Winternals原本是⼀间主⼒产品为系统复原与资料保护的公司,为了解决⼯程师平常在⼯作上遇到的各种问题,便开发出许多⼩⼯具.之后他们将这些⼯具集合起来称为Sysinternals,并放在⽹路供⼈免费下载,其中也包含部分⼯具的原始码,⼀直以来都颇受IT专家社群的好评.以下为个⼯具简介译⾃SystemInternals,为控制台⼯具,⽆界⾯。
以下⼯具名称均已设好下载链接,⽅便按需下载。
本套装集合了如下 SysInternals ⼯具:AccessChk: 显⽰指定⽤户或组对注册表⽂件或服务的访问AccessEnum: 简单强⼤的安全⼯具,显⽰哪些⽤户访问了哪些⽬录、⽂件及注册键。
帮助找出权限策略中的漏洞。
AdExplorer: 活动⽬录浏览器.AdInsight: LDAP 实时监控⼯具AdRestore: Server 2003 活动⽬录对象反删除.Autologon: 登录时跳过密码认证.Autoruns: 显⽰开机⾃启动项的配置. 显⽰包括注册键和⽂件位置在内的全⾯列表。
附命令⾏版``:⽤法: autorunsc [-a] | [-c] [-b] [-d] [-e] [-g] [-h] [-i] [-l] [-m] [-n] [-p] [-r] [-s] [-v] [-w] [-x][user]-a Show all entries.-b Boot execute.-c Print output as CSV.-d Appinit DLLs.-e Explorer addons.-g Sidebar gadgets (Vista and higher).-h Image hijacks.-i Internet Explorer addons.-l Logon startups (this is the default).-m Hide signed Microsoft entries.-n Winsock protocol and network providers.-p Printer monitor drivers.-r LSA providers.-s Autostart services and non-disabled drivers.-t Scheduled tasks.-v Verify digital signatures.-w Winlogon entries.-x Print output as XML.user Specifies the name of the user account for which autorun items will be shown.BgInfo: 可配置的桌⾯背景⾃动⽣成程序,可以⽣成含有重要系统信息的桌⾯背景,其中包括 IP 地址, 计算机名, ⽹络适配器, 等信息.BlueScreen: 不但能精确模拟蓝屏还能重启 (完全借助 CHKDSK), 适⽤于 Windows NT 4, Windows 2000, Windows XP, Server 2003 and Windows 9x.CacheSet: 可以调整 Cache Manager ⼯作集⼤⼩适⽤于NT。
ubuntu16查看内核及新安装内核
ubuntu16查看内核及新安装内核1.查看内核列表sudo dpkg --get-selections | grep linux-image2.查看当前使⽤的内核uname -r3.升级/安装内核tip:有些时候需要使⽤“sudo dpkg --get-selections -a”重新配置sudo apt-get install linux-image-4.4.0-14[56789]-generic注释:安装145-149存在的所有内核4.删除内核tip:删除当前版本重启会使⽤低⼀级的已安装内核,如果是最后⼀个内核版本删除之后重启会进⼊BIOS界⾯sudo apt-get remove linux-image-4.4.0-142-generic5. 切换内核1.⼿动重启系统,在开机进⼊grub引导界⾯,选择Advanced options for Ubuntu ,进⼊其⼦菜单,⼿动选择内核版本2.⼤部分服务器都是不在⾝边的,都是使⽤远程连接操作的,⽆法做到⼿动重启并桌⾯设置以上操作。
这时可以使⽤第⼆种⽅法。
(1)⾸先查看当前内核版本:uname -r(2)查看服务器启动内核的顺序grep menuentry /boot/grub/grub.cfg这就是ubuntu系统⽬前所拥有的内核版本与启动顺序,记住这个顺序,下⾯要⽤到。
(3)修改启动项终端运⾏命令:sudo vi /etc/default/grubGRUB_DEFAULT=x注释:x为数字,以指定启动列表中第x项为启动项,x从0开始计数GRUB_DEFAULT=”xxxx”注释:指出具体的启动项名称,例如GRUB_DEFAULT=”Ubuntu,with Linux 4.4.0-145-generic”GRUB_DEFAULT=saved注释:该项将使⽤grub-set-default和grub-reboot命令来配置默认启动项保存并退出(4)更新grubsudo update-grub(5)重启服务器sudo shutdown -r now。
内核卡死调试方法-概述说明以及解释
内核卡死调试方法-概述说明以及解释1.引言1.1 概述内核卡死是指操作系统的内核无法继续执行下去,在特定的情景下,系统停止响应并无法正常运行。
这可能会导致系统崩溃、程序无法执行或者无法正常操作。
内核卡死调试方法是帮助我们解决这类问题的一种重要工具。
在本文中,我们将讨论内核卡死调试的方法和技巧,帮助读者更好地定位和解决内核卡死的问题。
首先,我们将介绍内核卡死的原因,包括硬件故障、软件错误和不兼容性等。
然后,我们将探讨内核卡死的常见表现,例如系统停止响应、屏幕冻结和错误信息等。
接着,我们将强调内核卡死调试的重要性。
内核卡死不仅会影响系统的稳定性和性能,还可能导致数据丢失和未完成的任务。
因此,在及时发现和解决内核卡死问题的同时,可以提高系统的可靠性和用户的体验。
最后,我们将总结内核卡死调试的方法和技巧。
这些方法包括使用系统日志和调试工具来分析和追踪系统状态,以及查找和修复可能的错误。
我们还将介绍一些常用的内核卡死调试工具和技术,如调试模式和堆栈跟踪。
通过本文的阅读,读者将能够更好地理解内核卡死调试的重要性和方法,使其能够快速解决内核卡死的问题,并提高系统的稳定性和可靠性。
1.2 文章结构文章结构是指对文章主要内容进行整体的组织和安排,以便读者能够清晰地了解文章的层次结构和脉络。
在讲述内核卡死调试方法的长文中,文章结构应该包括以下几个主要部分:1. 引言:在引言部分,我们将对内核卡死调试方法的重要性和必要性进行概述。
解释为什么需要调试内核卡死问题,以及通过本文能够掌握哪些相关的调试方法。
2. 内核卡死的原因:该部分将详细介绍导致内核卡死的各种原因,如硬件故障、软件错误、驱动冲突等。
通过对这些原因的分析,读者能够更好地理解内核卡死的根本问题。
3. 内核卡死的常见表现:在这一部分,我们将列举内核卡死的一些常见表现,如系统崩溃、黑屏、任务无响应等。
通过对这些表现的描述,读者能够判断出系统是否卡死,并能更好地定位具体问题。
kernel5.10 编译方法 -回复
kernel5.10 编译方法-回复Kernel 5.10编译方法Kernel是操作系统的核心组件,主要负责处理硬件、资源管理、进程调度等。
编译自己的内核版本可以帮助我们定制化操作系统,增加新功能、修复漏洞、提高系统性能,同时也为学习内核提供了很好的机会。
本文将介绍Kernel 5.10的编译方法,并提供一步一步的指导。
步骤一:准备工作1.1 确认系统要求在编译Kernel之前,要确保你的系统符合以下要求:- Linux发行版,如Ubuntu、Debian等。
- 操作系统处于最新的更新状态,并已安装了必要的开发工具和依赖项,包括GCC、G++、make、libncurses5-dev等。
1.2 下载Kernel源码首先,我们需要从官方网站下载Kernel 5.10的源码。
打开步骤二:配置内核2.1 进入源码目录使用终端进入到刚解压的内核源码目录。
例如,假设你将其解压到/home/user/kernel-5.10目录,你可以使用以下命令进入到该目录:shellcd /home/user/kernel-5.102.2 配置内核在源码目录下,运行以下命令来配置内核:shellmake menuconfig该命令将打开一个文本界面的配置菜单,允许你选择不同的内核配置选项。
在配置菜单中,你可以按照自己的需求修改内核的各种选项。
例如,你可以选择添加新的功能、开启或关闭特定的驱动程序,或者进行其它自定义设置。
通过上下方向键导航菜单,使用空格键选中或取消选项。
按下键盘上的"?"键,可以查看每个选项的详细说明。
完成配置后,保存并退出配置菜单。
此时,你可以选择将内核配置保存为.config文件,以便今后使用。
它将被保存在源码目录下。
当你再次编译内核或者配置新的内核时,可以使用保存的配置进行参考。
你可以使用以下命令保存内核配置:shellcp .config /home/user/kernel-config-5.10步骤三:编译内核3.1 开始编译在源码目录下,运行以下命令编译内核:shellmake -j(nproc)该命令将使用多个CPU核心进行编译工作,加快编译速度。
NVIDIA PerfHUD ES 性能分析工具指南说明书
Android PerfHUD ES quick start guideVersion 1.0001- 1 -INTRODUCTION 3 SETUP 4 CONNECTING TO THE PERFHUD ES CLIENT 6 COMMON PROBLEMS 7KNOWN ISSUES 8IntroductionThis quick start guide is designed to assist a new user in setting up and starting PerfHUD ES profiling. PerfHUD ES enables experimentation and in-depth analysis of OpenGL ES applications. Through data provided by the OpenGL ES driver and the NVIDIA GPU, developers are given access to GPU performance and bottleneck information in order to target optimizations where they are most needed. The debugging capabilities give full access to the state of the OpenGL ES pipeline, related textures and shaders, and all rendering states to help find the causes for improper setup and rendering anomalies.For detailed information on the use of PerfHUD ES please refer to the PerfHUD ES User Guide that is installed with the host application.SetupRequirementsMinimum Host PC Hardware RequirementsWindows based PC with 1 USB port free; ideally with a 2GHz CPU and 2GB RAM.For direct Ethernet connections, you’ll need a crossover network cable, long enough to reach from the Tegra devkit’s built -in Ethernet jack to the host PC. Since the Ethernet connections are configured to automatically obtain an IP address some form of DHCP server must be configured and running on the host PC.For wireless Ethernet connections, you’ll need a wireless access point that your host PC is configured to communicate with either directly or on an accessible network.A PerfHUD ES enabled Android OS image which may be found at the Tegra developers site; /tegra/downloadsA PerfHUD ES host installer which may be found at the Tegra developers site; /tegra/downloadsSetting up the Tegra 250Please consult the Tegra 250 devkit setup guide for information on how to assemble the devkit and connect the USB cable between the devkit and the host PC. The guide may be found at the Tegra developers site;/tegra/docs/tegra_250_hw_setup.pdfFlashing the Tegra 250 with a PerfHUD ES enabled Android OSPlease consult the Tegra 250 Development Kit Android Setup Experience, specifically STEP 5: Flash the Devkit with the Android OS for information on how to flash the Android OS to your devkit. The guide may be found at the Tegra developers site;/tegra/docs/android_setup_experience_v492.pdfInstalling the Windows PerfHUD ES Host.1)Run the PerfHUD ES host installer2)Click “Next”3)Decide to accept the EULA and then click “Next”4)Decide on your installation location and then click “Next”5)Click “Install” and wait for installation to complete6)Click “Finish”Connecting to the PerfHUD ES clientCommon startup procedure1)Run the application to be profiled on the devkit.2)Run the PerfHUD ES host application on your Windows PC, you will now be promptedwith the target IP setting dialog.Connecting to the PerfHUD ES client using TCP/IPIf you are connecting to the PerfHUD ES client over wired or wireless Ethernet using TCP/IP1)Enter the IP address for your target into the dialog.2)Click “Advanced”3)Click “Refresh graphics process list”4)Select your application from the process and click “Connect”Connecting to the PerfHUD ES client using ADB1)On your windows PC open a command prompt and enter “adb logcat” noting the portassigned to the application. This will be presented in the log with a message like thefollowing;Communication layer init succeed, listen on port 7876.2)On your windows PC enable port forwarding for the applications port by entering “adbforward tcp:<port> tcp:<port>” with <port> replaced by the previously noted portnumber.3)Enter the “localhost” as the IP address into the dialog.4)Cli ck “Advanced”5)Click “Refresh graphics process list”6)Select your application from the process and click “Connect”Common problemsThe windows ding.wav plays over and over again.The sound effect is played each time a buffer object is uploaded, to disable open the view dropdown menu and select audio notifications.The driver time never seems to indicate anything onthe dashboard.Please select a non-zero value for driver time sampling as the default is zero.The speed bar is not visible and the frame profiler isnot selectable.Please ensure that your application is using the “EGL_NV_Perfmon” extension to acquire all application side timing information as detailed in the “NVIDIA PerfHUD ES User Guide”.Known issuesApplication hangs with adb logcat showing “OutputFIFO does not refill, context read is stuck”.There is no current workaround.My application fails to run with GL_OUT_OF_MEMORYand W/GraphicBufferMapper out of memorymessages.Please try restarting the Android device, if the issue persists there is no current workaround. The timing graph varies wildly for a static scene.There is no current workaround.The frame debugger takes a long time to complete orfails to complete.Please try closing any other applications or increasing the memory available on your host PC. The texture viewer does not appear.Please try restarting the PerfHUD ES Host to resolve this issue.The shader viewer shows “Microcode disassembler isnot available” for vertex and fragment microcodemodes.Vertex and fragment microcode disassembly is not supported by PerfHUD ES, please ignore these options as they will be removed in the future and select fragment or vertex source mode. The driver time sampling interval is ignored after aconnection lost.Please try setting the sampling interval to another value and then back again to your preferred value.Framebuffer objects are displayed incorrectly whenattached to a texture sampler.There is no current workaround.The geometry viewer stutters on very complexgeometry.Please try closing any other applications and ensure you have the latest drivers for your graphics card.The IP Address dialog forgets my selected port.Please re-enter your selected port or select the application from the advanced button.Vertical scroll bars appeared clipped along the verticalaxis.There is no current workaround.Portions of the Performance Dashboard overlay theFrame Debugger.Please try restarting the PerfHUD ES Host to resolve this issue.NVIDIA Corporation2701 San Tomas Expressway Santa Clara, CA 95050 NoticeALL NVIDIA DESIGN SPECIFICATIONS, REFERENCE BOARDS, FILES, DRAWINGS, DIAGNOSTICS, LISTS, AND OTHERDOCUMENTS (TOGETHER AND SEPARATELY, “MATERIALS”) ARE BEING PROVIDED “AS IS.” NVIDIA MAKES NO WARRANTIES, EXPRESSED, IMPLIED, STATUTORY, OR OTHERWISE WITH RESPECT TO THE MATERIALS, AND EXPRESSLY DISCLAIMS ALL IMPLIED WARRANTIES OF NONINFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A PARTICULAR PURPOSE.Information furnished is believed to be accurate and reliable. However, NVIDIA Corporation assumes no responsibility for the consequences of use of such information or for any infringement of patents or other rights of third parties that may result from its use. No license is granted by implication or otherwise under any patent or patent rights of NVIDIA Corporation.Specifications mentioned in this publication are subject to change without notice. This publication supersedes and replaces a ll information previously supplied. NVIDIA Corporation products are not authorized for use as critical components in life support devices or systems without express written approval of NVIDIA Corporation.TrademarksNVIDIA, the NVIDIA logo, Tegra, GeForce, NVIDIA Quadro, and NVIDIA CUDA are trademarks or registered trademarks of NVIDIA Corporation in the United States and other countries. Other company and product names may be trademarks of the respective companies with which they are associated.Copyright© 2008-2010 NVIDIA Corporation. All rights reserved.。
rootkit后门检查工具RKHunter
rootkit后门检查⼯具RKHunter---恢复内容开始---rkhunter简介:中⽂名叫”Rootkit猎⼿”,rkhunter是Linux系统平台下的⼀款开源⼊侵检测⼯具,具有⾮常全⾯的扫描范围,除了能够检测各种已知的rootkit特征码以外,还⽀持端⼝扫描、常⽤程序⽂件的变动情况检查。
rootkit是什么?rootkit是Linux平台下最常见的⼀种⽊马后门⼯具,它主要通过替换系统⽂件来达到⼊侵和和隐蔽的⽬的,这种⽊马⽐普通⽊马后门更加危险和隐蔽,普通的检测⼯具和检查⼿段很难发现这种⽊马。
rootkit攻击能⼒极强,对系统的危害很⼤,它通过⼀套⼯具来建⽴后门和隐藏⾏迹,从⽽让攻击者保住权限,以使它在任何时候都可以使⽤root 权限登录到系统。
rootkit主要有两种类型:⽂件级别和内核级别。
⽂件级别的rootkit: ⼀般是通过程序漏洞或者系统漏洞进⼊系统后,通过修改系统的重要⽂件来达到隐藏⾃⼰的⽬的。
在系统遭受rootkit攻击后,合法的⽂件被⽊马程序替代,变成了外壳程序,⽽其内部是隐藏着的后门程序。
通常容易被rootkit替换的系统程序有login、ls、ps、ifconfig、du、find、netstat等。
⽂件级别的rootkit,对系统维护很⼤,⽬前最有效的防御⽅法是定期对系统重要⽂件的完整性进⾏检查,如Tripwire、aide等。
内核级rootkit: 是⽐⽂件级rootkit更⾼级的⼀种⼊侵⽅式,它可以使攻击者获得对系统底层的完全控制权,此时攻击者可以修改系统内核,进⽽截获运⾏程序向内核提交的命令,并将其重定向到⼊侵者所选择的程序并运⾏此程序。
内核级rootkit主要依附在内核上,它并不对系统⽂件做任何修改。
以防范为主。
1.下载、安装rkhunter[root@bogon src]# wget /project/rkhunter/rkhunter/1.4.2/rkhunter-1.4.2.tar.gz安装rkhunter[root@bogon src]# tar -zxf rkhunter-1.4.2.tar.gz[root@bogon src]# cd rkhunter-1.4.2[root@bogon rkhunter-1.4.2]# ./installer.sh --install2.为基本系统程序建⽴校对样本,建议系统安装完成后就建⽴。
Windows 内核级进程隐藏、侦测技术
Windows 内核级进程隐藏、侦测技术Windowsxx 内核级进程隐藏、侦测技术信息对抗是目前开展的一个重要的方向,为了更好的防御,必须去深入的了解敌人进攻的招式。
信息对抗促使信息技术飞速的开展。
下面我选取了信息对抗技术的中一个很小一角关于windows内核级病毒隐藏技术和反病毒侦测技术作为议题详细讨论。
驱动程序是运行在系统信任的Ring0下在代码,她拥有对系统任何软件和硬件的访问权限。
这意味着内核驱动可以访问所有的系统资源,可以读取所有的内存空间,而且也被允许执行CPU的特权指令,如,读取CPU控制存放器的当前值等。
而处于用户模式下的程序如果试图从内核空间中读取一个字节或者试图执行像MOV EAX,CR3这样的汇编指令都会被立即终止掉。
不过,这种强大的底线是驱动程序的一个很小的错误就会让整个系统崩溃。
所以对隐藏和反隐藏技术来说都提供了一个极好的环境。
但是又对攻击者和反查杀者提出了更高的技术要求。
DriverEntry是内核模式驱动程序主入口点常用的名字,她的作用和main,WinMain,是一样的。
DriverEntry的第一个参数是一个指针,指向一个刚被初始化的驱动程序对象,该对象就代表你的驱动程序,DriverEntry的第二个参数是设备效劳键的键名。
DriverEntry函数返回一个NTSTATUS值。
NTSTATUS实际就是一个长整型,但你应该使用NTSTATUS定义该函数的返回值而不是LONG,这样代码的可读性会更好。
大局部内核模式支持例程都返回NTSTATUS状态代码,你可以在DDK头文件NTSTATUS.H中找到NTSTATUS的代码列表。
DriverEntry的作用主要就是创立设备对象,建立设备对象的符号链接,设置好各个类型的回调函数等。
例如:extern "C"NTSTATUSDriverEntry(IN PDRIVEROBJECT DriverObject, IN PUNICODESTRING RegistryPath)DriverObject->DriverUnload = DriverUnload; <--1 DriverObject->DriverExtension->AddDevice = AddDevice; DriverObject->DriverStartIo = StartIo;DriverObject->MajorFunction[IRPMJPNP] = DispatchPnp; <--2 DriverObject->MajorFunction[IRPMJPOWER] = DispatchPower; DriverObject->MajorFunction[IRPMJSYSTEMCONTROL] = DispatchWmi;...在WDM中通过设置AddDevice回调函数来创立设备对象。
Windows 内核级进程隐藏、侦测技术(5)
Windows 内核级进程隐藏、侦测技术(5) Windowsxx 内核级进程隐藏、侦测技术LockOwner: 0x98UniqueProcessId: 0x9cActiveProcessLinks: 0xa0QuotaPeakPoolUsage[0]: 0xa8QuotaPoolUsage[0]: 0xb0PagefileUsage: 0xb8CommitCharge: 0xbcPeakPagefileUsage: 0xc0PeakVirtualSize: 0xc4VirtualSize: 0xc8Vm: 0xd0DebugPort: 0x120ExceptionPort: 0x124ObjectTable: 0x128Token: 0x12cWorkingSetLock: 0x130WorkingSetPage: 0x150ProcessOutswapEnabled: 0x154 ProcessOutswapped: 0x155AddressSpaceInitialized: 0x156 AddressSpaceDeleted: 0x157AddressCreationLock: 0x158ForkInProgress: 0x17cVmOperation: 0x180 VmOperationEvent: 0x184 PageDirectoryPte: 0x1f0 LastFaultCount: 0x18cVadRoot: 0x194VadHint: 0x198CloneRoot: 0x19c NumberOfPrivatePages: 0x1a0 NumberOfLockedPages: 0x1a4 ForkWasSuessful: 0x182 ExitProcessCalled: 0x1aa CreateProcessReported: 0x1ab SectionHandle: 0x1acPeb: 0x1b0SectionBaseAddress: 0x1b4 QuotaBlock: 0x1b8 LastThreadExitStatus: 0x1bc WorkingSetWatch: 0x1c0 InheritedFromUniqueProcessId: 0x1c8 GrantedAess: 0x1 DefaultHardErrorProcessing 0x1d0 LdtInformation: 0x1d4 VadFreeHint: 0x1d8VdmObjects: 0x1dcDeviceMap: 0x1e0ImageFileName[0]: 0x1fcVmTrimFaultValue: 0x20cWin32Process: 0x214Win32WindowStation: 0x1c43. 什么是活动进程链表EPROCESS块中有一个ActiveProcessLinks成员,它是一个PLISTENTRY机构的双向链表。
Linux 内核汉化大揭秘
Linux 内核汉化大揭秘在阐述“基于Linux核心的汉字显示”的技术细节之前,有必要介绍一下原有Linux的工作机制。
这里主要涉及到两部分的知识,这是Linux 下终端和帧缓冲的实现。
控制台(console)通常我们在Linux下看到的控制台(console)是由几个设备构成的。
分别是/dev/ttyN(其中tty0就是/dev/console,tty1、tty2就是不同的虚拟终端(virtual console))。
通常使用热键Alt+Fn来在这些虚拟终端之间进行切换。
这些tty设备对应于linux/drivers/char/console.c和lvt.c。
其中console.c负责绘制屏幕上的字符,vt.c负责管理不同的虚拟终端,并且负责提供console.c需要绘制的内容。
Vt.c把不同虚拟终端下的需要交给console.c绘制的内容,放到不同的缓存中去。
Vt.c 管理者这样一个缓冲区的数组,并且负责在这些缓存之间切换,并指定哪一个缓冲区是被激活的。
你所看到的虚拟终端就对应着被激活的缓冲区。
Console.c 同时也负责接收终端的输入,然后把接收到的输入的信息放到缓冲区。
帧缓冲(framebuffer)Framebuffer是把显存抽象后的一个种设备,可以通过这个设备的读写直接对显存进行操作。
这种操作是抽象的、统一的。
用户不必关心物理显存的位置、换页机制等等具体细节,这些都是由Framebuffer 设备驱动程序来完成的。
Framebuffer对应的源文件在linux/drivers/video/目录下。
总的抽象设备文作为fbcon.c,在这个目录下还有与各种显卡驱动程序相关的源文件。
在使用帧缓冲时,Linux是将显卡置于图形模式下的。
我们以一个简单的例子来说明字符显示的过程。
我们假设是在虚拟终端1(/dev/tty1)下迁行如下的简单程序:main (){puts(”hello,world. ”);}pputs函数向缺省输出文件(/dev/tty)发出“写”的系统调用write(2)。
说明TTDS内核
Star's Project - 最新整合内核动态,更新相关等
/soft/
MoonShell2专题站 - MS2皮肤,MS2拓展插件,关于MS2的一切在此汇聚
/moonshell/
R4论坛 - 金手指,R4整合内核,R4用户的根据地
/
简单上手:
一、多重引导
无引导除外,娇娘在安装时有两种多重引导,简单介绍下用法
1.按键引导
开机或软复位后
默认,进入MS2
按Hale Waihona Puke A键,进入YSMenu 按住B键,进入TTMenu
2.可选引导
开机或软复位后,停留在可选界面上
触摸下屏左边的音乐图标,进入MS2
2.YSMenu下
按下Start键可打开YSMenu功能夹
选择其中的多重引导,再按照上面多重引导的说明操作即可
3.TTMenu下
主界面下提供了MoonShell2.nds与YSMenu.nds,载入所需切换的即可
三、模拟器ROM的说明
.gb ROM文件需改拓展名为.gbc
.gba插件则需拓展卡支持
B键:不换肤返回TTMENU.DAT(多重引导)
2. YSSkinSelect
建立文件夹,将YSMenu1.bmp(上屏)YSMenu2.bmp(下屏)拷入该文件夹
操作与TTSkinSelect相同
若需要自定义YS颜色,则自定义SSYS.ini文件,并将该文件拷入您的YS皮肤文件夹(重要)
PS:仅支持上下背景的替换,不支持替换GBA填充画面。
SSYS.ini文件及说明在附件中的“换肤插件”文件夹中,若需使用,请详细参考其中的说明
Linux命令高级技巧使用journalctl和dmesg命令查看系统日志和内核信息
Linux命令高级技巧使用journalctl和dmesg 命令查看系统日志和内核信息Linux命令高级技巧:使用journalctl和dmesg命令查看系统日志和内核信息在Linux操作系统中,系统日志和内核信息对于诊断和解决问题非常重要。
本文将介绍如何使用journalctl和dmesg这两个高级命令来查看系统日志和内核信息,并探讨它们的用法和一些技巧。
一、使用journalctl命令查看系统日志journalctl是systemd服务管理器的一部分,用于查看系统日志。
它具有强大的过滤和搜索功能,可以按时间戳、服务、日志级别等多种方式来过滤和查找日志信息。
1. 查看最近的系统日志要查看最近的系统日志,只需在终端中输入以下命令:```journalctl```这将显示所有的系统日志信息,按时间倒序排列。
你可以使用方向键向上或向下滚动浏览日志。
2. 过滤和搜索日志使用journalctl可以轻松地过滤和搜索日志信息。
以下是一些常用的过滤和搜索选项:- 根据时间戳过滤日志:- `-S`或`--since`:显示自指定时间开始的日志条目。
例如,`journalctl --since="2022-01-01 00:00:00"`将显示从2022年1月1日零点开始的日志。
- `-U`或`--until`:显示在指定时间之前的日志条目。
例如,`journalctl --until="2022-01-01 12:00:00"`将显示2022年1月1日中午12点之前的日志。
- 根据服务名过滤日志:- `-u`或`--unit`:显示指定服务的日志条目。
例如,`journalctl -u nginx`将显示与nginx服务相关的日志。
- 根据日志级别过滤日志:- `-p`或`--priority`:显示指定级别以上的日志条目。
级别从0(紧急)到7(调试)。
例如,`journalctl -p err`将仅显示错误级别以上的日志。
linux内核分析工具Dtrace、SystemTap、火焰图、crash等
linux内核分析⼯具Dtrace、SystemTap、⽕焰图、crash等<< System语⾔详解 >> 关于 SystemTap 的书。
我们在分析各种系统异常和故障的时候,通常会⽤到 pstack(jstack) /pldd/ lsof/ tcpdump/ gdb(jdb)/ netstat/vmstat/mpstat/truss(strace)/iostat/sar/nmon(top)等系列⼯具,这些⼯具从某个⽅⾯为我们提供了诊断信息。
但这些⼯具常常带有各类“副作⽤”,⽐如truss(见于 AIX/Solaris) 或者 strace(见于 Linux) 能够让我们检测我们应⽤的系统调⽤情况,包括调⽤参数和返回值,但是却会导致应⽤程序的性能下降;这对于诊断毫秒级响应的计费⽣产系统来说,影响巨⼤。
有没有⼀个⼯具,能够兼得上述所有⼯具的优点,⼜没有副作⽤呢?答案是有!对于 Solaris/BSD/OS X 系统来说,那就是 DTrace ⼯具(后来,Linux 也终于有了⾃⼰类似的⼯具,stap)。
DTrace 的优势是什么呢?可以这么讲,如果你对于 OS 和应⽤熟悉,利⽤ DTrace 可以诊断所有问题;没错,是“所有”,“所有”,“所有”,重要的事情说三遍!书籍:DTrace-Dynamic-Tracing-in-Oracle-Solaris-Mac-OS-X-and-FreeBSD.pdf书籍:Solaris Dynamic Tracing Guide.pdf脚本⼯具集合:DTraceToolkit-0.99动态追踪技术(中) - Dtrace、SystemTap、⽕焰图说到动态追踪就不能不提到。
DTrace 算是现代动态追踪技术的⿐祖了,它于 21 世纪初诞⽣于 Solaris 操作系统,是由原来的 Sun Microsystems 公司的⼯程师编写的。
可能很多同学都听说过 Solaris 系统和 Sun 公司的⼤名。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第二章 内核探索工具集本章包括:2.1 内核中常见的数据类型2.2 汇编2.3 汇编语言示例2.4 内联汇编2.5 特殊的C语言用法2.6 内核探索工具一览2.7 内核发言:倾听来自内核的消息2.8 其他(Miscellaneous Quirks)小结项目:Hellomod习题本章简要介绍Linux中一般的编码结构,并描述诸多与内核打交道的方法。
我们首先关注内核中常见数据类型,比如有效存储、信息检索、编码方法,以及基本汇编语言。
这将为我们在以后的章节中详细分析内核打下基础。
接下来介绍Linux如何将源代码编译、链接成可执行代码,这对理解交叉平台编码和更好地介绍GNU工具集不无益处。
之后就是一系列从Linux内核搜集信息的方法之概要了。
本章涉及的内容非常广泛,包括源代码和可执行代码的分析,以及在Linux内核中插入调试语句。
最后,本章以“大杂烩”的形式对其他遇到的Linux习俗进行了观察和评论1。
2.1 内核中常见的数据类型Linux中包含许多对象和数据结构,例如内存页面,进程和中断。
如果操作系统要高效运行,那么如何及时地从多个对象中引用其中的一个对象是要关注的主要问题。
Linux 使用链表和二叉搜索树(还有一组帮助例程)先将这些对象划分到不同的组,之后再以有效的方式在对应的组中查找单个元素。
2.1.1 链表1 我们还没有深入研究内核内在的东西。
由此看来,对于操纵整个内核代码而言,完全有必要对开发工具和基本概念进行概述。
当然,如果你是一个有经验的内核爱好者,你可以跳过这一节,直接从第3章(“进程:程序执行的主要模型”)开始。
在计算机科学中,链表(linked lists)是常见的数据类型,并贯穿整个Linux内核的始终。
在Linux内核中,链表常以循环双向链表的形式出现(参见图2.1)。
因此,给定链表中的任一结点,均可找到其下一结点和前一结点。
有关链表定义的所有代码可以查看头文件include/linux/list.h。
本节讨论链表的主要特征。
图2.1 调用宏INIT_LIST_HEAD后的链表使用宏LIST_HEAD和INIT_LIST_HEAD初始化链表:-----------------------------------------------------------------------------include/linux/list.h2728 struct list_head {29 struct list_head *next, *prev;30 };3132 #define LIST_HEAD_INIT(name) { &(name), &(name) }3334 #define LIST_HEAD(name) \35 struct list_head name = LIST_HEAD_INIT(name)3637 #define INIT_LIST_HEAD(ptr) do { \38 (ptr)->next = (ptr); (ptr)->prev = (ptr); \39 } while (0)-----------------------------------------------------------------------------34行:宏L IST_HEAD根据给定的名字n ame创建链表的表头37行:宏INIT_LIST_HEAD初始化表头结点中的prev指针和next指针,完成之后,name就是一个空的双向链表2。
相应地,简单栈和队列可以由函数list_add()和list_add_tail()来实现,工作队列的代码中有一个不错的例子:-----------------------------------------------------------------------------kernel/workqueue.c330 list_add(&wq->list, &workqueues);-----------------------------------------------------------------------------内核将wq->list加入到系统的工作队列链表——workqueues中,因此workqueues 就是一组队列。
与之类似,下列代码将work->entry加入到cwq->worklist的末尾,cwq->worklist 因而也被当作队列:2 一个空的链表被定义成:其头结点的next指针指向该链表的表头本身-----------------------------------------------------------------------------kernel/workqueue.c84 list_add_tail(&work->entry, &cwq->worklist);-----------------------------------------------------------------------------使用list_del()可以从链表中删除元素。
list_del()将链表元素作为参数,删除元素时,仅需修改该元素的下一结点和前一结点的指针,使之互相指向对方即可。
例如,当撤销一个工作队列时,下列代码可以从系统的工作队列链表中删除该工作队列:-----------------------------------------------------------------------------kernel/workqueue.c382 list_del(&wq->list);-----------------------------------------------------------------------------include/linux/list.h中定义了一个特别有用的宏list_for_each_entry:-----------------------------------------------------------------------------include/linux/list.h349 /**350 * list_for_each_entry - iterate over list of given type351 * @pos: the type * to use as a loop counter.352 * @head: the head for your list.353 * @member: the name of the list_struct within the struct.354 */355 #define list_for_each_entry(pos, head, member)356 for (pos = list_entry((head)->next, typeof(*pos), member),357 prefetch(pos->member.next);358 &pos->member != (head);359 pos = list_entry(pos->member.next, typeof(*pos), member),360 prefetch(pos->member.next))-----------------------------------------------------------------------------该函数循环遍历整个链表,对链表中的每个元素都起作用。
举个例子:CPU工作时,将从每个工作队列中唤醒一个进程:-----------------------------------------------------------------------------kernel/workqueue.c59 struct workqueue_struct {60 struct cpu_workqueue_struct cpu_wq[NR_CPUS];61 const char *name;62 struct list_head list; /* Empty if single thread */63 };...466 case CPU_ONLINE:467 /* Kick off worker threads. */468 list_for_each_entry(wq, &workqueues, list)469 wake_up_process(wq->cpu_wq[hotcpu].thread);470 break;-----------------------------------------------------------------------------该宏在workq u e u e_str u ct wq中扩展并应用l i st_head链表,以遍历头指针指向工作队列的链表。
如果这看起来有点混淆的话,请记住,我们并不需要为了遍历而知道这究竟是哪个链表中的结点。
直到当前结点的n e x t指针值等于该链表的头结点3时,我们就访问到该链表的表尾。
有关工作队列的说明参见图2.2。
图2.2 工作队列链表链表的改进使得头结点中仅有一个指向第一个元素的指针,刚好与在前一节中讨论过的带有双指针的头结点形成对比。
仅有一个指针的头结点应用于哈希表(参见第四章,“内存管理”),它没有指向链表表尾元素的指针。
由于在哈希查找中不常用到尾指针,因而这样做可以节省内存空间。
-----------------------------------------------------------------------------include/linux/list.h3 我们也可以通过list_for_each_entry_reverse()来反向遍历链表。
484 struct hlist_head {485 struct hlist_node *first;486 };488 struct hlist_node {489 struct hlist_node *next, **pprev;490 };492 #define HLIST_HEAD_INIT { .first = NULL }493 #define HLIST_HEAD(name) struct hlist_head name = { .first = NULL }-----------------------------------------------------------------------------492行:宏HLIST_HEAD_INIT将指针first置为空指针(null pointer)。