Linux内核学习笔记
无忧老猪
老码农一名:)
展开
-
内核与用户态程序共享内存的方法
一、首先获取一块物理上连续的物理内存有多种方法。(a)通过kernel命令行参数预留一些内存这种方法,适合于需要大块的物理连续的内存。假设物理内存总量为256M。命令行参数中,指定 mem=224M。即只让内核使用前224M内存,忽略其余的内存。这样,我们就有了32M的内存可用,内存起始物理地址为224*1024*1024。在内核态,通过ioremap,就可以将此物理地址处原创 2015-03-17 18:35:43 · 9317 阅读 · 0 评论 -
代码学习-Linux内核网卡收包过程(NAPI)
本文通过学习RealTek8169/8168/8101网卡的驱动代码(drivers/net/r8169.c),梳理一下Linux下网卡的收包过程。在下水平相当有限,有不当之处,还请大家斧正^_^ 驱动的初始化如下的rtl8169_init_module函数是此驱动的初始化代码,此函数只干了一件事,就是向内核注册一个pci驱动rtl8169_pci_driver。static原创 2015-06-02 19:02:54 · 6762 阅读 · 1 评论 -
Linux网卡名称的生成规则
eth0, eth1这些名称是怎么来的呢?内核发现一个pci网卡设备,调用网卡驱动的probe函数。probe函数在做完一定的初始化之后,会调用内核接口register_netdev向内核注册一个新的net_device设备。这个设备的名字,网卡驱动程序往往只决定其中一部分。就像下面这种方式,网卡驱动提供一个“eth%d”这样的名称,然后调用内核接口register_n原创 2015-01-23 14:04:19 · 7024 阅读 · 0 评论 -
Linux内核协议栈IP报文的上送转发及下发
这里主要分析在网络功能简单配置,且报文正常的情况下,报文的处理过程。网卡接收到IP报文,经过一些执行路径后,最终进入ip_rcv做处理。 ip_rcv在网络功能简单配置,且报文正常的情况下,就是简单的通过ip_rcv_finish完成后续的全部处理工作。ip_rcv_finish通过查找路由,为此报文找到一个dst_entry,然后即由skb_dst(skb)->input(skb);原创 2016-07-21 16:29:30 · 4989 阅读 · 0 评论 -
Linux协议栈代码阅读笔记(一)
Linux协议栈代码阅读笔记(一)(基于linux-2.6.21.7)(一)用户态通过诸如下面的C库函数访问协议栈服务int socket(int domain, int type, int protocol);int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);int connect(in原创 2013-09-26 23:08:00 · 2620 阅读 · 0 评论 -
Linux内核版本说明
在下水平相当有限,不当之处,还望大家批评指正^_^1. 标准内核版本信息看下图 (截自https://www.kernel.org/)第一列,版本性质:主分支(mainline),稳定版(stable),长期维护版(longterm)第二列,版本号。-rc表示非正式发布版本,[EOL]表示本分支最后一个版本。第三列,版本发布日期。patch列是补丁。用于从本分支原创 2016-03-01 15:02:17 · 12358 阅读 · 0 评论 -
关于Linux文件系统的几点注意事项
本人水平相当有限,不当之处还望大家多多指教。做内核开发的朋友,可能对下面的代码都很眼熟。static const struct file_operations xxx_fops = { .owner = THIS_MODULE, .llseek = no_llseek, .write = xxx_write, .unlocked_ioctl = xxx_ioctl, .原创 2017-05-14 05:20:24 · 763 阅读 · 0 评论 -
Linux关机重启停机(shutdown reboot halt)流程分析
由于本人水平相当有限,不当之处还望大家多多指教。涉及的内核源码,基于linux-3.10.102。首先,对于用户态发起的这类操作请求,最终都是通过sys_reboot系统调用(源码在kernel/sys.c)实现的。其代码如下。如其注释所言,他除了可以重启关机停机,还可以修改ctrl-alt-del组合键的含义。另外,注释还说到此系统调用不会做sync。即sync需要用户在调用此系原创 2017-05-14 17:22:43 · 6056 阅读 · 0 评论 -
raw binary文件探秘
Linux下的目标文件、动态库文件、可执行文件,其格式为elf格式。elf文件是有结构的文件,其内部有丰富的信息,例如,可能包含了可执行文件的入口地址,各个节的起始地址,可重定位信息,还可能包含指令与代码行的对应关系(用于调试)。内核则利用elf文件中的相关信息,加载运行可执行文件。然而内核映像,u-boot映像这些特殊的文件,则是raw_binary文件。这当然有他的原因。以u-原创 2017-04-25 23:57:08 · 3802 阅读 · 0 评论 -
Linux内核的启动流程
内核本身由一个作了raw_binary处理的目标文件(下文称为kernel.o)以及大量的在运动时可能被动态装载的内核模块构成。关于内核映像的构成,可以参考http://blog.csdn.net/crazycoder8848/article/details/19156503本文仅谈一谈内核的启动流程,基于3.10.102版本的内核源码。内核的启动流程,开始于kerne原创 2017-08-08 02:04:26 · 1184 阅读 · 0 评论 -
Linux网卡驱动代码阅读杂记
RealTek 8169/8168/8101的驱动代码,一共就一个文件(drivers/net/r8169.c),而且总代码行也就5千行左右,很适合新手入门学习。而像intel e1000e的驱动,包含了较多的文件(总入口文件:drivers/net/e1000e/netdev.c),总代码行至少在1万行以上。先来看看r8169的相关代码:rtl8169_open中,用dma_原创 2016-07-19 15:47:32 · 4497 阅读 · 0 评论 -
Linux下进程的退出
注意,本文说的是整个进程(一个进程可能包含多个线程)的退出。一个进程的退出,有可能是由进程自己的用户态代码主动退出的,也可能是由内核通过信号处理机制(如SIGKILL、SIGABRT)强制执行的。一、用户态主动退出有如下多种途径,直接main函数返回,调用exit调用_exit调用exit_group上面几种情况,前两者等价(All functions regi原创 2016-05-06 17:10:34 · 1332 阅读 · 0 评论 -
virtio驱动学习笔记
virtio是对虚拟化环境下guest kernel中io操作的一种优化。首先需要说明的是,在内核的角度来看,virtio设备及其driver,和其他设备及驱动一样,都是普通的设备,并没有什么特殊性。也就是说,内核并不知道这种io优化的存在。virtio设备,在系统层面看,就是pci设备。但是,为了提高io效率,对io操作做出了优化。主要方案是:1) 当virtio设备输出数据时,原创 2015-04-21 11:00:38 · 8459 阅读 · 1 评论 -
Linux信号处理
由于在下能力相当有限,有不当之处,还望大家批评指正^_^一、 信号概念信号(signal)是软中断。信号提供了一种处理异步事件的方式。当各种各样的事件发生时,程序相应的会收到各种各样的信号。对于大部分信号,程序可以自行决定如何处理他们。程序在什么情况下会收到信号,下面是一些例子执行某条指令,产生了异常 (例如, 访存指令访问无效内原创 2015-07-04 14:09:57 · 1787 阅读 · 0 评论 -
Linux内核巨页代码学习
巨页的实现,涉及到两个模块:hugetlb和hugetlbfs。hugetlb相当于是huge page页面管理者,页面的分配及释放,都由此模块负责。hugetlbfs则用于向用户提供一套基于文件系统的巨页使用界面,其下层功能的实现,则依赖于hugetlb。1. hugetlb模块struct hstate hstates[HUGE_MAX_HSTAT原创 2015-04-10 18:33:25 · 8654 阅读 · 0 评论 -
Linux内核映像的生成过程
本人水平相当有限,不当之处,欢迎指正。在各种各样使用Linux的计算机系统中,系统启动的早期阶段,通常都会有这样一个环节,boot loader程序将内核映像加载到内存中,然后跳转到映像的起始位置开始执行。接下来,内核就跑起来了。那么,这个内核映像到底是个什么东东呢。本文就来简单介绍一下Linux内核映像的生成过程。本文依据的内核版本 2.6.32(一)原创 2014-02-13 13:42:13 · 9855 阅读 · 0 评论 -
pci设备学习笔记
水平有限,错误难免 ^_^参考资料:1) 《Linux内核源代码情景分析》2) Linux内核源代码(2.6.32)。本文只讨论比较简单的软硬件配置场景。系统中的第一条PCI总线(即主PCI总线),挂在“宿主—PCI桥”上。CPU通过“宿主——PCI桥”就可以访问主PCI总线了。PC机中通常只有一个“宿主—PCI桥”。但是,通过引入其他类型的P原创 2015-06-17 20:33:34 · 6674 阅读 · 0 评论 -
Linux设备与驱动学习笔记(概述)
由于在下能力相当有限,有不当之处,还望大家批评指正^_^本文基于Linux内核2.6.32一、宏观架构在内核中,大量的驱动与设备(但不是全部),都按总线进行分类管理。例如,凡是pci设备或pci设备的驱动,都归到pci总线下管理。1. 从sys文件系统感受这种架构。/sys/bus/目录下列出了各种总线类型,像pci、i2c、usb、platform等。我们以p原创 2016-03-09 19:06:58 · 7093 阅读 · 0 评论 -
Linux内核中的初始化initcall
由于在下水平相当有限,不当之处,还望大家批评指正^_^基于Linux 2.6.32include\asm-generic\Vmlinux.lds.h中有如下定义:这等于是安排了名称如.initcall[s].init的一系列section的顺序,level越小,越靠前。符号__initcall_start记录了这片区域的开始,__initcall_end符号记录了这原创 2016-03-10 15:49:28 · 3707 阅读 · 0 评论 -
Linux中断处理杂记
1. irq_desc数组kernel/irq/irqdesc.cstruct irq_desc irq_desc[NR_IRQS] __cacheline_aligned_in_smp = {[0 ... NR_IRQS-1] = {.handle_irq = handle_bad_irq,.depth = 1,.lock = __RAW_SPIN_LOCK_U原创 2016-04-29 18:00:48 · 591 阅读 · 0 评论 -
话说Linux内核模块
首先,一个内核模块,就是一个ELF文件。内核本身也是一个ELF文件。一个模块,可能是一个协议,一个文件系统,一个驱动,一种具体的应用,等等任何东西。也可能是多种东西的组合。内核在运行时,通过动态加载/卸载内核模块,可以动态扩展/删减内核的功能。每个模块在编译时(假设模块名为xxx),会自动生成一个xxx.mod.c的文件,该文件会链接到xxx模块中去。下面是此文件的一个原创 2015-03-16 15:05:06 · 3720 阅读 · 0 评论 -
Linux内核rootfs的初始化过程
由于在下水平相当有限,不当之处,还望大家批评指正^_^在Linux shell中执行mount命令,通常可以看到某个做了文件系统的磁盘分区或flash分区或内存文件系统做为所谓的根文件系统被mount到了挂载点/处。实际上内核中最初始的根文件系统,并不是来自内核外部,他是由内核自己构建出来的。为了说明这个过程,我们先说说mount的过程。系统调用sys_mount是在fs/n原创 2018-01-27 01:30:42 · 2801 阅读 · 0 评论