004内核编程学习笔记
- 格式:doc
- 大小:14.00 KB
- 文档页数:2
《STM32Cube高效开发教程》读书笔记目录一、前言 (2)1.1 书籍简介 (3)1.2 编写目的 (4)二、STM32Cube概述 (5)2.1 STM32Cube的意义 (6)2.2 STM32Cube的主要特点 (7)三、安装与配置 (9)3.1 STM32Cube的安装 (10)3.2 开发环境的配置 (11)四、创建项目 (12)4.1 新建项目 (13)4.2 项目设置 (14)五、HAL库介绍 (15)5.1 HAL库简介 (16)5.2 HAL库的主要组件 (18)六、STM32最小系统 (19)6.1 STM32最小系统的组成 (21)6.2 STM32最小系统的应用 (22)七、GPIO操作 (24)7.1 GPIO的基本概念 (25)7.2 GPIO的操作方法 (26)八、中断系统 (28)8.1 中断的基本概念 (29)8.2 中断的处理过程 (31)九、定时器 (33)9.1 定时器的功能介绍 (34)9.2 定时器的操作方法 (36)十五、文件系统 (37)一、前言随着科技的飞速发展,嵌入式系统已广泛应用于我们生活的方方面面,从智能手机到自动驾驶汽车,其重要性不言而喻。
而STM32作为一款广泛应用的微控制器系列,以其高性能、低功耗和丰富的外设资源赢得了广大开发者的青睐。
为了帮助开发者更好地掌握STM32系列微控制器的开发技巧,提升开发效率,我们特别推出了《STM32Cube 高效开发教程》。
本书以STM32Cube为核心,通过生动的实例和详细的讲解,全面介绍了STM32系列微控制器的开发过程。
无论是初学者还是有一定基础的开发者,都能从中找到适合自己的学习内容。
通过本书的学习,读者将能够更加深入地理解STM32的内部结构和工作原理,掌握其编程方法和调试技巧,从而更加高效地进行嵌入式系统的开发和应用。
在科技日新月异的今天,STM32系列微控制器将继续扮演着举足轻重的角色。
本文档是学习《C#高级编程》第七版的读书笔记,对于一些资源参考了网络相关文章。
本文档仅供个人学习,不可用于商业行为。
第Ⅰ部分部分 C#C#语言语言语言第一章第一章 .NET 体系结构1. 什么是 .NET Framework?2. C#语言和 .NET Framework 关系是什么?3. 什么是公共语言运行库?4. 什么是托管代码? 其与非托管代码有什么不同? 他们执行效率如何?5. IL 是什么?6. 什么是程序集?7. 值类型和引用类型的区别?答1:.NET Framework 是用于Windows 的新托管代码编程模型。
.NET Framework 又称 .Net 框架。
一个致力于敏捷软件开发(Agile software development Agile software developmentAgile software development)、快速应用开发(Rapid Rapid application developmentapplication development)、平台无关性和网络透明化的软件开发平台。
.NET 框架是以一种采用系统虚拟机运行的编程平台,以通用语言运行库(Common Language Runtime Common Language Runtime Common Language Runtime)为基础,支持多种语言(C#、VB、C++、Python 等)的开发。
答2:C#本身只是一种语言,尽管它是用于生成面向.NET 环境的代码,但它本身不是.net 的一部分。
.net 支持的一些特性,C#并不支持。
而C#语言支持的另一些特性,.net 却不支持。
但C#语言是和.NET 一起使用的,所以如果要使用C#高效地开发应用程序,理解Framework 就非常重要。
答3:.NET Framework 的核心是其运行库的执行环境, 称为公共语言运行库公共语言运行库 (CLR) 或 .NET 运行库。
计算机组成原理黑皮书笔记计算机组成原理是计算机科学与技术专业的核心课程之一,是理解计算机硬件工作原理和体系结构的基础。
黑皮书系列是该领域最经典、权威的教材之一,对于学习和理解计算机组成原理具有重要的参考价值。
第一章:引言计算机组成原理是研究计算机硬件系统的基本原理和方法,是计算机科学与技术的核心领域。
它是从硬件角度探讨计算机的结构、功能、性能和工作方式等问题,为软件开发提供了重要的指导。
黑皮书笔记旨在帮助读者深入理解计算机组成原理的核心概念和原则,以及其中涉及的各种技术和工程实践。
第二章:数字逻辑电路数字逻辑电路是计算机硬件的基础组成部分,负责完成数据的存储、传输、处理和控制。
其中包括布尔逻辑、数字信号和逻辑门电路等内容。
通过学习这一章节,我们能够了解到计算机中各种数字组件的工作原理和相互连接方式。
第三章:指令系统与汇编语言指令系统与汇编语言是计算机中实现软件和硬件交互的桥梁。
指令系统规定了计算机能够执行的指令集合,而汇编语言是一种底层的程序设计语言,用于编写与硬件直接交互的程序。
本章节将介绍指令系统的设计原则和汇编语言的基本语法。
第四章:中央处理器中央处理器(CPU)是计算机的核心组件,负责执行指令、进行数据处理和控制系统的运行。
在这一章节中,我们将深入了解CPU的组成结构和工作原理,包括指令周期、流水线技术、缓存等重要概念。
第五章:存储器和存储系统存储器是计算机中用于存储数据和程序的设备,包括主存储器和辅助存储器。
本章将介绍存储器的层次结构、存储技术和存储系统的设计原则,帮助读者理解计算机内存的组织和管理方式。
第六章:输入输出系统输入输出系统是计算机与外部设备进行信息交互的通道,包括输入设备和输出设备。
本章将介绍输入输出系统的工作原理、接口标准和通信方式,帮助读者理解计算机与外设之间的数据传输和控制方式。
第七章:计算机总线计算机总线是各个硬件组件之间进行数据传输和控制的纽带。
本章将介绍总线的类型、结构和工作原理,以及总线的性能和扩展技术。
off是要映射字节在文件中的起始偏移量。
通常将其设置为0。
prot参数说明对映射存储区的保护要求。
可将prot参数指定为PROT_NONE,或者是PROT_READ(映射区可读),PROT_WRITE(映射区可写),PROT_EXEC(映射区可执行)任意组合的按位或,也可以是PROT_NONE(映射区不可访问)。
对指定映射存储区的保护要求不能超过文件open模式访问权限。
flag参数影响映射区的多种属性:MAP_FIXED返回值必须等于addr.因为这不利于可移植性,所以不鼓励使用此标志。
MAP_SHARED这一标志说明了本进程对映射区所进行的存储操作的配置。
此标志指定存储操作修改映射文件。
MAP_PRIVATE本标志导致对映射区建立一个该映射文件的一个私有副本。
所有后来对该映射区的引用都是引用该副本,而不是原始文件。
要注意的是必须指定MAP_FIXED或MAP_PRIVATE标志其中的一个,指定前者是对存储映射文件本身的一个操作,而后者是对其副本进行操作。
mmap成功返回后,fd参数可以关闭。
该操作对于由mmap建立的映射关系没有影响。
为从某个进程的地址空间删除一个映射关系,我们调用munmap.2.名称::munmap功能:解除存储映射头文件:#include<sys/mman.h>函数原形:int munmap(caddr_t addr,size_t len);参数:addr指向映射存储区的起始地址len映射的字节返回值:若成功则返回0,若出错则返回-1其中addr参数是由mmap返回的地址,len是映射区的大小。
再次访问这些地址导致向调用进程产生一个SIGSEGV信号。
如果被映射区是使用MAP_PRIVATE标志映射的,那么调用进程对它所作的变动都被丢弃掉。
内核的虚存算法保持内存映射文件(一般在硬盘上)与内存映射区(在内存中)的同步(前提它是MAP_SHARED内存区)。
这就是说,如果我们修改了内存映射到某个文件的内存区中某个位置的内容,那么内核将在稍后某个时刻相应地更新文件。
哈工大操作系统读书笔记在哈尔滨工业大学的计算机科学与技术专业的学习中,操作系统是我们学科的核心课程之一。
为了更好地掌握操作系统的基本原理和技术,我认真阅读了相关教材,并做了一些笔记。
一、操作系统的基本概念1. 操作系统定义:操作系统是控制计算机硬件和软件资源,管理用户程序运行,提供用户界面和应用程序开发环境的一种系统软件。
2. 操作系统功能:主要功能包括处理机管理、存储管理、文件管理、设备管理以及用户界面。
二、处理机管理1. 进程的定义:进程是程序的一次执行,是系统进行资源分配和调度的基本单位。
2. 进程的状态:包括新建、就绪、运行和阻塞四种状态。
3. 进程控制块PCB:用于描述进程的基本信息和运行状态。
4. 进程调度算法:包括先来先服务、最短作业优先、最短剩余时间优先等。
三、存储管理1. 内存分配方式:包括固定分区、可变分区、分页和分段。
2. 内存置换算法:包括先进先出、最近最少使用、最佳置换算法等。
3. 虚拟内存的概念:通过将内存和外存统一管理,为用户提供一个比实际内存大得多的虚拟内存空间。
四、文件管理1. 文件系统的概念:文件系统是操作系统中负责管理和存储文件信息的软件部分。
2. 文件的分类:按性质分为系统文件和用户文件;按内容分为文本文件和二进制文件;按存储方式分为顺序文件和随机文件。
3. 文件的访问方式:包括顺序访问和随机访问。
五、设备管理1. 设备驱动程序的概念:设备驱动程序是操作系统与硬件设备交互的接口,负责设备的初始化和释放、设备的读写操作以及设备的状态查询等。
2. 缓冲技术的概念:缓冲技术是解决I/O设备速度与CPU速度不匹配问题的一种方法,通过在内存中开辟一块缓冲区,暂时存放输入输出数据,以实现数据的同步传输。
3. 设备分配与回收:设备分配的主要任务是确定哪些进程可以使用哪些设备,并满足设备的互斥使用和独立性等约束条件;设备回收的任务是在进程终止时,将设备的使用权收回并重新分配给其他进程使用。
鸟哥的linux私房菜(基础篇)学习笔记鸟哥的linux私房菜(基础篇)是一本非常好的Linux入门教材,它全面介绍了Linux 的基础知识,包括Linux的安装、文件系统、用户管理、进程管理、磁盘管理、文件编辑器、Shell编程以及Linux网络等方面。
本文将简单介绍一些我学习这本书时的笔记和心得,以期为Linux新手提供一些帮助。
1. 操作系统和内核操作系统是由内核和外壳组成的,内核是操作系统最基础的组成部分,它负责处理硬件和软件的交互,包括驱动程序、内存管理、进程管理和文件系统等。
而外壳则是用户和操作系统进行交互的界面,我们可以通过命令行或者图形化界面与系统进行交互。
2.文件系统在Linux系统中,所有资料都以文件的形式保存在文件系统中,文件系统采用树形结构。
在Linux中,根目录是"/",其他目录都是在根目录下面的子目录。
我们可以使用ls 命令来查看文件目录和文件,也可以使用cd命令来进入和退出目录,另外,文件名是区分大小写的。
3.用户管理在Linux中,每个用户都有自己的ID号、用户名和密码。
通过用户管理,我们可以添加、删除或修改用户,另外,我们可以通过权限控制来限制普通用户访问系统的某些文件或命令,使系统更安全。
4.进程管理在Linux中,每个程序都是一个进程,我们可以使用ps命令查看系统中运行的进程,也可以使用kill命令来终止特定的进程。
另外,我们可以使用top命令来查看系统中当前占用CPU资源最多的进程,以便优化系统性能。
5.磁盘管理Linux系统中的磁盘分为硬盘和分区,我们可以使用fdisk命令来分区,也可以使用mkfs命令来格式化分区,以便在系统中进行挂载。
另外,我们可以使用df命令来查看文件系统的使用情况,以便合理管理磁盘空间。
6.文件编辑器在Linux中,有很多种文件编辑器,如vi、vim、nano等。
其中,vi是最常用的编辑器,而vim是vi的增强版,它提供了更多的功能和快捷键。
【TouchDesigner学习笔记与资料】⽂章⽬录TouchDesigner是什么?简单来说就是⼀种可视化的编程语⾔。
TD 是⼀种编程语⾔。
TD 不是⼀个 APP 应⽤程序,像⼀般程序那样可以很容易的开始执⾏动作。
touchdesigner 是基于节点的图形化编程软件。
这意味着,我们不⽤打开⼀个⽂本⽂档然后⼀⾏⾏敲代码,TD ⽤图形化界⾯来通过节点创建程序。
TD 的每⼀个节点或 OP 元件,执⾏⼀个具体的,⼩的,独⽴动作。
实现⼀个整体功能,需要多个节点共同完成。
它们的输⼊和输出连接在⼀起,来传递信息。
基础知识创建OP元件在界⾯双击创建OP元件,或者⽤快捷键"Tab".(貌似有些windows版本不⽀持Tab快捷键)。
在OP元件的输出端⼝⿏标右键可以创建新的OP元件,⿏标中键创建的 OP 会在原链路外,新建⼀个并联的分⽀。
在创建 OP 时,有 2 个超有⽤的快捷键:“ctrl”和“shift”。
打开创建 OP 对话框,按住“ctrl”,然后连续选择多个 OP,这些 OP 会按顺序从上到下添加进界⾯。
这招可以把⼏个OP 快速添加进项⽬。
按 SHIFT 也是⼀样的操作⽅法。
区别是,这样创建的 OP 会从左往右直接串联好,这种⽅法可以快速创建已经连号线的若⼲ OP.⿏标和键盘导航点击图中的 i,可以获得更多所选 OP 元件的详细信息。
在 TD ⼯程中导航,有⼀些快捷键。
其中两个是 i 和 u 键。
u 键会跳出当下组件,进⼊上⼀层⽹络。
i 键相反,进⼊⼀个⽹络或组件。
如果想看到某个⽹格中的所有 OP 元件,按 h . 它相当于执⾏当下⽹格的 home 动作。
(我这个window的快捷键没有反应,可以使⽤⿏标滚轮进⼊或者跳出组件,⿏标右键选择Home All使画⾯居中显⽰)使⽤外部⽂本编辑器TD 中本⾝可以创建和编辑简单的脚本。
不过随着脚本增长,⽤外部的编译器会更省事快捷。
这样会有⼀⼤堆好处,我们简单列举:代码⾏号;分颜⾊的代码;查找替换功能;⾃动联想语句;所以,在 TD 中⼴泛使⽤ Python,会让你的⼯作更⾼效。
第一部分程序员必读Szq整理使用第1章对程序错误的处理(1)常见的Windows函数的返回类型:VOID:无返回值型,该函数的运行不可能失败。
Windows函数很少此类型BOOL:函数运行失败则返回0,否则返回非0HANDLE:失败则返回NULL,否则返回一个可操作的对象的Handle。
注:有些函数会返回一个句柄值INVALID_HANDLE_VALUE,?它被定义为-1。
函数的Platform? SDK 文档将会清楚地说明该函数运行失败时返回的是NULL还是INVALID_HANDLE_VALIDPVOID :函数运行失败,则返回值是NULL,否则返回PVOID,以标识数据块的内存地址LONG/DWORD:这是个难以处理的值。
返回数量的函数通常返LONGDWORD。
如果由于某种原因,函数无法对想要进行计数的对象进行计数,那么该函数通常返回0或-1(根据函数而定)。
如果调用的函数返回了LONG/DWORD,那么请认真阅读 Platform SDK文档以确保能正确?检查潜在的错误。
(2)当某Windows函数运行错误时,可以通过调用 DWORD GetLast Error()函数获取调用该函数的关联线程的32位错误代码。
其具体的错误文本以列表形式存放于WinError.h头文件中,在VC中调试时,也可以通过在Watch 窗口键入“@err,hr”来获取所调用函数的运行错误代码和具体的错误文本。
(3)Windows还提供了一个函数,可以将错误代码转换成它的文本描述。
该函数称为FormatMessage,该函数的格式如下:DWORD FormatMessage(DWORD dwFlags,LPCVOID pSource,DWORD dwMessageID,DWORD dwLanguageID,PTSTR pszBuffer,DWORD nSize,va_list *Argument);2004年11月8号Trackback: /TrackBack.aspx?PostId=174570第一章程序员必读1.1定义自己的错误代码若你编写了一个希望其他人调用的函数,你的函数可能因为这样或那样的原因而运行失败,你必须向函数的调用者说明它已经运行失败。
构建自己的操作系统:从零开始编写内核在计算机科学中,操作系统是管理计算机硬件和软件资源的系统软件。
它是位于计算机硬件与用户之间的中间层,为用户提供与硬件交互的接口,同时负责管理和分配计算机资源,保证系统的安全和稳定运行。
尽管市面上已经有各种成熟的操作系统可供使用,但如果你想探索计算机系统的底层原理,从零开始编写自己的操作系统是一项非常有趣的挑战。
在构建自己的操作系统时,最重要的一步是编写操作系统的内核。
内核是操作系统的核心组件,它控制着计算机的基本功能,如进程管理、内存管理和设备驱动等。
下面是一些步骤,帮助你从零开始编写一个简单的操作系统内核。
1.学习汇编语言:内核编写一般使用汇编语言,因为它可以直接与硬件进行交互。
x86汇编语言是一个常见的选择,因为它广泛用于PC平台。
首先,学习汇编语言的基本语法和指令集。
这将有助于你理解计算机的底层工作原理,并为编写内核提供基础知识。
2.编写引导扇区:计算机在启动时会加载引导扇区(boot sector),这一小段代码负责初始化计算机系统并加载操作系统的其余部分。
编写引导扇区需要了解硬件启动的基本原理,以及如何加载和执行汇编代码。
3.编写基本的内核:在启动引导扇区之后,需要编写一个基本的内核来管理系统。
首先,需要进行一些基本的初始化,如设置中断处理程序、设置中断向量表和初始化内核堆栈等。
然后,可以实现一些基本功能,如进程管理、内存管理和设备驱动。
4.实现系统调用:系统调用是操作系统提供给应用程序的接口,用于访问操作系统的功能和资源。
编写系统调用使得应用程序可以通过特定的指令与操作系统进行交互。
例如,可以实现一些基本的系统调用,如文件读写、进程创建和进程间通信等。
5.调试和测试:在编写内核的过程中,可能会遇到各种各样的错误和问题。
这时,需要进行调试和测试,找出并修复这些问题。
常用的调试和测试技术包括使用调试器、打印调试信息和编写测试代码。
需要注意的是,从零开始编写一个完整的操作系统是一项复杂而繁琐的工作,需要深入了解计算机体系结构、硬件和操作系统的原理。
《深入理解Android内核设计思想》读书随笔目录一、内容概要 (1)二、Android内核概述 (2)三、深入理解Android内核设计思想 (4)四、Android内核主要组件及其设计思想 (6)4.1 系统架构与关键组件 (7)4.2 内存管理设计思想 (9)4.3 进程管理设计思想 (10)4.4 系统安全与权限管理设计思想 (12)五、Android内核优化与性能提升方法 (14)5.1 内核性能优化策略 (16)5.2 性能提升实践案例 (18)六、Android内核开发实践与技术探讨 (19)6.1 内核开发基础概念与技能 (21)6.2 内核开发技术难点解析 (22)6.3 内核调试与测试技术探讨 (24)七、Android内核的未来发展趋势与挑战 (26)一、内容概要《深入理解Android内核设计思想》是一本深入探讨Android系统内核设计理念的书籍。
在阅读这本书的过程中,我收获颇丰,对于Android内核的认识有了更深的理解。
这本书主要围绕Android内核的设计理念、架构、实现机制等方面展开。
第一章:Android系统概述。
这一章主要介绍了Android系统的起源、发展历程以及它在移动设备上的普及原因。
也介绍了Android 系统的基本架构和组成部分,为后续深入讨论内核设计思想打下了基础。
第二章:Android内核设计思想。
这一章详细阐述了Android内核的设计理念,包括其模块化设计、可扩展性、性能优化等方面的思想。
通过阅读这一章,我对Android内核的设计思想有了更深入的理解。
第三章:Android内核架构。
这一章详细介绍了Android内核的架构,包括内存管理、进程管理、电源管理等方面的内容。
通过对内核架构的深入了解,可以更好地理解Android系统的运行机制和性能优化。
第四章至第六章:分别介绍了Android的硬件抽象层、系统服务和应用框架等高级主题。
这些章节详细解释了Android系统如何与硬件交互、如何提供基本的系统服务以及应用程序如何在框架内运行。
unix网络编程笔记unix网络编程笔记2010-06-04 16:09索引:1处理SIGCHLD信号2捕获信号时,注意处理被中断的系统调用3accept返回前连接夭折的处理4具有多个输入的处理5SIGPIPE的产生和处理6处理服务器主机崩溃7处理服务器主机崩溃重启8处理服务器主机关机9网络函数的可重入问题10套接口设置超时的方法11辅助数据12如何得知套接口接收队列中有多少数据?13UNIX域协议14UNIX域套接口使用套接口函数的一些差别和限制15描述字传递机制16非阻塞套接口I/O 17服务器程序常见设计方法18注意网络编程的移植性问题19注意对等方的不合理行为20开发和使用应用程序"框架"21在应用程序中中实现keep-alive机制22理解TCP的写操作23使应用程序事件驱动24不要试图绕过TIME-WAIT状态25服务器应当设置SO_REUSEADDR选项26尽量使用大型写操作代替多个小规模写操作27注意异步connect的可移植问题28避免数据拷贝在使用之前置sockaddr_in结构为0 29理解缓冲区大小对TCP性能的影响30理解已连接UDP套接字--1.处理SIGCHLD信号当编写fork子进程处理连接的服务器程序时,子进程退出会给父进程产生SIGCHLD信号,父进程若不处理该信号会导致僵尸进程。
处理SIGCHLD信号,使用waitpid调用,不能使用wait简单处理。
一般的处理方法如下(信号处理函数):void sig_chld(int signo){pid_t pid;int stat;while((pid=waitpid(-1,&stat,WNOHANG))0)continue;return;}2.捕获信号时,注意处理被中断的系统调用信号处理可能会中断慢系统调用,所以我们必须对慢系统调用返回EINTR错误做准备。
一般处理方法如下(以accept为例):for(;;){clilen=sizeof(cliaddr);if((connfd=accept(listenfd,(SA*)&cliaddr,&clilen)0){if(errno==EIN TR)continue;else err_sys("accept error");}此法对accept、read、write、select、open等合适;但connect调用不能重启,若connect返回EINTR,我们不能再调用它,否则立即返回错误。
第一节树莓派介绍1、树莓派是什么?Raspberry Pi(中文名为“树莓派”,简写为RPi,或者RasPi/RPi)是为学生计算机编程教育而设计,只有信用卡大小的卡片式电脑,其系统基于Linux。
树莓派由注册于英国的慈善组织“Raspberry Pi 基金会”开发,Eben·Upton/埃·厄普顿为项目带头人。
2012年3月,英国剑桥大学埃本·阿普顿(Eben Epton)正式发售世界上最小的台式机,又称卡片式电脑,外形只有信用卡大小,却具有电脑的所有基本功能,这就是Raspberry Pi电脑板,中文译名"树莓派"!这一基金会以提升学校计算机科学及相关学科的教育,让计算机变得有趣为宗旨。
基金会期望这一款电脑无论是在发展中国家还是在发达国家,会有更多的其它应用不断被开发出来,并应用到更多领域。
一句话:树莓派是一个卡片大小的开发板,上面可以运行Linux系统,我们可以用它开发我想要的设备。
2、树莓派的种类A型:1个USB、无有线网络接口、功率2.5W,500mA、256MB RAM(基本已经见不到了)B型:2个USB、支持有线网络、功率3.5W,700mA、512MB RAM、26个GPIO(市售还有很多)。
B+型:4个USB口、支持有线网络,功耗1W,512M RAM 40个GPIO(2014新出的,推荐使用)购买请在淘宝上搜一下,非常多:200到--300元之间(裸板,不含SD卡、电源)3、树莓派参数:B型:处理器BroadcomBCM2835(CPU,GPU,DSP和SDRAM,USB)CPU ARM1176JZF-S核心(ARM11系列)700MHzGPU Broadcom VideoCrore IV,OpenGL ES 2.0,1080p 30 h.264/MPEG-4 AVC高清解码器内存512MByteUSB 2.02(支持USB hub扩展)影像输出Composite RCA(PAL & NTSC),HDMI(rev 1.3 & 1.4),raw LCD Panels via DSI 14 HDMI resolution from 640x350 to 1920x1200 plus various PAL andNTSC standards音源输出 3.5mm插孔,HDMI板载存储SD/MMC/SDIO卡插槽网络接口10/100以太网接口外设8xGPIO、UART、I2C、带两个选择的SPI总线,+3.3V,+5V,ground(负极)额定功率700mA(3.5W)电源输入5V / 通过MicroUSB或GPIO头总体尺寸85.60 x 53.98 mm(3.370 x 2.125 in)操作系统Debian GNU/linux,Fedora,Arch Linux ARM,RISC OS, XBMCB+改进•更多的GPIO:B+将通用输入输出引脚增加到了40个,而Model B则只有26个;• 更多的USB:B+提供了4个USB端口,对热插拔有着更好的兼容性(Model B只有2个);• 支持microSD:旧款的SD卡插槽,已经被换成了更漂亮的推入式microSD卡槽;• 更低的功耗:将线性式稳压器换成了开关式,功耗降低了0.5W到1W;• 更好的音频:音频电路部分采用了专用的低噪供电;• 简洁的外形:USB接口被推到了主板的一边,复合视频移到了3.5mm音频口的位置,此外还增加了4个独立的安装孔。
rCore-Tutorial-Book-v3学习笔记(⼀)概述最近看到清华的⼀个操作系统教程,和其他实验不同的是,这个教程介绍的是完全从零开始实现⼀个Riscv操作系统。
教程所⽤的编程语⾔是Rust,但是我的Rust⽔平只到勉强能看懂代码的地步,所以打算⽤C语⾔照着实现⼀遍。
虽然说是照着实现,但不同的语⾔还是会带来不少细节的不同,相⽐于同个语⾔照抄代码还是能注意到不少平常没在意的东西。
因此开个坑,记录⼀下遇到的问题,代码放在上了。
由于是练习,代码写得⽐较乱。
第⼀部分是实现⼀个最⼩化内核,即能让qemu-system-riscv跑起来并输出Hello world!然后退出就算成功。
得益于SBI的帮助,我们可以少研究很多东西。
这⾥⼤致介绍⼀下SBI,SBI指的是⼀套辅助操作系统内核编程的⼯具,它包含两部分,⼀部分是boot loader,即在机器态⾥初始化裸机上的⼀些寄存器和硬件设备,把操作系统内核读取到对应的内存区域,然后进⼊内核态(Supervisor态,直译为监管者态,太晦涩,因为是操作系统内核主要运⾏的特权级,后⾯均称内核态),开始执⾏内核的第⼀条指令;另⼀部分是提供内核态的系统调⽤,在内核态设置好存储调⽤号和参数的寄存器,然后执⾏指令ecall,系统就会进⼊机器态,由SBI执⾏⼀些机器态才能做的操作,然后返回内核态。
没有SBI,机器态相关的代码就得⾃⼰写了,xv6就是这样做的,所以xv6除了进程、⽂件、内存管理这些模块,还有⼀些充满晦涩代码的模块,这些就是在处理机器态和硬件相关的操作;riscv-pk的系统引导⽤的是BBL(Berkeley Boot Loader),需要机器态做的任务则转发给spike 模拟器的htif模块,由宿主系统执⾏这些任务。
这⾥我⽤的是,和教程⽤的⼀样,虽然是⽤Rust写的,但是已经打包成⼆进制⽂件了,可以直接使⽤。
原先我打算使⽤qemu⾃带的OpenSBI,但是不知道为什么,在调⽤OpenSBI的退出程序功能时,qemu会报错,没法正常退出,RustSBI则不会。
Cortex-M3体系结构学习笔记-寄存器知识要想了解Cortex-M3体系结构的知识,必须学习一下几个部分:CM3微处理器内核结构,处理器的工作模式及状态,寄存器,总线结构,存储器的组织与映射,指令集,流水线,异常和中断,存储器保护单元MPU。
这篇文章主要是我学习CM3机构寄存器的知识笔记。
Cortex‐M3 处理器拥有R0‐R15 的寄存器组。
其中 R13 作为堆栈指针SP。
SP 有两个,但在同一时刻只能有一个可以看到,这也就是所谓的“banked”寄存器。
CM3寄存器全局图如下所示:1. 通用寄存器通用寄存器包括R0-R12,R0-R7也被称为低组寄存器。
它们的字长全是32位的。
所有指令(包括 16位的和32位的)都能访问他们。
复位后的初始值是随机的。
R8-R12也被称为高组寄存器。
它们的字长也是32位的。
16位的Thumb指令不能访问他们,32位的Thumb-2指令则不受限制。
复位后的初始值也是随机的。
2.堆栈指针R13Cortex‐M3 拥有两个堆栈指针,然而它们是banked,因此任一时刻只能使用其中的一个。
•主堆栈指针(MSP):复位后缺省使用的堆栈指针,用于操作系统内核以及异常处理例程(包括中断服务例程)•进程堆栈指针(PSP):由用户的应用程序代码使用。
堆栈指针的最低两位永远是0,这意味着堆栈总是4 字节对齐的。
(在ARM 编程领域中,凡是打断程序顺序执行的事件,都被称为异常(exception)。
除了外部中断外,当有指令执行了“非法操作”,或者访问被禁的内存区间,因各种错误产生的fault,以及不可屏蔽中断发生时,都会打断程序的执行,这些情况统称为异常。
在不严格的上下文中,异常与中断也可以混用。
另外,程序代码也可以主动请求进入异常状态的(常用于系统调用).)在处理模式和线程模式下,都可以使用MSP,但只能在线程模式下使用PSP。
堆栈与微处理器模式的对应关系如下图所示。
使用两个堆栈的目的是为了防止用户堆栈的溢出影响系统核心代码(如操作系统内核)的运行。
《Windows核心编程》Word文档这篇笔记是我在读《Windows核心编程》第5版时做的记录和总结(部分章节是第4版的书),没有摘抄原句,包含了很多我个人的思考和对实现的推断,因此不少条款和Windows实际机制可能有出入,但应该是合理的。
开头几章由于我追求简洁,往往是很多单独的字句,后面的内容更为连贯。
海量细节。
第1章错误处理1.GetLastError返回的是最后的错误码,即更早的错误码可能被覆盖。
2.GetLastError可能用于描述成功的原因(CreatEvent)。
3.VS监视窗口err,hr。
4.FormatMessage。
5.SetLastError。
第2章字符和字符串处理1.ANSI版本的API全部是包装Unicode版本来的,在传参和返回是多了一次编码转换。
2.MS的C库的ANSI和Unicode版本之间也是没有互相调用关系的,没有编码转换开销。
3.宽字符函数:_tcscpy,_tcscat,_tcslen。
4.UNICODE宏是Windows API使用的,而MS的C库中,对于非标准的东西用_前缀区分,所以_UNICODE宏是MS的C API使用的。
5.MS提供的避免缓冲区溢出攻击的函数在文件中,包括StringCbCat和StringCchCat等函数(其中Cb表示Count of Byte,Cch表示Count of Character,都用于表示衡量目标缓冲大小的单位);另外中有_tcscpy_s等_s后缀的函数。
在源串过短时,的函数截断,的函数断言。
6.要想接管CRT的错误处理(比如assert),使用_set_invalid_parameter_handler设置自己的处理函数,然后使用_CrtSetReportMode(_CRT_ASSERT, 0);来禁止CRT弹出对话框。
7.Windows也提供了字符串处理函数,但lstrcat、lstrcpy(针对T字符的)已经过时了,因为没考虑缓冲区溢出攻击。
精易VIP填表模块学习笔记VIP填表格式:”属性名==属性值”精益编程助⼿不⽀持⾮Ie内核浏览器IE9浏览器.按f12在开发⼈员⼯具中切换成ie8或ie7后再分析填表浏览器句柄未初始化(就绪判断命令不需要使⽤)⽹页载⼊完毕,才能初始化成功.模块⽀持线程,但需要在初始化命令⾥⾯的第⼆个参数填写为真.框架⽹页填表操作需填写的第4个参数,强制初始化,获取新载⼊页⾯的对象.如果模块⾥⽤的是对象填表模式,在线程⾥⼯作必须初始化.可以在⽹页填表代码前后加初始化COM库和取消COM库有时需要执⾏⽹页事件(⽐如⿏标移出或移⼊等.).不推荐⽤索引⽅式编写(索引⽅法容易失效,⽹页元素顺序很可能会变.)独有功能,写属性值,直接添加或修改属性的值.(此⽅法可以直接设置相应事件执⾏的属性结果)特别元素:1..地图热点(map)--搜索map提⽰字体来搜索到后取坐标点击(其实就是⼀张图⽚的某⼀块特定的区域,即地图热点.).2.Flash点击(必须在⾃⼰的浏览器⾥使⽤才⾏,⼀般⽤于视频上传.有很多的⽹页按钮都是flash做的,所以⼀定要注意.)3.表格列点击(新浪邮箱)具体看论坛的VIP填表例程.(这是有很多的情况,所以要多看例⼦.)这⾥要注意的是精易编程助⼿的探测功能所能看到的元素不⼀定是你想要的元素,最好使⽤分析,然后测试相关链接,div⽂本框等⽹页元素属性,要多⽅⾯测试所分析到的⽹页元素.助⼿还有⼀个⾮常好⽤的功能就是执⾏脚本测试(⽀持js和vbs脚本.),⽤法是探测到⽹页的某⼀个元素后在执⾏脚本选项就可以进⾏测试了.下图为精易编程助⼿2.36版的执⾏脚本选项.电信189邮箱登录(跨域⽹址,所谓跨域指的是在⼀个⽹页框架中,嵌套了⼀个别的域名的⽹页,即跨域⽹站,⽐如在⾃⼰的⽹站域名上嵌套了百度的⾸页,这就是跨域⽹站.), 这个填表其实是跨域⽹站填表,换⾏问题解决⽅法:(因为HTML中换⾏符的标识为,所以要想在⽹页换⾏,只需要把易语⾔中的换⾏符直接替换为即可.)关于多线程填表的注意事项(提⾼资源利⽤率,防⽌卡死,提升效率)VIP模块4.14版本加⼊跨域⽹页填表,即⽹页初始化的第五个参数,真为⾮跨域⽹站,假为跨域⽹站.如果⼀直跳转或填表内存就会过⾼直接挂掉,这点要注意.解决办法为到⼀定程度⾃⼰结束进程,系统就会进⾏回收处理,然后⾃⼰再次启动来执⾏刚才的填表代码., 第⼆种解决办法为控制使⽤ie浏览器内核相关的程序来执⾏⽹页填表,这样⾃⼰的程序不会挂掉,ie浏览器内核相关的程序如果挂掉由外部控制程序执⾏来重启ie浏览器内核相关的程序然后再次填表.注意:这⾥有个cookies 和ip地址的问题.VIP模块有对cookie独⽴处理的相关命令,如下图,开启后程序结束⼀定要关闭浏览器设置代理的⽅法,相关软件界⾯:。
对某某游戏的驱动双开的分析及其学习
目前网络游戏,由于外(和谐)挂盛行,在游戏中加了很多很多的防护校验,我们耳熟能详的有TP,NP,HS,xtrap,apex等,在游戏加载前都可以看到它们的身影。
作为一个初学内核驱动的菜鸟,看着高手们辗压各种驱动保护,心里真的是羡慕妒嫉恨啊。
不过,现在还是要打好基础为最重要。
先还是实现一个简单的驱动双开吧~
某游戏要实现双开,说难不难,说容易不容易,主要是有一条技术分界线,那就是ring0级的编程,如果总是考虑用户ring3层的东西,是永远实现不了的。
这也是为什么双开也可以成为了外(和谐)挂的一种特殊功能了(——)!
对于某游戏,在网上早就有双开的工具了,下载下来逆向分析一下,也比较简单,整个双开的流程分为2步(本人的角度):
第一步:加载驱动,SSDT hook NtCreateMutant
某双开工具的hook后NtCreateMutant:
mov edi, edi
push ebp
mov ebp, esp
push dword ptr [ebp+14]
push dword ptr [ebp+10]
push dword ptr [ebp+C]
push dword ptr [ebp+8]
call dword ptr [<&ntkrnlpa.NtCreateMutant>] //想想这里为什么还要call真实地址
xor eax, eax //注意这里,注意这里
pop ebp
retn 10
这个配合NtCreateMutant 的函数原型很容易看出来,原型如下
//NtCreateMutant 创建一个突变的对象,称为互斥在用户模式.
NTSYSAPI
NTSTATUS
NTAPI
NtCreateMutant( OUT PHANDLE MutantHandle,
IN ACCESS_MASK DesiredAccess,
IN POBJECT_ATTRIBUTES ObjectAttributes,
IN BOOLEAN InitialOwner);
第二步:这就是ring3层的了
IsWindow()
FindWindow()
ShowWindow()
SetParent()
诸如此类的方法使得窗口隐藏
流程是这样的,先启动一个游戏,让后加载驱动,并做好ring3 层的隐藏,再启动一个游戏,然后恢复第一个游戏。
既然NtCreateMutant 都返回0 了,那就不是双开那么简单了,是无限开啊,只要保存好状态,不过某游戏占CPU惊人啊,所以一些商家也不好意思说能多开了,呵呵。