- 博客(42)
- 收藏
- 关注
原创 ARM汇编指令
arm体系采用的方案是满减,但是在进行操作之前,我们必须告诉2440栈底的位置,这里我们把栈底设置为0x40001000,从地址0x40000000开始的0x1000这段内存空间对应的是2440内部的一段ram,总共4k。该位是针对有符号数的操作,会在下面两种情形变为1,两个最高有效位均为0的数相加,得到的结果最高有效位为1;汇编指令的s后缀,几乎所有的汇编指令都可以在指令后面加上s后缀,s后缀的含义是在指令执行过程中会更新cpsr寄存器的N,V,C,Z位。如果结果为0,则Z=1;
2024-09-19 19:11:33
1961
原创 驱动开发知识点
它是负责执行算术运算(如加、减、乘、除)和逻辑运算(如与、或、非、异或)的单元。ALU的输入通常来自CPU的寄存器或内存,而它的输出则可以被存储回寄存器或内存中,供进一步的处理。然而,x86处理器的功耗相对较高,这可能限制了其在某些低功耗应用场景中的使用。FIQ中断(FIQ Interrupt):快速中断,处理优先级较高的外部中断,响应速度更快。ROM中的数据在断电后不会丢失,因此它通常用于存储固定的、不需要频繁更改的信息。)RAM中的数据在断电后会丢失,因此它通常用于存储当前正在运行的程序和数据。
2024-09-18 20:22:03
1187
原创 framebuffer帧缓存
定义:Framebuffer是一个内存区域,用于保存在计算机图形渲染中生成的图像。它是Linux为显示设备提供的一个接口,把显存抽象后的一种设备,允许上层应用程序在图形模式下直接对显示缓冲区进行读写操作。功能:通过提供一块内存区域来存储和管理输出到显示器的像素数据,实现了图形显示的各类功能。
2024-09-10 21:06:49
1310
原创 哈希表 and 算法
哈希表(Hash table),也被称为散列表,是一种根据关键码值(Key value)而直接进行访问的数据结构。它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数被称为散列函数或哈希函数,而存放记录的数组则被称为散列表或哈希表。
2024-09-09 17:43:15
1143
原创 栈区-----顺序栈------队列
栈(Stack)是一种遵循后进先出(LIFO, Last In First Out)原则的有序集合。这种数据结构只允许在栈顶进行添加(push)或删除(pop)元素的操作。换句话说,最新添加的元素会被最先移除。栈的这种特性使得它在多种编程和应用场景中非常有用,比如函数调用、括号匹配、表达式求值、页面访问历史等。只允许从一端进行数据的插入和删除的线性存储结构。
2024-09-06 20:17:33
689
原创 双向链表——————内核链表
内核链表的节点通常包含至少两个指针:一个指向前一个节点(prev),另一个指向后一个节点(next)。在某些实现中,还可能包含一个指向数据本身的指针,但在Linux内核的链表中,节点本身并不直接存储用户数据,而是将用户数据保存在包含链表节点的结构体中。在双向链表中,链表头还可能包含指向链表最后一个节点的指针,以及一个指向链表第一个节点的指针。删除链表中的节点时,需要找到该节点的前一个节点和后一个节点,并修改它们的指针以绕。在链表中插入节点时,需要找到插入位置的前一个节点,并修改该节点和待插入节点的指。
2024-09-05 22:01:13
1149
原创 数据结构————双向链表
定义:外部碎片指的是还没有被分配出去(不属于任何进程),但由于太小了无法分配给申请内存空间的新进程的内存空闲区域。产生原因:频繁的内存分配和释放、不同大小的内存分配、内存对齐问题等,都可能导致外碎片的产生。
2024-09-04 19:33:14
1016
原创 数据结构,有头链表
一组用来保存一种或者多种特定关系的数据的集合(组织和存储数据)程序的设计:将现实中大量而复杂的问题以特定的数据类型和特定的存储结构存储在内存中,并在此基础上实现某个特定的功能的操作;程序 = 数据结构 + 算法指针:存储的是变量的内存地址,用于直接访问和操作内存中的数据。数组:一系列相同类型的数据项的集合,通过索引访问。数组指针:指向整个数组的指针,但C语言标准中不直接支持指定长度的数组指针,通常指向数组首元素的指针。指针数组:数组的每个元素都是指针,这些指针可以指向相同或不同类型的数据。
2024-09-03 20:58:45
1378
原创 数据库知识点
INSERT INTO 表名 VALUES (值1, 值2, ...);或 INSERT INTO 表名 (列名1, 列名2, ...) VALUES (值1, 值2, ...);删除数据(注意这里是删除数据行,不是列):DELETE FROM 表名 WHERE 列名 关系运算符 值;.width 列宽1 列宽2:这个命令实际上是.width 列名1 列宽1 列名2 列宽2,用于设置特定列的宽度。CREATE TABLE 表名 (列名1 数据类型, 列名2 数据类型, ...);
2024-08-29 21:16:16
1220
原创 TCP,UDP,wireshark抓包
在TCP协议中,数据是以流(stream)的形式传输的,这种流数据没有明确的数据开始和结尾边界,因此容易出现粘包现象。具体来说,当发送方连续发送多个数据包时,由于TCP的缓冲机制,这些数据包可能会被合并成一个大的数据包发送给接收方,或者在接收方由于接收缓冲区的原因,多个数据包被合并在一起处理,这就是粘包现象。的首部是TCP协议数据包中的一个关键部分,它包含了用于传输控制的各种重要信息。TCP报文段首部后面还可以有4n字节(n为整数)的可选字段,这些字段是根据需要而增加的,用于支持TCP的各种扩展功能。
2024-08-23 19:37:46
2389
1
原创 Linux系统编程——网络通信
在创建套接字后,套接字默认没有绑定到任何地址,通过bind函数可以为套接字指定一个地址,这样就可以在网络上监听该地址的通信。accept函数在网络编程中用于从已监听的套接字上接受一个新的连接。当服务器套接字处于监听状态并且有客户端尝试连接时,accept函数会从等待连接队列中取出第一个完成的连接,并创建一个新的套接字来处理这个连接。2 type参数指定套接字的类型,常见的有SOCK_STREAM(面向连接的流式套接字,如TCP)和 SOCK_DGRAM(无连接的数据报套接字,如UDP)。
2024-08-22 20:58:08
1000
原创 学习记录第三十三天
const struct sockaddr *dest_addr, //表示 要发送到的 地址 (网络地址 ip+端口号 )//a -- ascii。htons --- h(host) to n(network) s (short) //16位的数据。htonl --- h(host) to n(network) l (long) //32位的数据。int flags, //0 --- 默认。端口号: 16位数值(unsigned short ) //0~65535 (65536个数)
2024-08-21 20:39:13
703
原创 学习记录第三十天
本身并不能传递大量数据;信号被称为软中断(软件层面),软中断是操作系统中用于处理异步事件的一种机制,它通过软件方式模拟硬件中断的行为,使得系统能够在不直接打断当前进程执行的情况下,处理一些非紧急但耗时的任务。软中断的典型应用之一是“下半部”(bottom half)机制,即将硬件中断处理过程分为“上半部”和“下半部”两个阶段,其中“下半部”即为软中断处理的部分。有名管道:是一种特殊的文件,存在于内存中,在系统中有对应的名称,文件大小为0字节;管道没有满,write将数据写入,并返回实际写入的字节数;
2024-08-18 17:51:20
306
原创 学习记录第二十九天
如果管道满了,写入操作将会阻塞,直到有足够的空间为止(除非是非阻塞模式或使用了特定的系统调用选项)。在创建管道时,系统返回两个文件描述符:一个用于读(read),另一个用于写(write)。如果需要双向通信,必须创建两个管道,一个用于一个方向的通信,另一个用于相反方向的通信。通常,一个进程(如父进程)会写入管道,而另一个进程(如子进程)会从管道中读取数据。管道:通过操作系统提供的内存缓冲区,在内核中实现的通信机制。函数尝试对信号量执行P操作,但如果信号量的值为0,则不会阻塞调用线程,而是立即返回一个错误。
2024-08-16 19:47:54
671
原创 学习记录第二十八天
1.pthread_join //需要自己回收 ---线程的属性 (可结合性) --- 一般是子线程 在较短时间内运行完。失败时返回错误码,可能的错误码同样包括但不限于EINVAL(表示传入的线程ID无效)和ESRCH(表示没有找到指定的线程)。失败时返回错误码,可能的错误码包括但不限于EINVAL(表示传入的线程ID无效)和ESRCH(表示没有找到指定的线程)。锁的顺序:在多个锁的场景下,需要保证所有线程都以相同的顺序获取锁,以避免死锁。mutex:指向需要尝试锁定的互斥锁变量的指针。
2024-08-15 21:58:40
954
原创 学习记录第二十七天
定义:线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。一个进程中可以并发多个线程,每条线程并行执行不同的任务。特性独立调度和分派的基本单位:在多线程操作系统中,线程是能独立运行的基本单位,因而也是独立调度和分派的基本单位。可并发执行:一个进程中的多个线程可以并发执行,甚至允许在一个进程中所有线程都能并发执行,同时,不同进程中的线程也能并发执行。共享进程资源。
2024-08-14 20:26:55
589
原创 学习记录第二十六天
3)以e结尾的函数,可以传入一个指向环境字符串的指针数组的指针。3)_exit,_Exit 会关闭所有的已经打开的文件,不执行清理函数。execv,execvp,execve,需要构造一个参数指针数组,然后将数组的地址传入。c库函数,会执行io库的清理工作,关闭所有 的流,以及所有打开的文件。用fork创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支),这些函数如果调用成功则加载新的程序从启动代码开始执行,不再返回,如果调用出错。1,子进程和父进程做相同的事----创建子进程 执行任务。
2024-08-13 21:33:07
643
原创 学习记录第二十五天
当一个进程暂停后又继续,会从前台进程变成后台进程,用ps查看会发现失去了'+'号,此时进程无法用ctrl + c终止,只能用kill -9 pid号终止。(1)创建进程,为了实现多任务,fork()创建,pid_t fork(void),父进程返回子进程的pid号,子进程返回0;(4)kill:给进程发信号,kill -l查看kill的所有信号,常用信号有kill -9 pid号:终止进程。kill -19 pid号:暂停进程,kill -18 pid号:继续进程,T:停止状态,收到停止信号或正在被跟踪。
2024-08-12 20:40:20
383
原创 学习记录第二十二天
删除一个硬链接不会影响其他硬链接,直到文件的最后一个链接被删除,文件数据才会被释放。该函数定义在<pwd.h>头文件中,并返回一个指向struct passwd结构的指针,该结构包含了用户的多种信息,如用户名、用户ID、群组ID、全名、家目录和登录Shell等。在C语言中用于将指定文件的大小截断到指定的长度,即使文件当前的大小大于指定长度,文件的内容也会被截断,而小于指定长度的部分将被填充为未初始化的数据。truncate函数可以用于文件的大小调整,但需要注意的是,它不会改变文件的内容,仅调整文件的大小。
2024-08-08 19:39:51
828
原创 学习记录第二十一天
的指针,该结构体包含了目录项的信息(如文件名)。返回的目录流中读取一个目录项。返回值:成功时返回当前时间的秒数。函数用于获取当前时间(自1970年1月1日以来的秒数)。功能:打开一个目录流,以便可以读取目录内容。功能:获取当前工作目录的绝对路径。功能:获取文件或目录的状态信息。)- 用于存储状态信息的结构体。功能:改变当前进程的工作目录。)- 要打开的目录的路径。)- 要关闭的目录流指针。)- 要创建的目录的路径,)- 要删除的目录的路径。)- 新的工作目录路径。)- 文件或目录的路径,
2024-08-07 21:12:44
269
原创 学习记录第二十天
O_EXCL,需要和O_CREAT同时使用,表示新建的文件不能存在,成功,否则open就会失败。阻塞:程序因为某种条件没有被触发,而导致'0' '\0'1、不支持O_APPEND的追加模式,无法生成空洞文件。2、lseek函数执行失败,文件指针还在偏移前的位置。它是一个基于Linux内核的没有缓存的IO机制。O_ASYNC异步io,什么时候io不确定,内核每打开一个文件就会获得一个文件 描述符。.2 操作对象不在是流,而是文件描述符。通过文件描述符向文件中写一串数据。通过文件描述符读取文件中的数据。
2024-08-06 19:39:59
710
原创 学习记录第十九天
这里的 stream 是一个指向 FILE 结构的指针,指向已打开的文件流。char 参数是要写入文件的字符(作为 int 类型),stream 是一个指向 FILE 结构的指针,指向目标文件流。它定义在 stdio.h 头文件中,并返回一个指向 FILE 结构的指针,该结构包含了有关打开文件的信息。这里的 filename 参数是一个指向字符串的指针,指定了要打开的文件的名称。5.fread 函数返回成功读取的数据项数量,如果达到文件末尾或发生读取错误,返回的数量可能小于 nmemb。
2024-08-05 20:56:27
893
原创 学习记录第十八天
shell脚本 ----配置文件 ----对文件进行读写操作进程 ----运行起来的程序网络 ----数据共享Htmldb ----网页和数据库shell脚本的本质就是一系列shell命令的集合Shell是一个命令行解释器,它为用户提供了一个向Linux内核发送请求以便远程远程程序的界面系统级程序,用户可以用Shell来启动、挂起、停止甚至是编写一些程序。
2024-08-03 19:00:01
411
原创 学习记录第十六天
4、用预处理命令#pragma pack(n) 可以强制编译器按照指定的n来对齐,合法的n的数值分别是1、2、4、8、16。2、结构体成员按照结构体成员声明先后次序依次存放,并且每个成员的首字节放置的位置必须能够整除成员的字节数;3、如果结构体某个成员的字节数大于CPU的字节数,则最长按照CPU的字节数对齐;1、结构体按照其最长成员大小对齐,意味着最终的大小必须是最长成员大小的整数倍;有若干个节点(Node)组成,节点包含值域和指针域,节点从堆上来;结构体之间无法进行大小关系比较,成员间可以进行比较;
2024-08-01 18:26:14
264
原创 学习记录第十五天
我们可以定义一个指向数组的指针int *p = a;a本身就是一个指针,可以直接赋值给指针变量 p。a是数组第 0 个元素的地址,所以int *p = a;也可以写作int *p = &a[0];。也就是说,a、p、&a[0] 这三种写法都是等价的,它们都指向数组第 0 个元素,或者说指向数组的开头。再强调一遍,“a本身就是一个指针”这种表述并不准确,严格来说应该是“a 被转换成了一个指针”。如果一个指针指向了数组,我们就称它为数组指针(Array Pointer)
2024-07-31 19:29:46
960
原创 学习记录第十三天
指针与字符串的关系字符串字面量在C语言中以空字符 '\0' 结尾,字符型指针指向字符串的起始位置,可以通过指针遍历整个字符串,直到遇到空字符。字符型指针支持算术运算,包括自增(++)和自减(--)操作,以及与其他整数的加减运算。字符型指针在C语言中是一种特殊的指针类型,用于存储字符数据的地址。指针算术运算时,指针的增量是根据其指向的数据类型决定的,例如 char * 类型的指针每次自增会移动1个字节。指向字符串常量的指针不能修改字符串的内容,因为字符串常量存储在只读的内存段。指向的内存单元内容发生变化。
2024-07-30 20:41:33
438
原创 指针第一天
遍历数组:使用指针可以方便地遍历数组,如 for(int *p = numbers;赋值:指针可以通过取地址符&与变量关联,如 p = &a;可以通过指针访问数组元素,如 p[0] 或 *(p+0) 都表示数组的第一个元素。指针算术:指针可以进行加减运算,p+1 表示指向下一个元素的指针。动态内存管理:使用动态分配的内存后,要及时释放,避免内存泄漏。指针解引用:确保指针指向有效的内存地址后再进行解引用操作。定义:指针是一种特殊的变量,用于存储内存地址,指针 + 1:在原有的地址的基础上加基类型的字节。
2024-07-29 18:52:45
331
原创 学习记录第十二天
与普通局部变量不同,局部静态变量在第一次被初始化后,其值在函数调用之间保持不变,即其生存期跨越了函数调用的界限,直到整个程序结束。全局静态变量的生存期是整个程序的生命周期,但其作用域被限制在声明它的文件内,即在其他源文件中不可见,这有助于避免命名冲突。不过,在现代C语言编程中,auto关键字的使用并不常见,因为局部变量的默认存储类型就是自动的,所以通常不需要显式地使用auto来声明。用于定义宏,可以是无参宏或带参宏。在所有函数体之外声明的变量,它可以在定义后的整个程序的任何地方被访问,包括所有的函数;
2024-07-28 18:59:33
914
原创 学习记录第十一天
因为形参是在函数被调用时临时分配存储单元的,不可能为一个数组元素单独分配存储单元(数组是一个整体,在内存中占连续的一段存储单元)字符型数组在形参传参时,不需要传递元素个数,它是通过‘\0’作为结束语句来判断。sizeof()只读取类型名,在函数中sizeof(a)只占8个字节。在用数组元素做函数实参时,把实参的值传给形参,是”值传递“方式。数组名也可以作为函数的形参和实参,传递的是首元素的地址。数组元素可以用作函数实参,但不可以用作形参。数据传递的方向是从实参传到形参,单向传递。
2024-07-26 20:12:09
216
原创 学习记录第十天
形式参数只有在函数被调用的过程中才实例化(分配内存单元),所以叫形式参数。因此形式参数只在函数中才有效。实参向形参的数据传递为值传递,函数的形参和实参分别占有不同内存块,对形参的修改不会影响实参。栈区:FILO 先进后出,后进先出;Linux下大约8Mb,Windows下约1Mb。在调用函数时,它们都必须有确定的值,以便把这些值传送给形参。实参可以是:常量、变量、表达式、函数等。形式参数是指函数名后括号中的变量。在函数调用的过程中自己调用自己;真实传给函数的参数,叫实参。字符串常量区:存放字符串。
2024-07-25 19:24:54
332
原创 学习记录第九天
类型说明符 数组名[常量表达式][常量表达式]其中,`类型`是数组元素的数据类型,`数组名`是数组的标识符,`常量表达式1`和`常量表达式2`分别指定了数组的行数和列数。二维数组可以看成一维数组的数组;
2024-07-24 19:35:25
353
原创 学习记录第八天
如果初值个数小于数组长度,则只将这些字符赋给数组中前面那些元素,其余的元素自动定为空字符(即'\0')如果提供的初值个数与预定的数组长度相同,在定义时可以省略数组长度,系统会自动根据初值个数确定数组长度。例:fgets(s,sizeof(s) / sizeof(s[0]),stdin);C语言用字符数组存放字符串,字符数组中的各元素依次存放字符串的各字符。如果花括号中提供的初值个数(即字符个数)大于数组长度,则出现越界访问。如果在定义字符数组时不进行初始化,则数组中各元素的值是不可预料的。
2024-07-23 20:25:45
332
原创 一维数组的学习
类型说明符 数组名[常量表达式] int a[10]数组的数组名代表数组首元素的地址:数组不能被整体赋值;冒泡排序法:相邻两个元素两两比较,小的放前,大的放后。1、花括号内个数超过数组个数,会造成越界访问。在数组合适的位置上放合适的数;单一性:数组元素在内存中存放字节都相同。2、数组不初始化,里面的值,都是随机数。常量表达式不能为空类型(void)有序性:数组下标小的在下标大的前面。连续性:数组内元素没有字节隔开。3、数组初始化后,缺元素 补0。4、可变的对象不能初始化。
2024-07-22 19:56:21
232
原创 c语言循环
goto语句为无条件跳转语句,一般为:goto 语句标号;break语句用来跳出一个循环,又称循环断路,只能跳出自身所在循环;continue又称循环短路,它会终止本次循环,直接进入下一次循环;while(表达式)表达式非0时,执行while内语句;do{循环体}while(表达式):先执行后判断。while语句一般实现“当”型循环;do while后面必须加“;while()后面不加分号;表达式3:使循环结束的语句。for 循环后不加“;例如:质数 ,合数的判断。表达式1:循环变量赋值。
2024-07-20 19:11:45
161
原创 c语言学习
else if不能独立出现,同样else if()后不能加分号;如果操作数为真,则结果为假;如果操作数为假,则结果为真。只要两个操作数中有一个为真,结果就为真。2.If(表达式)1 else 语句 2。else if(表达式2)语句2。case 常量表达式2: 语句2。(逻辑非)——(取反)case 常量表达式: 语句1。if()后不能加分号‘;3、>= :大于等于。4、<= :小于等于。2、|| (逻辑或)1.if(表达式) 语句。3.if(表达式)语句1。
2024-07-19 20:38:53
132
原创 C语言学习
输入输出的概念:putchar:输出一个字符;putchar(65)输出A;返回值为int型;getchar:输入一个字符,一次读取一个字符包括空格,换行,TAB,储存到缓存区,遵循先入先出原则;它是无参数函数键盘————缓存区————getchar。
2024-07-18 18:41:18
196
原创 C语言入门
:取余,符号与左操作数有关,与右操作数无关,不能%0,值一定小于右操作数;=:赋值(开辟空间的随机数更改成指定的值)int = short:符号位拓展:正数补0,负数补1。=:初始化 (开辟空间的同时赋值)变量开辟内存空间后,内存空间为随机的,若不赋值,则为随机数。++:++i:先+再用,表达式和i都加了;逗号运算符:顺序求值运算符,输出为最后的值。rvalur:右值,运算符右边的常量,临时变量是右值。coust int:将变量变为只读变量,不可修改。lvalur:左值,运算符左边的变量。
2024-07-17 19:26:41
317
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人