自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(40)
  • 资源 (12)
  • 收藏
  • 关注

原创 使用wireshark解密ipsec ISAKMP包

Ipsec首先要通过ikev2协议来协商自己后续协商所用的加解密key以及用户数据的esp包用的加解密包。ISAKMP就是加密过的ike-v2的加密包,有时候我们需要解密这个包来查看协商数据。如何来解密这样的包?点击apply后,对应的包就被解密了。

2023-10-09 17:28:05 852 1

原创 使用wireshark解析ipsec esp包

Ipsec esp包就是ipsec通过ike协议协商好后建立的通信隧道使用的加密包,该加密包里面就是用户的数据,比如通过的语音等。那么如何将抓出来的esp包解析出来看呢?获取相关的esp的key信息.打开wireshark -> edit->preferences找到protocol->esp右边依次填入相关的信息:SA#1的格式为: protocol|source address| destination address|SPIProtocol为网络层协议

2023-10-09 17:02:09 1438

原创 linux usb gadget driver代码

中断发生时,通过ast_vhub_irq() -> ast_vhub_epn_ack_irq() -> ast_vhub_epn_handle_ack() -> ast_vhub_done() -> usb_gadget_giveback_request(),将数据放到req->buf中,收完后,调用req->complete()来结束,这个req->complete()就是bulk_out_complete和bulk_in_complete.但它提供了mkdir的操作function_make()。

2023-05-06 09:11:51 1890

原创 linux下动态库so的debug方式

然后‘cat /proc/1/maps_file | grep xxx.so’得到映射的虚地址空间,最后,gdb attach 该进程,使用dump memory将so对应的地址dump出来。使用lsof找到一个使用该so的进程,比如Pid为1.3. 将动态库so加载到的内存中的内容dump出来。2. 查看elf文件link了哪些动态库so。1. 查看哪些进程使用了特定的动态库so。使用gdb, attach 某个进程。4. dump 内存。

2023-04-14 14:57:49 1004

原创 bash: ./<one_executable_file>: no such file or directory

关于这个问题,原因很多。但大部分的资料都是说PATH环境变量坏掉了,或者/etc/profile坏掉了。但其实,还有一种原因,就是你的可执行程序<one_executable_file>是elf32,而当前的linux环境却是64位的。如果系统中没有安装32bit的包,那么,所有elf32的可执行程序,都会被bash报告这个错误:no such file or directory。64位系统上安装32位的包,举例如下:$ sudo dpkg --add-architecture

2021-12-09 14:35:41 381

原创 linux arm下MMU以及内存布局和内存页管理(PPT版本)

本文直接拷贝的PPT胶片,就不一一打字了。

2021-07-30 14:24:47 200

原创 linuxn内存管理之buddy

本文基于linux-3.11.1代码, arm cpu, flat memory model(平坦连续的内存,用于嵌入式)为背景来说明。start_kernel() -> setup_arch()arch/arm/kernel/setup.c883行,调用setup_machine_fdt() -> early_init_dt_scan() -> early_init_dt_scan_memory() -> early_init_dt_add_memory

2021-07-26 10:07:38 375

原创 linux MMU以及初始化过程内存布局

本文以linux-3.14.17(arm)版本的代码来讲述linux从第一行代码运行至start_kernel()的过程。arch/arm/kernel/vm-linux.lds链接脚本定义了kernel image各段的分布,以及定义了一些全局符号,如下图:这个链接脚本同时定义了入口符号stext.stext定义在arch/arm/kernel/head.S92行safe_svcmode_maskall做了些什么?arch/arm/include/asm/assembl

2021-06-16 17:57:09 1981 3

原创 linux kernel同步之mutex

互斥锁,顾名思义,就是互斥的,独占的,只能有一个进程占有锁,其他进程都得等待锁占有者释放互斥锁,才有可能占有锁。以下的内容是基于linux-3.11.1(arm)内核代码来讲解内核中mutex的实现。mutex的定义:linux-3.11.1/include/linux/mutex.h其中, count表示空闲资源的数目,初始值为1,表示只有一个资源可用,即只能一个进程可以用。count: 1 表示可以lockcount: 0 表示锁被某个进程lock了,且没有其他进程来lock

2021-06-01 14:19:28 666

原创 linux的用户态堆栈(sp_usr)和内核态堆栈(sp_svc)

在arm linux中,进程的运行处于两种模式之一,要么在用户空间运行(用户模式USR_MODE),要么在内核空间运行(SVC_MODE)。在内核空间时,处于特权模式,在用户空间时,处于普通模式。用户空间运行时和内核空间运行时,所用的堆栈是不同的。本文基于linux-3.11.1代码来学习这两种运行空间下,堆栈是如何运作的(切换)。linux-3.11.1/kernel/fork.cSYSCALL_DEFINE0(fork) -> do_fork() -> copy_proces

2021-05-28 18:12:27 1704 1

原创 linux kernel中的DTS解析到platform_device的注册

在linux内核早期的时候,每个嵌入式系统的板载信息(总线,设备的寄存器地址等)都是hardcode在arch/<cpu>/match-xxx/board-xxx.c之类的文件中,即必须存在这样的c文件,里面定义了板子上的硬件的地址等信息。这样做会造成很多很多的大量相似的没多少用的重复代码。为了解决这个问题,而引入了DTS(device tree source)。每个嵌入式系统的描述硬件信息的DTS文件存放在arch/<cpu>/boot/dts/目录下,比如ast250

2021-04-27 16:39:16 1984

原创 Ethernet下字节序和bit序的总结

Ethernet下字节序和bit序的总结本文讲述的是在ethernet中多字节数据发送时涉及到字节序和bit序的剖析。关于字节序(大小端)和bit序,以及MSB和LSB的叙述,请另行学习,本篇不涉及。正文开始:对于多字节数据的发送(ethernet上是一个字节一个字节的传送数据的,故,对于多字节的数据,必然存在要先发送哪个字节,后发送哪个字节的顺序问题),这个很多文章都讲清楚了,这里快速过一下:比如要发送4字节的int型数据0x12345678, 由于网络上要求的是大端字节序,那么要求发

2021-04-16 16:37:21 3367 4

原创 linux下non-preempt的RCU实现分析(基于rcu-tree)

本文讲述的是linux 4.7.1下的RCU实现(tree-RCU)。在kernel中,rcu有tiny rcu和tree rcu两种实现,tiny rcu更加简洁,通常用在小型嵌入式系统中,tree rcu则被广泛使用在了server, desktop以及android系统中.RCU(Read-Copy Update),顾名思义就是读-拷贝修改,它是基于其原理命名的。对于被RCU保护的共享数据结构,读者不需要获得任何锁就可以访问它,但写者在访问它时首先拷贝一个副本,然后对副本进行修改,最后使用一个

2021-03-24 15:39:53 1224

转载 BPF filter

原文:https://www.gsp.com/cgi-bin/man.cgi?section=4&topic=bpf#1FILTER MACHINEA filter program is an array of instructions, with all branches forwardly directed, terminated by areturninstruction. Each instruction performs some action on the pseud...

2021-03-18 10:32:43 546

原创 ARM下的读写锁rwlock实现

内核同步之读写锁rwlock_t本文讲述的是基于linux 4.7.1版本的。我们先来看读写锁的结构体定义:include/linux/rwlock_types.h这里只考虑raw_lock一个成员。arch/arm/include/asm/spinlock_types.harch_rwlock_t只有一个成员lock.下面,我们来介绍相关的API。1. rwlock_init()这个用来初始化rwlock.include/linux/rwlock.h

2021-03-09 16:32:36 634

原创 ARM下的自旋锁spinlock

本文讲述的是linux 4.7.1下ARM architecture的自旋锁spinlock的实现。先来看定义:include/linux/spinlock_types.h我们不考虑CONFIG_DEBUG_LOCK_ALLOC, spinlock_t结构体中只有一个成员struct raw_spinlock rlock. struct raw_spinlock也只有一个成员arch_spinlock_t raw_lock.arch/arm/include/asm/spinlock_ty

2021-03-08 17:15:17 1096

原创 k8s下POD之间的通信过程

本文主要描述同一个node之内的pod之间的通信,以及不同node之间的pod之间的通信。同一个node上的不同pod之间的通信:假设上图的POD A要和POD B 通信: POD A 发送一个包,目的ip为POD B,当包路由后,按路由从POD A的veth0接口出去。这是查找veth0接口下的arp table,如果arp table中没有POD B的record,则进行arp地址解析,即发送arp request,请求reserve 10.1.20.3的mac地址,这个arp reques

2021-03-03 15:40:55 6346 4

原创 linux下strongswan workflow

Strongswan starter is the excutable program, located at /usr/libexec/ipsec/starter.(strongswan/src/starter/starter.c)Usage: starter [--nofork] [--auto-update <sec>][--debug|--debug-more|--debug-all|--nolog][--attach-gdb] [--daemon <name>]

2021-03-03 15:24:29 1470 2

原创 linux下的ip tunnel workflow

预置条件: PC1发送包到PC2,PC1和PC2在不同的局域网中,要使得PC1的包能够到达PC2,有两种途径:使用NAT 使用ip tunnel这里,我们只介绍ip tunnel这种方式。PC1发往PC2的包的src为192.168.1.10,dst为192.168.2.10,PC1首先将包发往网关GW1。在网关GW1和GW2之间建立ip tunnel,使得PC1的包能到达GW2。先介绍网关GW1和GW2的ip tunnel的配置。GW1:#iptunneladdtun...

2021-03-03 15:17:13 894 1

原创 oprofile的使用

本文介绍的是>=1.0.0版本的,以前的opcontrol是之前的版本,现在不推荐使用。1.0.0版本之后使用的是operf, opreport, opannotate.文档官方地址: https://oprofile.sourceforge.io/doc/index.htmloprofile是一系列性能监视工具集,包含operf, opreport, opannotate等工具。它依赖于硬件的”performance counter”。oprofile需要你的linux版本不低于2.6.

2021-03-01 16:07:03 1992

原创 linux CFS调度和load balance

内容有点多,文章篇幅长!!!本文讲述的是基于sched entity的cfs调度和load balance,不涉及group的cfs调度和load balance. 代码是基于linux-4.7.1.首先,我们来看一下两个初始化sched_init()和sched_init_smp()。start_kernel() -> sched_init()kernel/sched/core.csched_init()为每个cpu的rq(running queue)初始

2021-02-20 09:53:04 773

原创 linux ARM多处理器的启动过程

本文的假设前提: 单CPU(同一个package/socket), 多核multi-core, smp。在smp系统中,primary cpu进入start_kernel()执行。init/main.cboot_cpu_init()将primary cpu设置为active, present, possible, online。setup_arch()将构建machine_desc(单板硬件描述),设置secondary cpu引导方式psci。arch/arm/kernel/s

2020-12-04 18:18:51 2155

原创 linux X86下的段地址_段内偏移_虚拟地址_线性地址_物理地址

本文描述的是基于Linux下的x86的段地址、段内偏移、虚拟地址、线性地址、物理地址的转换与关系。我们先来看一个二进制可执行程序test:段基地址:当test加载运行时,linux使用预先设置好的GDTR和LDTR寄存器,找到对应的段描述符表,已经表项。然后,从断描述符表项(entry)中拿到段基地址。在linux实现中,所有段的基地址都是0,最大偏移为4GB(32bits机器)。段内偏移地址:在上面test汇编代码截图中,黄色的框表示偏移地址,当test被加载运行时..

2020-11-13 13:14:48 837

原创 hamming weight algorithm(汉明算法)以及kernel的实现

hamming weight(汉明权重)算法是一种用于计算字节串中1bit的数目。比如,0b1001 0000,ob0000 0011, 0b1000 0001的汉明权重均为2,ob 1110 0001, 0b1100 1100, 0b1001 1001的汉明权重均为4.汉明权重的算法(32位):int Hamming_weight(uint32_t n ) { n = (n&0x55555555) + ((n>>1)&0x55555555); ...

2020-11-11 18:06:08 941

原创 内存barrier

指令乱序和内存障碍(barrier)什么是指令乱序?指令乱序分为执行指令乱序(cpu)和编译器指令乱序。执行指令乱序(cpu)要了解cpu执行指令乱序,我们要先了解cpu的流水线pipeline.cpu处理指令时,将指令的处理过程分为取指、译码、[访存]、执行、[回写]等几个阶段。取指:顾名思义,就是到内存中(I-cache)取要执行的指令译码:cpu识别这个指令是做什么的,比如识别出操作码[op]、操作数等访存:cpu锁定内存的地址执行:执行指令操作,比如A..

2020-11-03 14:13:18 379

原创 linux kernel同步之原子操作

内核同步之原子操作在多线程编程中(无论多核还是单核),对同一内存访问时,如果没有同步机制,那么程序的执行结果和预期结果可能就不一致。比如: 线程1 线程2 read read modify modify write write 线程1和线...

2020-10-29 17:04:55 442

原创 x86下usb驱动framework

本文讲述的USB驱动,是基于X86架构下的PCI-USB总线下的USB设备驱动,侧重函数调用。架构如下:涉及的几个modules:arch/x86/pci/legacy.cdrivers/usb/host/uhci-hcd.cdrivers/usb/core/usb.c其中arch/x86/pci/legacy.c和drivers/usb/core/usb.c使用了subsys_initcall()来申明初始化的函数存放在initcall4这个段,结合makefile可知,drive

2020-09-28 09:28:47 544

原创 pci总线扫描及pci网卡驱动

本文讲述的基于intel 总线架构的硬件架构为例来说明linux是如何扫描总线上的PCI设备。CPU通过前端总线FS连接到北桥芯片North Bridge Chip(又称host Bridge), 北桥芯片本身也是PCI总线0上的PCI设备。北桥芯片通过DMI总线连接南桥芯片Sourth Bridge Chip。北桥芯片内置内存控制器,访问内存需要通过北桥芯片; 南桥芯片负责IO操作,以及下挂子pci总线,usb总线等。Linux kernel扫描pci总线从pci总线0开始,即pci0。

2020-09-14 14:59:35 2704

原创 linux kernel编译makefile简要介绍(arm)

本文以ast2500evb板子的linux kernel编译来进行。该板子使用的是arm cpu(1176)编译内核的命令参数为make ARCH=arm CROSS_COMPILE=arm-linux-首先来看顶层目录的Makefile.Linux/Makefile588行定义了make的target为vmlinux,但是,要注意了,我们需要明白make是怎么工作的:make程序首先读取-f参数指定的makefile文件或当前目录下的Makefile或makefile文件,并且递归

2020-09-07 18:04:52 1092

原创 linux中断处理与NAPI机制

本文以ast2500evb板子(arm1176jzs)为背景来介绍linux中断服务子程序的工作过程。在开始前,我们需要解决1个问题:中断服务子程序的地址如何告知cpu对于这个问题,我们可以从arm1176 手册可以获得: cpu开启了high vectors(默认),则中断向量表的地址为0xFFFF0000。我们再来看代码,代码中的中断向量表定义在哪?Linux/arch/arm/kernel/entry-armv.S 从上图中可知,我们的中断服务代码放在__vector

2020-08-25 14:53:20 629

原创 linux 内核网卡驱动 ast2500 board

主要介绍下ast2500内置网卡(MAC)的linux下的驱动程序。文件所在目录:Linux/drivers/net/ethernet/aspeed/ast_ether.c先来看一下内核的配置文件.config从.config文件的定义中,我们看到该驱动是编进内核中的,在内核初始化的时候,do_basic_setup()时会调用该驱动的module_init()申明的函数,如下:我们来看一下这个ast_ether_init()函数。2209行,调用ast_ether_sc

2020-08-20 17:32:36 1638

原创 linux kernel之platform driver&device

在驱动程序的模型分层有一层总线基础层(PCI总线,I2C总线,USB总线等),总线层对应实际上的总线,然而,对于嵌入式开发领域而言,有很多SOC芯片内置了各种外设,并比如LCD,UART、audio、摄像头口等等,并没有总线。为了统一驱动架构抽象,所以引入了platform bus这个虚拟的总线模型。本文简要介绍一下platform driver&device怎么工作的,主要是如何发现并注册设备(probe)。在系统上电后,start_kernel() -> rest_init()

2020-08-19 10:50:28 534

原创 linux make xxxconfig执行过程

Linux kernel之make xxxconfigLinux kernel编译之前需要做裁剪配置,即需要生成一个.config文件,这个文件定义了很多内核feature或module等配置信息,下图展示了一个示例部分:那么,如何来生成这个.config配置文件?常用的主要方式:make config;make menuconfig;make defconfig;make xconfig;本文,就来说说这个make xxxconfig是怎么run的。首先要读取的

2020-08-12 16:21:38 1899

原创 uboot引导os

本文接《uboot重定位后初始化》,假定未中断auto boot,即使用默认引导参数去boot os(linux kernel).假设,我们没有干预,使用auto boot, abortboot_normal()返回0.我们回到process_boot_delay().abortboot()返回0后,程序使用环境变量中定义的”bootcmd”来运行boot命令(449行).我的环境上:bootcmd=bootfmhbootargs= root=/dev/nfs rw nfsroo

2020-08-10 15:37:33 1010

原创 uboot重定位后初始化

relocate之后,uboot进行一系列的板级初始化,一直到和用户交互cli界面

2020-08-10 14:59:21 1020

原创 uboot启动之第一次运行C函数到uboot重定位

uboot上电后第一次运行C函数,以及uboot.bin自己将自己从spi flash搬运至sdram中运行

2020-08-10 14:52:05 1282 3

原创 uboot启动流程之上电启动到第一次准备好C语言运行环境

系统上电后,至uboot第一次准备好C语言运行环境

2020-08-10 14:39:34 1479

原创 uboot的配置(make xxx_config)和编译(make)工程解读

uboot编译三步走:make xxx_config make make install第一步make xxx_config这一步是产生板子的配置文件。我们假设是配置ast2500evb板子,那么这里的配置命令就是 make ast2500evb_configuboot/Makefile这里%_config中%表示通配任意字符,即匹配ast2500evb_config。首先执行依赖target ‘unconfig’的命令:删除之前配置时产生的文件。然后执行命令@$.

2020-07-29 14:57:16 4816

原创 linux 根文件系统,根设备,sys_open, sys_read, sys_write, sys_mount, sys_mknod

笔者语:1. 内容涉及比较多,自己也没有分章节,因为觉得这些内容关联性很强,自己也懒的去弄了。2. 本文涉及一下内容: 2.1 内核启动过程中,第一个文件系统为rootfs, 描述内核如何从rootfs切换到真正的根文件系统, 这其中包括了根设备的查找,还包括ramdisk, cpiok-initrd, image-initrd的描述。 2.2 内...

2020-05-08 13:36:44 2941

原创 关于进程和线程对于全局变量共享的问题学习总结

进程和线程的共享本文档可以说明以下几个问题:问题一:多进程编程中,不同进程是否可以通过全局变量来通信?问题二:多线程编程中,不同线程是否可以通过全局变量来通信? 在说明这两个问题之前,首先说明对于进程使用的内存的分段结构(高地址--->低地址):   环境变量:   存放进程的环境变量信息。   栈:                临时变量、返回地址、函数入参等。

2012-11-03 08:42:53 21382 3

基于linux的ipsec之路.pptx

基于linux的ipsec之路.pptx

2021-03-03

X86下段地址_偏移地址_虚拟地址_线性地址_物理地址.pptx

X86下段地址_偏移地址_虚拟地址_线性地址_物理地址.pptx

2021-02-24

同步之原子操作.pptx

同步之原子操作.pptx

2021-02-24

Platform driver&device.pptx

Platform driver&device.pptx

2021-02-24

linux kernel之文件系统.pptx

linux kernel之文件系统.pptx

2021-02-24

linux kernel之 x86 USB framework.pptx

linux kernel之 x86 USB framework.pptx

2021-02-24

hamming_weight算法.pptx

hamming_weight算法.pptx

2021-02-24

linux CFS调度以及load balance.pptx

cfs, load

2021-02-24

linux-kdump配置介绍

这是我看过的比较详细的文档,写得比较好,希望能帮到同样在学习linux内核崩溃转储的你

2014-01-24

linux2.4.0源码

linux2.4.0版本的源代码,可结合毛德操老师的《linux源代码情景分析》一书来学习linux的实现。

2012-09-24

hash表资料

收集了一些有关hash表的资料,属于比较基础性的。

2012-09-23

linux内核源代码情景分析

书的作者毛德操老师,所以就不是翻译的了,看过翻译版的应该都深恶痛绝那些极品翻译吧

2012-09-23

空空如也

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

TA关注的人

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