![](https://img-blog.csdnimg.cn/20201014180756922.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
linux内核
文章平均质量分 63
燕无鸻
这个作者很懒,什么都没留下…
展开
-
pcie相关问题
备份地址原创 2022-09-14 18:58:57 · 384 阅读 · 0 评论 -
简单的页异常流程
本文是基于Linux0.11源码来叙述该功能 取之于互联网 用之于互联网页异常中断处理程序(中断 14),主要分两种情况处理。是由于缺页引起的页异常中断, 这需要通过调用 do_no_page(error_code, address)来处理;是由于页面写保护引起的页异常,此时调用页写保护处理函数 do_wp_page(error_code, address)进行处理。 函数参数中的出错码(error_code)是由CPU 自动产生并被压入堆栈的,出现异常时访问的线性地址是从控制寄存器 CR2转载 2022-03-25 14:08:21 · 739 阅读 · 0 评论 -
简单的execve流程
本文转载于网络 基于Linux0.11源码来叙述该功能,源码可以在oldlinux.org上自行获取_sys_execve: lea EIP(%esp),%eax #取堆栈中存放系统调用的返回地址的地址 pushl %eax #将该地址入栈 call _do_execve #调用do_execve函数 addl $4,%esp #丢弃该地址 ret这边做了一个很重要的操作就是将堆栈中存放系统调用的返回地址的地址入栈(见下图中的PTR指针),注意这里是堆栈的地址!而非系统调用的返回地址(int转载 2022-03-24 22:57:21 · 730 阅读 · 0 评论 -
page table 设置及其拷贝
setup_paging: movl $1024*5,%ecx /* 5 pages - pg_dir+4 page tables */ xorl %eax,%eax //eax清零 xorl %edi,%edi /* pg_dir is at 0x000 */ edi 清零 cld;rep;stosl 将标志寄存器flag的方向标志位df清零 重复清零的目的 STOSL指令相当于将EAX中的值保存到ES:EDI指向的地址中,若设置了EFLAGS中的方向位置位(即在STO原创 2022-03-22 16:59:55 · 368 阅读 · 0 评论 -
linux内核 move_to_user_mode/fork
#define move_to_user_mode() \__asm__ ("movl %%esp,%%eax\n\t" \ 保存堆栈指针 esp 到 eax 寄存器中 "pushl $0x17\n\t" \ 首先将堆栈段选择符(SS)入栈。 "pushl %%eax\n\t" \ 然后将保存的堆栈指针值(esp)入栈。 "pushfl\n\t" \ 将标志寄存器(eflags)内容入栈 "pushl $0x0f\n\t" \ .原创 2022-03-15 22:41:32 · 1773 阅读 · 0 评论 -
linux 进程页表流程
mm_alloc_pgd() 函数会调用pgd_alloc()会为该进程分配一页(4K)的页全局目录的线性地址并保存在 task_struct->mm_struct->pgd中具体的实现是通过__get_free_pages((gfp_mask), 0)实现的,该函数通过alloc_pages()在低端内存里( 小于896M的空间里)分配一个页描述符(struct page *page),并将该页的页描述符通过page_address()转换成虚拟地址。实际上就是通过__va(PFN_PHY.原创 2022-03-15 14:01:48 · 648 阅读 · 0 评论 -
linux 内存 缺页异常
产生缺页异常中断的几种情况当内存管理单元(MMU)中确实没有创建虚拟物理页映射关系,并且在该虚拟地址之后再没有当前进程的线性区(vma)的时候,可以肯定这是一个编码错误,这将杀掉该进程当MMU中确实没有创建虚拟页物理页映射关系,并且在该虚拟地址之后存在当前进程的线性区vma的时候,这很可能是缺页中断,并且可能是栈溢出导致的缺页中断;当使用malloc/mmap等希望访问物理空间的库函数/系统调用后,由于linux并未真正给新创建的vma映射物理页,此时若先进行写操作,将和2产生缺页中断的情况一样;若转载 2022-03-14 13:54:14 · 1401 阅读 · 0 评论 -
Linux进程分配内存的两种方式--brk() 和mmap()
如何查看进程发生缺页中断的次数? 用ps -o majflt,minflt -C program命令查看。 majflt代表major fault,中文名叫大错误,minflt代表minor fault,中文名叫小错误。 这两个数值表示一个进程自启动以来所发生的缺页中断的次数。发成缺页中断后,执行了那些操作?当一个进程发生缺页中断的时候,进程会陷入内核态,执行以下操作:1、检查要访问的虚拟地址是否合法2、查找/分配一个物理页3、填充物理页内容(读取磁盘,或者直转载 2022-03-11 16:55:45 · 245 阅读 · 0 评论 -
虚拟内存笔记
内存的划分原创 2022-03-10 11:35:51 · 112 阅读 · 0 评论 -
ELF文件加载过程
加载和动态链接从编译/链接和运行的角度看,库分为动态链接和静态链接。相应的两种不同的ELF格式映像:1)一种是静态链接的,在装入/启动其运行时无需装入函数库映像、也无需进行动态连接。2)另一种是动态连接,需要在装入/启动其运行时同时装入函数库映像并进行动态链接。Linux内核既支持静态链接的ELF映像,也支持动态链接的ELF映像,GNU规定:1)把ELF映像的装入/启动入在Linux内核中;2)把动态链接的实现放在用户空间(glibc),并为此提供一个称为”解释器”(ld-linux.so.2)转载 2022-03-09 11:37:11 · 2022 阅读 · 0 评论 -
Multiboot规范
Multiboot规范的精确定义引导程序/OS映像接口主要包括三个方面:引导程序看到的 OS 映像的格式。当引导程序启动操作系统时机器的状态。引导程序传递给操作系统的信息的格式OS映像格式一个OS映像可以是一个普通的某种操作系统使用的标准格式的32位可执行文件,不同之处是它可能被连接到一个非默认的载入地址以避开PC的I/O区域或者其它的保留区域,当然它也不能使用共享库或其它这样可爱的东西。除了OS映像所使用的格式需要的头之外,OS映像还必须额外包括一个Multiboot头。Multiboo转载 2022-03-02 17:15:47 · 1809 阅读 · 0 评论 -
如何printf输出数字(例如内核64位地址)
d,lx,ld,,lu,这几个都是输出32位的hd,hx,hu,这几个都是输出16位数据的hhd,hhx,hhu,这几个都是输出8位的lld,ll,llu,llx,这几个都是输出64位的更正%llu 是64位无符号%llx才是64位16进制数...转载 2022-03-01 15:54:09 · 1195 阅读 · 0 评论 -
系统调用代码流程
由用户态进入内核态时,CPU会自动按照SS、ESP、EFLAGS、CS、EIP的顺序,将这几个寄存器的值压入到内核栈中父进程内核栈的样子执行int 0x80将SS、ESP、EFLAGS、CS、EIP入栈。在system_call中将DS、ES、FS、EDX、ECX、EBX入栈。system_call: cmpl $nr_system_calls-1,%eax 调用号如果超出范围的话就在 eax 中置-1 并退出 ja bad_sys_call push %ds #原创 2022-02-25 17:41:52 · 853 阅读 · 0 评论 -
内核页表和进程页表
初学内核时,经常被“内核页表”和“进程页表”搞晕,不知道这到底是个啥东东,跟我们平时理解的页表有和关系内核页表:即书上说的主内核页表,在内核中其实就是一段内存,存放在主内核页全局目录init_mm.pgd(swapper_pg_dir)中,硬件并不直接使用。进程页表:每个进程自己的页表,放在进程自身的页目录task_struct.pgd中。在保护模式下,从硬件角度看,其运行的基本对象为“进程”(或线程),而寻址则依赖于“进程页表”,在进程调度而进行上下文切换时,会进行页表的切换:即将新进程的pgd(页转载 2022-02-25 14:55:35 · 2501 阅读 · 0 评论 -
cpu scheduler
一、调度策略调度算法CPU 调度是线程为单位的,一个进程可以包含1个或者多个线程,如果是多个线程,会被分配到不同的cpu运行队列中,如果是1个线程,同一时间只会在一个cpu上允许运行 不同时间则可以被调度到不同的CPU上...原创 2022-02-24 16:44:28 · 415 阅读 · 0 评论 -
内存管理--申请空间api
kmalloc/kfree //内存分配物理上连续,只能低端内存分配get_zeroed_page/free_page //分配一个页面并清零,只能低端内存分配_get_free_page/free_pages //分配指定页数内存并清零,只能低端内存分配alloc_pages/_free_pages //分配指定页数内存并清零,可低端内存分配,也可高端内存分配vmalloc/vfree //分配的空间在内核空间连续,物理上无连续,所以性能差,一般只用于大块内存的申请。...原创 2021-11-30 11:04:59 · 303 阅读 · 0 评论 -
内存管理--linux进程地址管理之mm_struct
无论是内核线程还是用户进程,对于内核来说,无非都是 task_struct这个数据结构的一个实例而已,task_struct被称为进程描述符(process descriptor),因为它记录了这个进程所有的context。其中有一个被称为’内存描述符‘(memory descriptor)的数据结构 mm_struct,抽象并描述了Linux视角下管理进程地址空间的所有信息mm_struct定义在include/linux/mm_types.h中,其中的域抽象了进程的地址空间,如下图所示:每个进程都转载 2021-11-30 10:56:06 · 1128 阅读 · 0 评论 -
关于dpdk 收发包的问题
一: 关于 struct rte_mbuf 描述符的结构体原型/** * Structure associated with each descriptor of the RX ring of a RX queue. */struct igb_rx_entry { struct rte_mbuf *mbuf; /**< mbuf associated with RX descriptor. */};/** * Structure associated with each descr原创 2021-09-09 21:53:10 · 621 阅读 · 0 评论 -
物理地址和虚拟地址的分布
我们知道了CPU是如何访问内存的,CPU拿到内存后就可以向其它人(kernel的其它模块、内核线程、用户空间进程、等等)提供服务,主要包括:以虚拟地址(VA)的形式,为应用程序提供远大于物理内存的虚拟地址空间(Virtual Address Space)每个进程都有独立的虚拟地址空间,不会相互影响,进而可提供非常好的内存保护(memory protection)提供内存映射(Memory Mapping)机制,以便把物理内存、I/O空间、Kernel Image、文件等对象映射到相应进程的地址空间中转载 2021-09-09 09:48:14 · 421 阅读 · 0 评论 -
CPU是如何访问内存的
CPU通过MMU访问内存我们先来看一张图:从图中可以清晰地看出,CPU、MMU、DDR 这三部分在硬件上是如何分布的。首先 CPU 在访问内存的时候都需要通过 MMU 把虚拟地址转化为物理地址,然后通过总线访问内存。MMU 开启后 CPU 看到的所有地址都是虚拟地址,CPU 把这个虚拟地址发给 MMU 后,MMU 会通过页表在页表里查出这个虚拟地址对应的物理地址是什么,从而去访问外面的 DDR(内存条)。所以搞懂了 MMU 如何把虚拟地址转化为物理地址也就明白了 CPU 是如何通过 MMU 来访问内转载 2021-09-09 09:43:08 · 4265 阅读 · 0 评论 -
dpdk内存管理——rte_malloc实现
DPDK以两种方式对外提供内存管理方法,一个是rte_mempool,主要用于网卡数据包的收发;一个是rte_malloc,主要为应用程序提供内存使用接口。这里我们主要讲一下rte_malloc函数。rte_malloc实现的大体流程如下图所示。下面我们逐个函数分析。rte_malloc/* * Allocate memory on default heap. */void *rte_malloc(const char *type, size_t size, unsigned align)转载 2021-04-01 14:13:14 · 879 阅读 · 0 评论 -
关于framebuffer的几个问题
1. framebuffer 框架2 frambuffer流程acrn-kernel/drivers/video/fbdev/core/fbmem.c subsys_initcall(fbmem_init);--> proc_create_seq("fb", 0, NULL, &proc_fb_seq_ops) ret = register_chrdev(FB_MAJOR, "fb", &fb_fops); f原创 2021-01-27 18:04:08 · 533 阅读 · 0 评论 -
计算机的几个框图(第一张图是其他的其他都是来自计算机组成一书)
以运算器位中心的以存储器为中心的:原创 2020-09-23 11:03:30 · 1349 阅读 · 0 评论 -
linux新定时器:timefd及相关操作函数
timerfd是Linux为用户程序提供的一个定时器接口。这个接口基于文件描述符,通过文件描述符的可读事件进行超时通知,所以能够被用于select/poll的应用场景一,相关操作函数#include <sys/timerfd.h>int timerfd_create(int clockid, int flags);int timerfd_settime(int fd, int flags, const struct itimerspec *new_value, struct itimer转载 2020-06-04 09:13:04 · 593 阅读 · 0 评论 -
TCP/IP数据包封装与拆解概述
《Linux高性能服务器编程》阅读笔记:1. TCP/IP封包流程(1) 经过TCP/UDP封装后的数据称为TCP报文段/UDP数据报。因为TCP协议除了会为通信双方维持一个连接,还具有超时重发的功能,所以操作系统会将APP的要发送数据存储在内核的相关数据结构中:上图描述的是TCP发送数据时示意图,接收缓冲区也是如此。发送端APP调用系统调用send()/write()函数向TCP连接写...转载 2020-01-13 13:52:27 · 3130 阅读 · 0 评论 -
epoll多路复用-----epoll_create1()、epoll_ctl()、epoll_wait()
#include <sys/epoll.h>int epoll_create1(int flags);功能:创建一个多路复用的实例参数:flags:0:如果这个参数是0,这个函数等价于poll_create(0)EPOLL_CLOEXEC:这是这个参数唯一的有效值,如果这个参数设置为这个。那么当进程替换映像的时候会关闭这个文件描述符,这样新的映像中就无法对这个文件描述符操作...转载 2019-12-20 17:47:54 · 845 阅读 · 0 评论 -
PCI设备编号
1.PCI设备编号每一个PCI device都有其unique PFA(PCI Fcntion Address)PFA由 bus number、device number、function number组成一条PCI总线支持256个PFA,即支持256个PCI device每个PCI芯片都有自己的device number(取决于IDSEL管脚),每个PCI芯片占用8个PFA。每个PCI...转载 2019-12-10 17:32:39 · 7245 阅读 · 0 评论 -
引导过程与内核初始化
https://www.freebsd.org/doc/zh_CN.UTF-8/books/arch-handbook/boot-kernel.html转载 2019-12-10 09:38:16 · 145 阅读 · 0 评论 -
驱动开发基础 -- module_init() 和 late_initcall() 的加载顺序
在模块加载的过程中,init头文件非常重要,它定义了module_init和xxx_initcall以及相应的clearup函数,还决定了模块的加载顺序级别以及模块编译进内核和动态加载时module_init所做的不同的事情。而vmlinux.lds文件用来决定初始化所用的内存的分布,我们看看内核初始化的内存分布: .init.text : { _sinitte...转载 2019-11-20 21:55:05 · 1324 阅读 · 0 评论 -
基于Linux 3.0.15 kernel HDMI 初识
HDMI驱动框架在介绍HDMI的驱动框架之前,首先需要了解一下HDCP,HPD,DDC 这几个新名词指的是什么,否则直接深入源码只会搞得晕头转向。HDCP: HDCP的全称是High-bandwidthDigital ContentProtection,也就是“高带宽数字内容保护”。DDC: HDCP数据秘钥在CPU和显示设备间的交换以及EDID(EDID中包含有关显示器及其性能的...原创 2019-11-19 21:06:23 · 2713 阅读 · 1 评论 -
内核处理参数的几个函数(va_start, va_end 函数)
C 库宏 void va_start(va_list ap, last_arg) 初始化 ap 变量,它与 va_arg 和 va_end 宏是一起使用的。last_arg 是最后一个传递给函数的已知的固定参数,即省略号之前的参数。这个宏必须在使用 va_arg 和 va_end 之前被调用。声明下面是 va_start() 宏的声明。void va_start(va_list ap, l...原创 2019-10-17 15:39:54 · 491 阅读 · 0 评论 -
usb阅读笔记-----USB设备被识别流程
Usb设备识别加载过程(1)集线器检测新设备主机集线器监视着每个端口的信号电压,当有新设备接入时便可觉察。(集线器端口的两根信号线的每一根都有15kΩ的下拉电阻,而每一个设备在D+都有一个1.5kΩ的上拉电阻。当用USB线将PC和设备接通后,设备的上拉电阻使信号线的电位升高,因此被主机集线器检测到。)(2)主机知道了新设备连接后每个集线器用中断传输来报告在集线器上的事件。当主机知道了这个事...原创 2019-10-17 14:15:48 · 2939 阅读 · 0 评论 -
linux0.11启动 操作步骤
代码地址:https://github.com/kingfisherht/linux-0.11代码下载后分为两部分:第一部分是 bochs :这部分是在wind下虚拟出bios环境 相当于虚拟机第二部分是 linux-0.11: 这部分是linux最原始的内核引导 及 内核代码...原创 2019-05-27 11:16:17 · 750 阅读 · 0 评论 -
mount系统调用的实现
https://blog.csdn.net/cq062364/article/details/38801407转载 2019-07-20 16:23:51 · 216 阅读 · 0 评论 -
Linux 内核中的 Device Mapper 机制
原文:https://www.ibm.com/developerworks/cn/linux/l-devmapper/Device Mapper 是 Linux2.6 内核中支持逻辑卷管理的通用设备映射机制,它为实现用于存储资源管理的块设备驱动提供了一个高度模块化的内核架构,如图 1。在内核中它通过一个一个模块化的 target driver 插件实现对 IO 请求的过滤或者重新定向等工作,...转载 2019-05-24 10:09:33 · 349 阅读 · 0 评论 -
usb 阅读笔记 硬件部分
usb pdiusbd12 + at89s52串口:原创 2019-05-30 22:32:43 · 155 阅读 · 0 评论 -
config 配置warning: override: reassigning to symbol
GEN ./Makefile.config:6311:warning: override: reassigning to symbol EFI.config:6312:warning: override: reassigning to symbol INTEL_IPU4_BXT_GP_PDATA.config:6313:warning: override: reassigning...原创 2019-05-23 14:31:05 · 1694 阅读 · 0 评论 -
llinux 内核 sysrq的功能说明
使用方式:1)编译在Kernel hacking中,选中Magic SysRq key (CONFIG_MAGIC_SYSRQ) 。2)使用方法通常有两种方式:a、通过/proc接口;b、通过键盘输入组合键通过键盘组合键输入的规则是:串口:按住break键,然后5秒内输入command字符键盘:alt + sysrq +command键下面是通过/proc实现意义的说明。立即重启...原创 2019-05-30 11:34:31 · 8566 阅读 · 0 评论 -
x86 平台kernel config新旧编译方法
在86平台 config的配置文件:/arch/x86/configs/x86_64_defconfig这个配置文件是原始的kernel配置文件如果自己有一套新的config,需要编译:第一步:将自己的config 拷贝到 /arch/x86/configs/x86_64_defconfig然后执行 make ARCH=x86_64 defconfig备注:这一步是将原的config...原创 2019-05-23 10:12:44 · 1397 阅读 · 0 评论 -
linux中在/dev/下手动创建设备节点
转:https://blog.csdn.net/chuanzhilong/article/details/65936746/dev/目录下有许多设备节点文件,比如u盘的文件/dev/sda,mmc卡的文件/dev/mmcblk0,这些文件通常是由udev或mdev程序检测到uevent事件后自动创建的。我们也可以通过mknod命令手动创建。下面mmc卡为例,介绍如何创建其设备节点文件。1. ...转载 2019-05-30 09:11:18 · 4933 阅读 · 0 评论