自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(314)
  • 资源 (5)
  • 收藏
  • 关注

原创 xv6---Lab4 traps

0x00000064用字符串打出来,发现解释的方向是64 00 00 00 即r\0\0\0 而不是 \0\0\0r这就是小端。当printf执行完成后,会让pc=寄存器ra的值,然后程序会执行main函数中的0x38这行的代码。Q:在main的程序集代码中,函数f的调用在哪里?A:查看asm文件,发现没有对f,g的调用,g被内联f函数,f函数被内联到main函数。Q:main中,jalr跳转到printf之后,ra的值是多少?A:ra的值是0x38, 对应的0x34的下一条指令。

2022-12-20 15:00:15 989 1

原创 xv6---Lab3: page tables

程序在系统上执行,操作的是虚拟内存地址,而虚拟内存到物理内存的映射需要一个函数f(var1, var2);其中var1是页表,而var2是偏移量,于是当需要操作一个变量的时候,操作系统可通过函数f(var1, var2);的实现(kernel/exec.c),系统调用exec将存储在文件系统上的,新的用户程序装载进内存里,然后执行它。系统之上的内存分配叫虚拟内存,通过内核的MMU单元去管理并映射到物理内存。,然后我们将物理内存看成是定长槽块的阵列,这些槽块大小与页相同,每个槽块叫做。

2022-12-07 23:59:02 1409 1

原创 内存管理---分页机制

这一样的实现是 physical_addr = flash[virtual_addr];综上:可通过32位的虚拟地址,通过二级页表访问4GB的物理内存,

2022-12-02 12:33:21 1012

原创 xv6---Lab2: system calls

执行syscall函数的时候,会将num赋值为寄存器a7的值,并通过num找到syscalls中的系统调用号对应的函数指针。至此可以去调用sys_trace函数了,这里需要关注:trace如何拿到传入的参数。而执行trace系统调用(li a7 22 和 ecall之后,),程序会跳转到syscall.c的void syscall(void)函数,这里就可理解为什么要把a7赋值为22了。具体实现如下:argint用于拿到系统调用传递的参数,0-5的参数,对应寄存器a0-a5。

2022-11-29 16:27:29 2013

原创 linux时区相关

--->一步步跟进去发现是调用timekeep的 nsecs = timekeeping_get_ns(&tk->tkr_mono);gettimeofday和settimeofday可读取/设置时间,时区。而时区可通过tzset和设置环境变量去影响localtime。需要注意图中虚线的部分表示这个时间受到时区的影响!工具timedatectl 即可查看系统时间和时区。glibc源码和官方文档。

2022-11-18 14:34:21 1191

原创 图解https读书笔记

client的公钥加密,server持有client的私钥解密。为了解决这个问题:client应该用client的私钥签名,server用client的公钥解签。client用server的公钥加密原文,用client的私钥签名。综上两种情况,client和server之间需要有两对公私钥:各自持有对方的公钥和自己的私钥。公开秘钥加密处理相对复杂,会降低通信效率,所以通信的时候希望使用共享密钥加密方式。client用server公钥加密,server持有server的私钥解密。

2022-11-18 11:18:46 1275

原创 xv6---Lab1: Xv6 and Unix utilities

sleep.c中的sleep--->/user/usys.S的调用--->调用/kernel/syscall.c的syscall函数--->调用到/kernel/sysproc.c的sys_sleep函数。(0)通过int pipe(int fd[2])创建管道,fd参数返回两个文件描述符,fd[0]指向管道的读端,fd[1] 指向管道的写端。/user/usys.S文件为sleep函数的实现,调用了/kernel/定义在user/user.h的int sleep(int);

2022-11-15 18:36:24 1232

原创 数据结构---邻接表

main中是简单的插入,删除的示例demo。chainTableNode则是一个链表。

2022-11-09 14:10:00 238

原创 ini文件的读取

【代码】ini文件的读写。

2022-11-04 14:05:29 826

原创 xv6---spinlock自旋锁

release一次就减1,直到为0才恢复中断(不一定会打开,需要根据,int old = intr_get()的值判断,old == 1代表acquires spinlock之前中断是打开的,反之用完了锁不打开)。可知:如果在release的时候打开了中断,那么其他cpu会立刻拿到spinlock, 且这个时候已经关闭过了中断,然后中断又被打开了,这肯定不行!进程A:键盘打字---产生中断---acquired 等待spinlock----写入数据。避免编译优化改变代码执行顺序。------>产生死锁。

2022-11-04 00:40:00 399

原创 pthread_attr_t 线程属性

加了些注释:可知pthread_attr_t就是线程的属性,以及相关的get.set用法。

2022-11-03 10:42:40 279

原创 数据结构-----链表

双链表应该有三个属性,pre指向上一个结点,next指向下一个结点,val为本节点数据。

2022-11-01 19:39:09 95

原创 证书+证书链的简单理解

参考:一起学加密(23)——证书是什么_哔哩哔哩_bilibili

2022-10-28 15:00:43 1597

原创 C++类函数转函数指针

【代码】C++类函数转函数指针。

2022-10-21 12:59:02 824

原创 RAW socket

当网卡处于这种“混杂”模式时,它对所有遇到的每一个数据帧都产生一个硬件中断,以提醒操作系统处理流经该物理媒体上的每一个报文包。要注意的是send/recv函数使用MSG_WAITALL的时候,sockfd 必须是处于阻塞模式下,否则WAITALL不能起作用。socket(PF_PACKET, SOCK_RAW, htons(ETH_P_XXX)) // 发送、接收数据链路层。查资料发现:默认情况下,网卡接收一个包,网卡只把发给本机的包(包括广播包)传到上层的APP。【以ptp报文帧为例】

2022-10-19 12:01:03 2082

原创 printf是如何打印到终端

打开了控制台的设备: /dev/consloe,并通过int fd = open ("/dev/consloe")往这个设备写数据,通过内核的调用栈:ttycore层--->ldisc层--->和设备匹配上的驱动的write方法。

2022-10-16 18:46:29 760

原创 timer定时器的简单用法

定时每 sec去执行一次callback函数。

2022-10-13 16:58:28 236

原创 client 广播ip地址,server端接收

【代码】client 广播ip地址。server端接收

2022-10-13 10:03:45 174

原创 sh的环境变量设置Cmake的条件编译

【代码】sh的环境变量设置Cmake的条件编译。

2022-10-11 16:09:37 588

原创 ubuntu在recovery模式下备份文件

mount /dev/sda1 /root/u_bak //挂载u盘到/root/u_bak目录下。cp /home/pc123/test /root/u_bak //考本test文件到u盘。按住shift打开ubuntu,进入recovery模式的root选项。mkdir /root/u_bak //创建本地备份文件夹。umount /root/u_bak/ //取消挂载。fdisk -l //找到虚拟机识别到的u盘。在windows打开u盘即可看到需要的文件。

2022-10-10 14:13:11 1048

原创 ubuntu连不上网

ifconfig重启即可。

2022-10-08 10:25:23 404

原创 IGMP协议

IGMP是组播原理涉及到的协议。IGMP协议作用于:主机和组播路由器之间。①Router发送普遍组查询报文(General Query)G1/G2/G3都会收到此报文。周期默认是60s。②Client发送:响应报文 (Report报文) 发送给RouterA(RTA)③G1发送的响应报文RouterA和G2,G3也会收到,当G3收到此响应报文,G3不会再向RouterA发送响应报文。当新的client加入网络,client可主动发送Report报文给Router。

2022-10-06 16:48:14 1320

原创 NXP的IPCF

IPCF通信原理:消息队列;环形,buffer descripter来维护两个OS之间的通信。OS1上的内存池(共享内存):OS1发送的时候ipc_shm_acquire_buf()【即从共享内存拿一片数据】,然后发送数据【往共享内存写数据】,并同步到这片内存到OS2的共享内存。产生中断通知对端OS。OS2收到中断:拷贝OS1调用ipc_shm_acquire_buf()操作的共享内存的数据,释放这片共享内存pc_shm_release_buf(),并同步到OS1的共享内存。

2022-10-06 15:25:52 2439

原创 APUE---system函数的简单实现

【代码】APUE---system函数的简单实现。

2022-09-30 20:37:30 220

原创 strncpy和strcpy和memcpy

但memcpy会把字符的 0 和\0一起拷贝到buffer里,用%s打印依旧会打不出 789a,strncpy的源码也是依据0的结束符来判断是否拷贝完成,只是限定了拷贝的个数。但memcpy会根据个数来定需要拷贝多少字节,不会因为0而不拷贝。上面的方案都有毛病,那解决方案就是memcpy。拷贝abc到str数组,能正常输出。如上,结果为ab ,并没有被完全拷贝。

2022-09-30 00:28:53 433

原创 makefile的常用配置变量

将系统默认依赖的路径从/usr, /usr/local,/usr/bin等的路径前加上 /home/pc123。-Werror = error 要求GCC将所有的警告当成错误进行处理,让带有warning的编译不可以通过。chrdevbase.o 生成chrdevbase.ko文件。当一个没有定义的符号出现在 #if 中时,给出警告。将最后生成的文件放到/usr/local文件夹。指定编译时arm架构(即代码要运行的架构)默认的是gcc ,交叉编译需要指定编译器。CC = gcc //编译器。

2022-09-29 17:42:52 941

原创 make install在makefile的写法

p,--preserve-timestamps:以文件的访问/修改时间作为相应的目的地文件的时间属性。-s,--strip:用strip命令删除symbol table,只适用于第一及第二种使用格式。-m,--mode=模式:自行设定权限模式 (像chmod),而不是rwxr-xr-x。-d,--directory:所有参数都作为目录处理,而且会创建指定目录的所有主目录。-g,--group=组:自行设定所属组,而不是进程目前的所属组。-S,--suffix=后缀:自行指定备份文件的。...

2022-09-29 17:34:19 1620

转载 mDNS协议

比如,A 主机进入局域网,开启了 mDNS 服务,并向 mDNS 服务注册以下信息:我提供 FTP 服务,我的 IP 是 192.168.1.101,端口是 21。如果理解了 DNS 协议,再去理解 mDNS 协议就很简单了,区别只是 mDNS 一般作用在一个局域网内的,有特定的 IP 地址,也就是 224.0.0.251,有特定的端口 5353,mDNS 的作用是实现局域网内的服务发现,查询,注册,DNS 作用是实现域名的解析,作用大概是一样的。当然,具体实现要比这个复杂点。

2022-09-29 00:24:59 799

转载 vLan的概念

首先,在一台未设置任何VLAN的二层交换机上,任何广播帧都会被转发给除接收端口外的所有其他端口(Flooding)。VLAN间路由,可以使用普通的路由器,也可以使用三层交换机。同时设置端口1、2属于红色VLAN、端口3、4属于蓝色VLAN。同样,C发送广播信息时,只会被转发给其他属于蓝色VLAN的端口,不会被转发给属于红色VLAN的端口。上图中为了便于说明,以红、蓝两色识别不同的VLAN,在实际使用中则是用“把它转发给同属于一个VLAN的其他端口——也就是同属于红色VLAN的端口2,就这样,VLAN通过。

2022-09-28 23:24:04 130

原创 windows的vscode连到ubuntu

【代码】windows的vscode连到buntu。

2022-09-19 13:17:44 324

原创 从零开始使用Vscode调试XV6

针对makefile: 安装compiledb【git clone https://github.com/nickdiego/compiledb.git】来自动生成compile_commands.json。注意:由于有 "miDebuggerServerAddress": "127.0.0.1:26000", //所以需要吧.gdbinit 中 target remote xxxx:xx改为。一天时间的教训---系统要ubuntu20.04的 ,用ubuntu18.04的搞了一天。

2022-09-18 10:24:57 2012

原创 DNS抓包

DNS抓包

2022-09-16 12:18:45 1952

原创 vscode在ubuntu调试

【代码】vscode在ubuntu调试。

2022-09-15 21:00:50 1235

原创 qemu 内核调试环境搭建

kernel /path/to/kernel/dir/arch/arm/boot/zImage 告诉qemu单板运行内核镜像路径。用的版本是ubuntu 18.04 ,qemu是6.0 ,按照下面的步骤做完了,提示-kernerl参数不对,不知怎么解决。安装完成后,会在busybox目录下生成_install目录,该目录下的程序就是单板运行所需要的命令。生成的内核镱像位于arch/arm/boot/zImage, 后续qemu启动时需要使用该镜像。-nographic 不使用图形化界面,只使用串口。

2022-09-15 15:22:27 1190

原创 Ubuntu搭建Mqtt服务器

比如机器0订阅了msg1, 于是机器1/机器2发布msg1,机器0都会收到。每个机器可以订阅,发布。谁订阅了某个topic,消息就会发给谁。config文件如下。

2022-09-15 12:59:58 2239

原创 Linux应用程序的启动流程

_libc_start_main函数的运行的顺序为:__libc_csu_init->main->__libc_csu_fini,__libc_csu_init叫构造函数,__libc_csu_fini叫析构函数,在代码中可通过__attribute__ ((constructor))标记构造函数,__attribute__ ((destructor))来标记析构函数 有这样的例子。在main.s文件找到地址为0x540的代码。看到一篇好文:摘抄记录--

2022-09-14 11:22:55 1372

原创 udp多播

setopt的IP_ADD_MEMBERSHIP-----加入组播组-----设置了组播地址。(2)然后设置多播的参数,例如超时时间TTL、本地回环许可LOOP等。组播:一对多(这个多可以为1,就是单播,可以为N,就是广播)bind----指定接收的端口和ip地址----指定网卡。组播源:往多播地址和端口上发送消息,发送消息。首先需要明白:单播,组播,广播。(1)建立一个socket。(4)发送和接收数据。(5)从多播组离开。

2022-09-12 16:21:04 753

转载 Netlink的简单例子

【代码】Netlink的简单例子。

2022-09-11 15:32:25 499

原创 poll函数

当网路两端有断开或者连接,可通过link up/link down让两端重新回到初始化----!>0:数组fds中准备好读、写或出错状态的那些socket描述符的总数量;==0:数组fds中没有任何socket描述符准备好读、写,或出错。-1: poll函数调用失败,同时会自动设置全局变量errno;//绑定name设备去发送消息。从网上找的简单的例子。

2022-09-09 11:07:53 247

原创 linuxptp源码研究

w是等待ptp4l: 通过pmc_create()来创建进程间通信,-w当收到了来自ptp4l的消息,就会跳出 Waiting for ptp4l...的循环,然后执行do_loop来执行 update_clock()来跟新时间(把/dev/ptp1上的时间更新到CLOCK_REALTIME上!还有需要注意:clockadj_step()函数调整的是clkid对应的时间(如果调整的时间是phc对应的clkid的时间,那么同步到系统时间需要用phc2sys这个app)

2022-09-08 15:36:55 7085 7

C++静态库的依赖demo

C++静态库的依赖demo

2022-01-26

gcc_jz2440.zip

配合文章https://mp.csdn.net/editor/html/113729680

2021-02-07

can_test.zip

通过cubemx来配置的驱动层,然后实现了can总线的最基本的功能,实现的数据的收发,对于打算用can总线来做东西的人十分的适合

2020-03-23

TCPIP学习记录

记录自己的学习过程,方便自己以后的知识结构体系的完整与提升。

2018-12-26

Linux+虚拟机安装步骤

适合纯新手,步骤很详细;我自己就是照着这个步骤一步步安的,挺好用的,链接在这,分数给不给随意吧,我是完全复制粘贴的,完全是留个学习记录,若侵权马上删 http://blog.51cto.com/13438667/2059926

2018-10-28

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除