本文原创为freas_1990,转载请标明出处:http://blog.csdn.net/freas_1990/article/details/11539695 关于socket与sock的关系再简单说一下. socket是面向文件与API的,拿来给application程序员fuck. 而sock是面向数据包的,用来发送用户的数据和接收网卡传到内核的数据. 我们再看一下sock的结构体定义. struct sock { ... volatile unsigned long wmem_alloc…
本文原创为freas_1990,转载请标明出处http://blog.csdn.net/freas_1990/article/details/10223581 TCP状态转移的原理并不高深,但是处理逻辑比较复杂,以下是TCP状态转移图.出自<TCP/IP协议详解:卷2>——W.Richard Stevens 这些状态是怎么实现的呢? 我们来看一下内核源代码.(server端部分) int tcp_rcv(struct sk_buff *skb, struct device *dev, stru…
本文原创为freas_1990,转载请标明出处:http://blog.csdn.net/freas_1990/article/details/11619609 我的朋友里,至少有2.5个神童. 有的书上说,一个人的能力取决于他的朋友圈子的能力.所以,我是幸运的,因为我的很多朋友都比我更优秀. 雅丽是公认的神童.北漂族.帅气.博学.擅长多国语言,同时,公认的Oracle大神.他自认是个文科生,跟计算机毫无关系,不过大量的兄弟伙在他们的Oracle数据库快死的时候会向雅丽求救,同时,获得起死回生的…
本文原创为freas_1990,转载请标明出处:http://blog.csdn.net/freas_1990/article/details/10162853 Jack:我想知道用户如何把数据发送到内核空间的? 我:你觉得哪里比较难理解呢? Jack:一般程序员会在程序里通过socket变量获得一个文件描述符,然后通过write把定义好的字符串写入到该描述符. 我:是的.你有什么不明白的吗? Jack:可是,我不知道这个write底层到底会做什么. 我:这个write底层会调用sock_sen…
本文原创为freas_1990,转载请标明出处:http://blog.csdn.net/freas_1990/article/details/11264237 大家都知道TCP是面向stream,而UDP是面向datagram的. 那,到底什么是stream呢? 我们来看一下以下代码 /* Now we need to check if we have a half built packet. */ if ((skb = tcp_dequeue_partial(sk)) != NULL) {…
http://blog.sina.com.cn/s/blog_6b94d5680101vfqv.html Linux内核源代码情景分析---第五章 文件系统  5.1 概述 构成一个操作系统最重要的就是 进程管理 与 文件系统: 有些操作系统有进程管理而没有文件系统,有些操作系统有文件系统而没有进程管理(MSDOS):两者都没有那就不是操作系统了: 狭义的文件:指磁盘文件,进入指可以是有序地存储在任何介质中(包括内存)的一组信息. 广义的文件:(unix把外部设备也当成文件)凡是可以产生或消耗信…
Linux内核源代码获取方法 什么叫Linux 什么叫Linux内核 Linux内核源代码的获取 什么叫Linux? Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户.多任务.支持多线程和多CPU的操作系统.它能运行主要的UNIX工具软件.应用程序和网络协议.它支持32位和64位硬件.Linux继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统.Linux最早是由芬兰黑客 Linus Torvalds为尝试在英特尔x86架构上提…
在windows下解压缩Linux内核源代码出现重复文件原因 2009年06月30日 13:35 来源:ChinaUnix博客 作者:embededgood 编辑:周荣茂     原因一.因为在Linux下文件名是大小写敏感的,而Windows下文件名则是大小不敏感,所以对于同一目录下如果有两个文件不同名但大小写不一样时在windows下会有问题.如kernel source中的include/linux/netfilter_ipv4/存在ipt_ecn.h和ipt_ECN.h,在linux这是…
说明:只供学习交流 一,目录结构 Linux内核源代码采用树形结构进行组织,非常合理地把功能相关的文件都放在同一个子目录下,使得程序更具有可读性. 二,目录结构 arch目录 arch是architecture的缩写.内核所支持的每种CPU体系,在该目录下都有对应的子目录.每个CPU的子目录,又进一步分解为boot,mm,kernel等子目录,分别包含控制系统引导,内存管理,系统调用等 | --x86  /* 英特尔cpu及与之相兼容体系结构的子目录*/ | |--boot   /*引导程序*/…
Linux内核源代码目录树结构. arch:包含和硬件体系结构相关的代码,每种平台占一个相应的目录.和32位PC相关的代码存放在i386目录下,其中比较重要的包括kernel(内核核心部分).mm(内存管理).math-emu(浮点单元仿真).lib(硬件相关工具函数).boot(引导程序).pci(PCI总线)和power(CPU相关状态). block:部分块设备驱动程序. crypto:常用加密和散列算法(如AES.SHA等),还有一些压缩和CRC校验算法. Documentation:关…
秉承着"不懂操作系统原理的程序员不是合格的程序员"的至理名言,鄙人又是买陈莉君老师的“Linux教学视频”,又是研读其力作<深入分析Linux内核源代码>,先将总结笔记放送给大家,希望对大家研习Linux源码提供更多的帮助,分章总结,从硬件起源开始->CPU中断->进程调度->内存管理->进程通信->文件系统->Socket网络通信,以源码结合注释的方式,对<深入分析Linux内核源代码>做了总结,Windows为闭源的,虽然…
1. 目的 内核模块需要运行在Linux 3.8.13内核中,因此需要为此内核重新编译内核模块源代码. 2. 步骤 1.在Ubuntu 14.04 64位(内核3.13.0-24-generic)上, 编译Linux 3.8.13内核源代码,并安装编译后的Linux内核. 2.为Linux 3.8.13内核编译内核模块 3. 方法 (1)下载:Linux内核源代码压缩包 https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.8.13.tar.g…
Linux内核源代码分析方法   一.内核源代码之我见 Linux内核代码的庞大令不少人"望而生畏",也正由于如此,使得人们对Linux的了解仅处于泛泛的层次.假设想透析Linux,深入操作系统的本质,阅读内核源代码是最有效的途径.我们都知道,想成为优秀的程序猿,须要大量的实践和代码的编写.编程固然重要,可是往往仅仅编程的人非常easy把自己局限在自己的知识领域内.假设要扩展自己知识的广度,我们须要多接触其它人编写的代码,尤其是水平比我们更高的人编写的代码.通过这样的途径,我们能够跳出…
内核源代码下载:www.kernel.org Linux内核源代码采用树形结构进行组织,非常合理地把功能相关的文件都放在同一个子目录下,使得程序更具可读性. linux内核代码最好不要在windows下解压,因为同名(大小写)会丢失一些code. source insight:添加汇编文件:option->Document option 添加.c..h..s..S 内核目录: arch目录 :内核所支持的每种CPU体系,在该目录下都有对应的子目录.每个CPU的子目录,又进一步分解为boot,mm…
Makefile不是Make Love 从前在学校,混了四年,没有学到任何东西,每天就是逃课,上网,玩游戏,睡觉.毕业的时候,人家跟我说Makefile我完全不知,但是一说Make Love我就来劲了,现在想来依然觉得丢人. 毫不夸张地说,Kconfig和Makefile是我们浏览内核代码时最为依仗的两个文件.基本上,Linux内核中每一个目录下边都会有一个 Kconfig文件和一个Makefile文件.对于一个希望能够在Linux内核的汪洋代码里看到一丝曙光的人来说,将它们放在怎么重要的地位都…
源代码所有在目录:/usr/src/linux (大部分linux发行版本中)  init 内核初始化代码  kernel 内核核心部分:进程.定时.程序执行.信号.模块...  mm 内存处理  arch 平台相关代码     i386 IBM的PC体系结构         kernel 内核核心部分         mm 内存管理         math-emu 浮点单元软件仿真         lib 硬件相关工具函数         boot 引导程序            compr…
朱荟潼 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课http://mooc.study.163.com/course/USTC 1000029000 知识笔记 1.arch/ 支持不同的CPU的源代码--X86. 2.init/ 内核启动相关的代码基本在此目录下. main.c Linux内核启动的起点:start_kernel. start_kernel 相当于普通C程序的main(). mm/ 内存管理代码. kernel/ 与进程调度有关:Linux内核的核心代码在该…
物理页面分配 linux 内核 2.4 中有 2 个版本号的物理页面分配函数 alloc_pages(). 一个在 mm/numa.c 中, 还有一个在 mm/page_alloc.c 中, 依据条件编译选项 CONFIG_DISCONTIGMEM 决定取舍. 1. NUMA 结构中的alloc_pages ==================== mm/numa.c 43 43 ==================== 43 #ifdef CONFIG_DISCONTIGMEM =======…
父进程fork子进程: child = fork() fork经过系统调用.来到了sys_fork.具体过程请參考Linux内核源码情景分析-系统调用. asmlinkage int sys_fork(struct pt_regs regs) { return do_fork(SIGCHLD, regs.esp, &regs, 0); } int do_fork(unsigned long clone_flags, unsigned long stack_start, //stack_start…
linux 内核采用页式存储管理.虚拟地址空间划分成固定大小的"页面",由MMU在运行时将虚拟地址映射成某个物理内存页面中的地址.页式内存管理比段式内存管理有很多好处,但是由于Intel是先使用段式管理的,然后才发明了页式管理,为了兼容,i386 CPU 一律对程序中使用的地址先进行段式映射,然后才能进行页式映射,既然CPU的硬件结构是这样,linux内核也只好服从intel的选择.通过一个例子看看linux内核是怎样在i386 CPU 上进行地址映射的. 假设我们写了这么一个程序:…
386 CPU中的页式存管的基本思路是:通过页面目录和页面表分两个层次实现从线性地址到物理地址的映射.这种映射模式在大多数情况下可以节省页面表所占用的空间.因为大多数进程不会用到整个虚存空间,在虚存空间中通常都留有很大的"空洞".采用两层的方式,只要一个目录项所对应的的那部分空间是个空洞,就可以把该目录项设置为空,从而剩下了与之对应的页面表.当地址的宽度是32时,两层映射机制比较有效也比较合理,但是,当地址的宽度大于32位时就不够有效了. 因此,linux 内核的映射机制设计成3层,在…
linux 内核的主体是以GNU的C语言编写的,GNU为此提供了编译工具gcc.GNU对C语言本身作了不少扩充. 1) gcc 从 C++ 语言中吸收了"inline"和"const".inline 函数的使用与#define 宏定义相似,但更有相对的独立性,也更安全,因为"inline"函数会进行参数的类型检查.使用inline 函数也有利于程序调试.如果编译时不加优化,则这些inline函数就是普通的.独立的函数,更便于调试.调试好了以后,再…
1. 前言 对刚接触Linux kernel的同学来说,遇到的第一个问题就是:我该从哪里入手?. 话说Linux kernel的打开方式是多种多样的:从简单的设备驱动入手:从源代码的目录结构入手:从kernel的启动过程入手:从大的功能模块入手:等等.不管怎样,每条都是正途(条条大路通罗马嘛). 而本文(以及随后的系列文章),将从Linux kernel的配置项入手,从整体上认识Linux kernel.之所以这么做,原因有二: 1)Linux kernel的配置项数目繁多,以至于进行kerne…
linux中的进程是个最主要的概念,进程从执行队列到開始执行有两个開始的地方, 一个就是switch_to宏中的标号1:"1:/t",//仅仅要不是新创建的进程,差点儿都是从上面的那个标号1開始的,而switch_to宏则是除了内核本身,全部的进程要 想执行都要经过的地方 另 一个就是ret_form_fork 这样看来.尽管linux的进程体系以及进程调度很复杂,可是整体看来就是一个沙漏状. 对于系统中的每一个新进程它首次被运行的过程必定是: sys_fork---->do_f…
系统:Ubuntu 18 CPU架构:AMD64 1,在终端输入:sudo apt install linux-source 命令 2,进入/usr/src/linux-source-4.15.0目录解压源码压缩文件:sudo tar jxkf linux-source-4.15.0.tar.bz2 3,目录linux-source-4.15.0即包含的是当前内核的源代码文件.…
1.    arch :与体系结构相关的文件 2.    block: 包含块存储设备IO调度算法的实现 3.    cryrto: 密码操作有关 4.    Documention: 内核中各个子系统 5.    Drivers: 大量设备类和外设控制器的驱动 6.    Fs:文件系统 7.    Include: 内核头文件 8.    Init:高级别初始化 9.    irc; 消息队列,信号,共享内存等进程间通信 10.  kernel :内核中与体系架构无关的代码 11.  lib…
1. 前言 本文将介绍ARM64架构下,Linux kernel和启动有关的配置项. 注1:本系列文章使用的Linux kernel版本是“X Project”所用的“Linux 4.6-rc5”,具体可参考“https://github.com/wowotechX/linux.git”. 2. Kconfig文件 ARM64架构中和Boot有关的配置项,非常简单,主要包括ACPI.命令行参数和UEFI几种.这些配置项位于“ arch/arm64/Kconfig”中,具体如下: 1: menu…
/arch:目录包括了所有和体系结构相关的核心代码.它下面的每一个子目录都代表一种Linux支持的体系结构,例如i386就是Intel CPU及与之相兼容体系结构的子目录.PC机一般都基于此目录. /documentation:目录下是一些文档,没有内核代码,可惜都是English的,是对每个目录作用的具体说明. /drivers:目录中是系统中所有的设备驱动程序.它又进一步划分成几类设备驱动,每一种有对应的子目录,如声卡的驱动对应于/drivers/sound:block 下为块设备驱动程序,…
上一节中,我们浏览了一次因越界访问而造成映射失败从而引起进程流产的过程,不过有时候,越界访问时正常的.现在我们就来看看当用户堆栈过小,但是因越界访问而"因祸得福"得以伸展的情景. 假设在进程运行的过程中,已经用尽了为本进程分配的堆栈空间,此时CPU 中的堆栈指针%esp已经指向堆栈区间的起始地址,如下图 假设现在需要调用某个子程序,因此CPU 需将返回地址压入堆栈,也就是要将返回地址写入虚存空间中地址为(%esp-4)的地方,可以在我们这个情景中地址(%esp-4)落入了空洞中,这是尚…
1. 用汇编语言编写部分核心代码的原因: ① 操作系统内核中的底层程序直接与硬件打交道,需要用到一些专用的指令,而这些指令在C语言中并无对应的语言成分: ② CPU中的一些特殊指令也没有对应的C语言成分,如关中断.开中断等等: ③ 内核中的某些函数在运行时会非常频繁的被调用,因此效率就显得很重要,用汇编语言写的程序效率通常要比高级语言编写的高: ④ 在某些特殊场合,一段程序的空间效率也会显得很重要: 2. linux 采用了AT&T的386汇编语言格式,而没有用Intel的,它们之间的差别主要有…