自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(25)
  • 收藏
  • 关注

原创 《深入理解Linux网络技术内幕》阅读笔记(六)

PCI的优点之一是,其支持寻找IRQ和每个设备所需的其他资源的探测方式相当优雅。模块可以在加载期间接收一些输入参数,以告知该如何配置其所负责的所有设备。但是,有些时候,特别是PCI这类总线,让驱动程序自行检查系统上的设备,然后为其负责的那些设备做配置会比较简单一点。必要时,可以退回到手动配置。 探测方式有两种: 静态: 给定一个设备PCI ID,内核就能根据id_table向量查询出正确的PC

2015-09-30 22:11:48 620

原创 《深入理解Linux网络技术内幕》阅读笔记(五)

通过中断,NIC能够告知其驱动程序几种不同的事情,包括: 1.接收一帧。 2.传输失败。 3.DMA传输已成功完成。给定一个帧传输,当帧上载至NIC的内存准备在此媒介上传输时,驱动程序就会将持有该帧的缓冲区释放掉。使用同步传输时(无DMA),当该帧已上传至NIC,驱动程序就会立刻知道。但使用DMA时,也就是使用异步传输,设备驱动程序必须等待NIC发出明确的中断事件。 4.设备有足够内存处理新

2015-09-26 13:02:51 703

原创 《深入理解Linux网络技术内幕》阅读笔记(四)

通知链 数据结构: 14 struct notifier_block 15 { 16 int (*notifier_call)(struct notifier_block *self, unsigned long, void *); 17 struct notifier_block *next; 18 int priority; 19 };

2015-09-25 23:14:24 1025

原创 《深入理解Linux网络技术内幕》阅读笔记(三)

Netlink Netlink套接字代表用户空间和内核的IP网络配置之间的首选接口。Netlink也可作为内核部分以及多个用户空间进程之间的消息传输系统。 通过Netlink套接字,你可以使用标准套接字API打开或关闭套接字,使用套接字传输数据或者接收套接字数据。 Netlink使用新的PF_NETLINK协议族,只支持SOCK_DGRAM类型,而且定义了几种协议,每一种都用于网络协议栈的不同

2015-09-25 20:10:09 787

原创 《深入理解Linux网络技术内幕》阅读笔记(二)

数据结构191 struct sk_buff_head {192 /* These two members must be first. */193 struct sk_buff *next;194 struct sk_buff *prev;195 196 __u32 qlen;197

2015-09-25 15:19:02 1206

原创 《深入理解Linux网络技术内幕》阅读笔记(一)

垃圾收集: 内存是有限的共享资源,不应该浪费,特别是在内存中,因为内核不使用虚拟内存。多数内核子系统会实现某种垃圾收集,以回收由未使用的或无效的数据结构实例所持有的内存。根据特定的功能所需而定,你会发现有两种主要的垃圾收集: 异步: 这种垃圾收集类型和特定事件无关。一个定时器会定期启用一个函数,以扫描一组数据结构,然后把那些适合删除的数据结构释放掉(常见的准则为是否存在null引用计数)。

2015-09-24 22:39:38 1691

原创 利用typeof实现一个自己的sizeof

不知道C里面的sizeof是怎么实现的,我自己利用typeof实现一个sizeof,实现的宏为:#define SIZEOF(val) ((size_t)((typeof(val) *)0+1))测试代码:#include<stdio.h>#define SIZEOF(val) ((size_t)((typeof(val) *)0+1))void main(){ unsigned int a

2015-09-22 12:37:29 765 1

原创 Linux内核命名空间中关于pid管理的一些理解

记得看《深入Linux内核架构》时,里面有讲到关于命名空间的概念,但是现在却基本上弯光了,唉。所以今天特意自己翻看一下内核4.2代码,整理一下命名空间中关于pid管理的部分,等什么时候有空了,再去翻看那本著作吧(写的比较乱〒_〒)。 命名空间的概念网上有很多,关于pid管理的话,大致思想应该就是各个task_struct的pid在各自的命名空间里面是唯一的,但是在全局不唯一。 通过一个函数fin

2015-09-18 22:14:16 2143 1

原创 用户态进程如何在堆栈执行代码

用户态进程在堆栈执行代码时,因为内核在加载该进程的时候,取消了在堆栈上执行代码的权限,因此如果在其上执行代码的话,进程会直接死掉。 接下来是在堆栈执行代码的测试例子,主要思路是给物理内存加上可执行代码的权限。代码如下:#include<stdio.h>#include<stdlib.h>#include<string.h>#include<unistd.h> #include<sys/m

2015-09-17 15:16:50 1229

原创 关于如何使用内核模块来卸载文件系统(文件系统正在被使用)的测试和验证

今天做的一个测试,当做笔记记录一下。 测试环境: 我在/home目录下面建立一个proc文件夹,然后把proc文件系统挂载到上面,结果如下: 然后执行sleep 200 < ./proc,模拟./proc被使用情况。以下是测试模块的代码和注释:#include <linux/gfp.h>#include <linux/syscalls.h>#include <linux/rcupdat

2015-09-17 14:44:45 743

原创 如何调用Linux内核没有导出的函数

Linux内核没有导出的函数不能调用,即使包含了头文件,也会出现符号未定义的警告,并在加载模块时失败。 以下是我的测试例子:#include <linux/module.h>#include <linux/syscalls.h>MODULE_LICENSE("GPL");MODULE_AUTHOR("Linmiaohe");MODULE_DESCRIPTION("try to evole

2015-09-17 12:27:03 2254

原创 关于在Linux的堆栈段执行代码的实践和思考

在内核态是可以执行的,具体代码如下: 具体平台信息为: Linux ubuntu 2.6.32-38-generic #85-Ubuntu SMP Wed Jan 25 13:59:45 UTC 2012 i686 GNU/Linux#include <linux/init.h>#include <linux/kernel.h>#include <linux/module.h>#inclu

2015-09-16 17:29:29 535

原创 TCP释放连接时为什么time_wait状态必须等待2MSL时间(阅读笔记)?

为什么上图中的A在TIME-WAIT状态必须等待2MSL时间呢? 第一,为了保证A发送的最后一个ACK报文能够到达B。这个ACK报文段有可能丢失,因而使处在LAST-ACK状态的B收不到对已发送的FIN+ACK报文段的确认。B会超时重传这个FIN+ACK报文段,而A就能在2MSL时间内收到这个重传的FIN+ACK报文段。如果A在TIME-WAIT状态不等待一段时间,而是在发送完ACK报文段后就立即

2015-09-15 01:41:39 6875

转载 ELF文件中符号的动态解析过程

本文引用并修改了http://jzhihui.iteye.com/blog/1447570 中的动态链接部分,然后加了自己的理解和注释。 用来测试的C代码为:/* hello.c */#include <stdio.h>int main(){ printf(“hello world!\n”); return 0;}$ gcc –o hello hello.c当执行一个用户

2015-09-11 09:40:04 1182

原创 Linux内核如何加载编译进内核的模块

在Linux内核启动过程中,在init()函数执行过程中会调用do_basic_setup函数,进程调用 do_initcalls()函数,该函数实现如下:451 static void __init do_initcalls(void)452 {453 initcall_t *call;454 455 call = &__initcall_start;45

2015-09-10 00:25:09 920

原创 关于Linux内核源码中是如何区别进程上下文和中断上下文

关于进程上下文和中断上下文区别定义什么的,网上一搜一大把,但是我关心的是,内核是如何实现这种区分的。看了半天源码(不是最新的),得出结果如下: 首先在内核初始化的时候,会调用init_IRQ来初始化中断描述符表中,关于中断的部分,部分代码如下:458 for (i = 0; i < NR_IRQS; i++) {459 int vector = F

2015-09-09 13:02:12 1019

原创 块设备驱动程序中request方式和make_request方式的区别(阅读笔记)

当驱动程序采用request方式时,外部组件发送给它的bio对象将首先被内核提供的函数__make_request拦截并处理,__make_request使用了复杂的逻辑来试图优化目标请求队列的各个请求,以最大程度提升系统性能。__make_request在最终调用驱动程序的请求处理函数前,会将bio对象中的相关数据转储到请求对象req中,然后把它作为参数传递给处理函数。而当驱动程序使用make_r

2015-09-09 01:08:28 1915

原创 加载模块时出现unknown partition table 的原因

块设备驱动程序通过调用add_disk函数来向系统注册一个磁盘设备。当驱动程序试图这么做的时候,内核试图读取该磁盘设备上的分区信息,对每个有效分区形成一个驱动模型中设备device对象,并通过device_add添加到系统中,但此时这些分区不会产生对应的block_device对象,直到分区设备被打开。 如果此时加入的设备尚未产生有效分区,所以在add_disk时系统将无法获得分区信息,因此产生u

2015-09-08 13:01:10 9487 1

原创 关于shell中time的内容重定向问题

现在想要把time的结果重定向到某个文件,若执行:time date > txt结果如下: 并没有得到想到的时间信息。 其实time输出的时间信息是重定向到stderr的,所以试试这一句:time date > txt 2>&1结果如下: 还是没有实现预期目标。 其实,time比较特殊,你在其后面输入的内容都会被当成他要计时的对象,即上面的语句执行过程为先date > txt 2>&

2015-09-07 10:40:04 1918

原创 关于进程页表和页目录是存放在内核空间,还是用户空间,低端还是高端内存的思考和验证

首先,如果内核没有配置高端内存,那么进程页表肯定就是在低端内存了,也就是全部在内核空间了。 在配置了高端内存的情况下,进程页表的pgd,pud,pmd,pte这些,应该放在内核空间的低端内存,还是高端内存,内核空间还是用户空间?由于内核通过cr3能获得全局页目录中的物理地址,由于低端内存的线性映射,内核就能据此算出页目录的虚拟地址,进而实现对页目录的读写,但是,如果所有进程的页表都存放在低端内存,

2015-09-07 10:13:37 7486

转载 Linux 内核的排队自旋锁

排队自旋锁(FIFO Ticket Spinlock)是 Linux 内核 2.6.25 版本中引入的一种新型自旋锁,它解决了传统自旋锁由于无序竞争导致的“公平性”问题。 长期以来,人们总是关注于自旋锁的安全和高效,而忽视了自旋锁的“公平”性。传统的自旋锁本质上用一个整数来表示,值为1代表锁未被占用。这种无序竞争的本质特点导致执行线程无法保证何时能取到锁,某些线程可能需要等待很长时间。随着计算机处

2015-09-05 23:09:39 579

原创 Linux内核switch_to宏实现进程切换的原理

switch_to宏的实现:27 /* 28 * Saving eflags is important. It switches not only IOPL between tasks, 29 * it also protects other tasks from NT leaking through sysenter etc. 30 */ 31 #define switch_to(p

2015-09-05 22:58:21 1131

原创 Linux内核中fasync机制对RCU锁的使用

fasync实现机制比较简单,就是把要通知的进程放到一个链表里面,然后有事件发生时,就一一给链表里面的进程发送指定信号,通知事件的发生。 往通知链表里面增加一项:623 struct fasync_struct *fasync_insert_entry(int fd, struct file *filp, struct fasync_struct **fapp, struct fasync_str

2015-09-04 11:44:28 686

原创 Linux内核sys_poll实现原理

poll的功能: 可以监视多个文件描述符,一旦某个文件描述符就绪(一般是读就绪或者写就绪),就能够通知应用程序进行相应的读写操作。 poll核心代码:for (;;) { struct poll_list *walk; for (walk = list; walk != NULL; walk = walk->next) { struct pollfd * pfd, *

2015-09-04 01:28:05 1740

原创 Linux内核中断处理的irq_thread机制

中断不能睡眠的原因:睡眠会导致进程的调度,使得从中断切换到别的进程执行。但是由于Linux内核的调度器是基于进程进行调度的,也就是说,调度的实体是基于task_struct的,而中断处理程序执行的时候,并没有这个实体,即没有所谓的进程上下文,所以从中断调度别的进程运行时,便无法再回到该中断继续执行。所以在中断处理程序中不能睡眠(表述的不好,请见谅╮(╯-╰)╭)。 因而内核为中断处理提供了另一种机

2015-09-02 20:28:32 1861 1

空空如也

空空如也

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

TA关注的人

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