内核
IT残荷轩
秋风吹渭水,落叶满长安
展开
-
写在最前面
写在最前面 这几日心情一直不太好,可能是天气的原因,也可能是太憋闷的原因(PS:天气是凉爽晴朗的)。思来想去发现有什么东西自己给遗漏了,或者说自己刻意的给疏忽了,想了半天才发现:自己的职业生涯需要发生点改变了,一个测试人员,论专业技术性没有开发人员专业,论口才没有销售嘴上生花,论管理没有职业经理人对管理头头是道。这才幡然醒悟,发现自己好像有什么东西需要补充,可能是专业的,也可能是人际的,也...原创 2018-10-18 15:45:06 · 1520 阅读 · 0 评论 -
test22
待更新原创 2019-03-05 20:55:24 · 1499 阅读 · 0 评论 -
QEMU+GDB调试Linux内核总结(全)
写在最前面昨天更新了一篇名为《QEMU+GDB调试linux内核全过程》[link][https://blog.csdn.net/weixin_37867857/article/details/88138432]的博客,发现排版比较混乱,而且思维也比较混乱。咋一看下来简直是惨不忍睹,而且会给读者在安装过程中一种云里雾里的感觉,加上将近一个半月没有更新博客,导致对于博客的写作比较生疏了。所以决定重...原创 2019-03-05 23:02:27 · 8595 阅读 · 4 评论 -
Linux块设备总结(三)
bdev文件系统在上一章中讲解了Linux块设备驱动架构以及块设备驱动的一些入门的部分,也提及这一章中主要讲解bdev文件系统。bdev文件系统是一个内核文件系统也叫做伪文件系统,在应用层或者叫做用户层是不可见的。这样对于读者来说理解起来比较吃力的,bdev文件系统实际上就是按照文件系统的组织方式来呈现给内核的,没有什么特殊的含义,如果说从功能上来说的话对于读者比较好理解:bdev文件系统主要...原创 2019-03-14 20:41:01 · 2060 阅读 · 0 评论 -
Linux内核块设备总结(一)
在分析块设备驱动之前,整体规划如下: 1. 介绍qemu使Linux内核挂载块设备。 2. 介绍块设备驱动挂载过程。 3. 介绍块设备驱动运行过程。原创 2019-03-07 18:41:27 · 2862 阅读 · 0 评论 -
Linux块设备总结(二)
上一篇博客中《Linux内核块设备总结(一)》[link][https://blog.csdn.net/weixin_37867857/article/details/88316757]介绍了从qemu中启动增加块设备的方法。最后一步gdb调试中提及了blkdev_open函数的系统调用,但是只是提及了系统调用,并没有深度的去解析这个函数。只是我们提及在执行cat /dev/sda操作之后gdb调...原创 2019-03-07 22:44:04 · 3114 阅读 · 1 评论 -
LOOP块设备
在Linux系统中存在一种特殊的块设备,这种设备本身以一般文件的形式存在于一般文件系统中,但是又可以被制作成其他文件系统从而被mount上。这种理解方式比较绕,举个例子:在ext4文件系统中存在一个文件为loop_dev.img的文件其大小为1000Kib,但是其又可以作为一个独立的块设备被挂载在系统的某一目录下面,比如mount。这种设备也称作LOOP设备。本质上来说loop设备的文件盘以普通...原创 2019-03-24 21:09:33 · 509 阅读 · 0 评论 -
设备模型类的迭代器(struct class_dev_inter结构)
上一章我们讲解了struct klist结构,并且知道这个结构怎么使用的问题,这一章中我们讲解struct klist结构在内核中的具体使用,也可能是在内核中唯一使用klist结构部分----类-设备迭代器(class_dev_inter),也就是我们在文章题目中所说的struct class_dev_inter结构。首先说明一下类迭代器的使用场景:在内核中有一种设备模型为:类。每一个类设备模...原创 2019-04-03 21:42:34 · 570 阅读 · 0 评论 -
Linux块设备总结(五)块设备数据的组织结构
在上一篇文章中《linux块设备总结(四) 块设备数据组织》[link][https://blog.csdn.net/weixin_37867857/article/details/88856550]我们看到了数组的组织结构,下面对于上一章中做一个总结,同时也会引申一个重要的数据结构struct gen_hd,同时也作为一个承上启下的作用,为以后我们介绍块设备的重要的函数做一一个承接。在上一篇文...原创 2019-03-31 15:37:00 · 684 阅读 · 0 评论 -
Linux驱动模型----class类的实现
设备模型的引入在Linux系统中存在成千上万的驱动代码,试想一下:每一个驱动对应着一个硬件设备,那样每增加一个硬件设备就需要重新修改驱动的所操作的硬件地址去适配这个硬件,这样有两个麻烦:1.对于驱动的适配修改增加了工作量。2.不利于后期统一维护,这样在大规模的系统中增加了不必要的工作量。所以就引入了驱动模型的概念,这样减少了驱动的适配的工作量。其主要思想是把硬件设备和驱动分离的设计概念。...原创 2019-04-06 14:44:27 · 857 阅读 · 0 评论 -
Linux块设备总结(六)块设备子系统初始化
在上两篇博客中我们学习了块设备子系统数据组织结构,但是块设备子系统的总体上的初始化还没有涉及到,本章就开始学习块设备子系统的一系列初始化。块设备子系统简而言之是Linux中管理块设备的一个子系统,是Linux中一个重要的子系统,没有块设备子系统我们的硬盘,光驱,USB在我们的linux 系统中都不可能感知,更别提热插拔的USB了。...原创 2019-04-01 21:52:28 · 998 阅读 · 0 评论 -
Linux块设备总结(七)块设备的注册
上一章中讲完了块设备的初始化,总体来说比较复杂,与其数据结构一起串讲会有一种比较豁然开朗的感觉。本章主要讲解块设备的注册入口,试想一下,在块设备注册过程中间没有入口我们怎么把块设备注册进入内核呢?我们的块设备的注册入口比较简单:register_blkdevint register_blkdev(unsigned int major, const char *name){ s...原创 2019-04-01 22:28:45 · 991 阅读 · 0 评论 -
Linux块设备总结(八)申请通用块设备操作
我们已经知道通用块层是一个内核组件,她处理来自系统中的所有块设备发出的请求。她的主要作用是:1.将数据缓存放在高端内存,2.通过一些附加手段显现所谓的零-复制模式3.管理一个逻辑卷LVM RAID等4.发挥大部分新磁盘控制器的高级特性。以上这些我们都不讨论,只讨论在内存中申请struct gendisk操作。申请gendisk操作非常简单,如下所示:struct gendisk *...原创 2019-04-07 12:45:18 · 410 阅读 · 0 评论 -
linux块设备总结(四) 块设备数据组织
回顾在[<Linux块设备总结(二)>][https://blog.csdn.net/weixin_37867857/article/details/88322091]中我们讨论初步认识了linux块设备的架构并且讨论了各个层的作用,下面我们讨论一下在Linux块设备的几个重要的块设备的数据组织形式。回顾一下[<Linux块设备总结(二)>][https://blog....原创 2019-03-28 20:01:15 · 1126 阅读 · 0 评论 -
内核klist结构分析
进来学习块设备驱动时候偶然遇到在genhd_device_init中看到class_register调用中有关klist链表有关的问题,经过今天一天业余时间研究终于发现klist的重要作用,下面介绍有关klist有关的数据结构,函数,以及klist申请有关的一些函数。数据结构klist主要有一个链表头结点以及若干个链表节点组成的,主要数据结构如下:struct klist { ...原创 2019-04-02 20:59:27 · 639 阅读 · 0 评论 -
Linux块设备总结(九)向内核中增加通用磁盘操作
前一章我们介绍了通用磁盘结构体struct gendisk的申请操作,本章我们将要介绍申请完通用块结构体之后怎么把通用块结构体增加到内核空间去,并且使内核认识到:哦…这就是我们的磁盘啊! 使用此操作之后我们便可以随心所欲的操作我们的磁盘了。主要函数把通用磁盘结构体struct gendisk增加到内核的操作十分简单就是一个函数:add_disk。先说明一下这个函数的大体功能:add_disk...原创 2019-04-08 20:21:53 · 919 阅读 · 0 评论 -
QEMU+GDB调试linux内核全过程
写最前面将近一个半月没有更新了,终于小小程序猿又回来了,现在开始更新我自己的博客以及博客心得;之前因为在应用层调试代码比较得心应手,导致自己的思路一直限制在应用层的调试逻辑之中,使我吃尽了苦头,苦于少了一套工具来进行内核源码的调试,这样就限制了代码开发的进度。现在好了有了一套得心应手的工具,调试代码不在话下。先声明一下现在使用的各个工具版本,以免忘记: 内核版本:2.6.32.20 gc...原创 2019-03-04 21:49:14 · 4329 阅读 · 0 评论 -
linux内核IDR机制详解(二)
上一篇博文讨论了IDR机制的数据表示以及IDR如何寻找到一个ID,本文主要记录下IDR机制的实际应用。主要涉及如下: 1. 增加一个IDR; 2. 查找一个ID对应的IDR;IDR增加函数主要是增加一个ID到IDR中,主要函数如下:int idr_get_new(struct idr *idp, void *ptr, int *id);int idr_get_new_above(st...原创 2018-12-16 19:53:56 · 2366 阅读 · 0 评论 -
linux内核IDR机制详解(一)
这几天在看Linux内核的IPC命名空间时候看到关于IDR的一些管理性质的东西,刚开始看有些迷茫,深入看下去豁然开朗的感觉,把一些心得输出共勉。我们来看一下什么是IDR?IDR的做作用是什么呢?先来看下IDR的作用:IDR主要实现ID与数据结构的绑定。刚开始看的时候感觉到有点懵,什么叫“ID与数据结构的绑定”?举一个例子大家就会明白了:在IPC通信的时候先要动态获取一个key值或者使用现有的k...原创 2018-12-16 19:31:53 · 3721 阅读 · 0 评论 -
内核模块的初始化module_init
关于模块的初始化网上讲解的有很多,但是有些讲的不是特别全面,有些讲的不是特别的深入,所以我在博客上找了一些可以供参考的,给大家同时也是对于自己的一个强化记忆如下链接:https://www.cnblogs.com/chaozhu/p/6410271.htmlhttps://blog.csdn.net/chrovery/article/details/51088425其中第二条链接更加详细参考...原创 2018-10-19 15:22:11 · 2219 阅读 · 0 评论 -
多个.c文件编译成.ko文件
以两个C文件为例:将本该被分别编译成adc_device.ko和adc_driver.ko的adc_device.c、adc_driver.c编译成一个ko文件!采用方法:第一步、修改C文件1、去掉adc_device.c文件里module_init(xxx)、module_exit(yyy)中xxx、yyy 函数原型的关键字static2、注销adc_device.c文件里module...原创 2018-11-26 01:57:46 · 5884 阅读 · 3 评论 -
内核EXPORT_SYMBOL函数讲解(一)
EXPORT_SYMBOL函数原型:#define EXPORT_SYMBOL(sym) \ __EXPORT_SYMBOL(sym, &amp;amp;amp;quot;&amp;amp;amp;quot;)其中__EXPORT_SYMBOL原型如下:/* For every exported symbol, place a struct in the __ksym.原创 2018-11-26 10:27:07 · 3652 阅读 · 0 评论 -
内核EXPORT_SYMBOL函数讲解(二)
书接上文,在https://blog.csdn.net/weixin_37867857/article/details/84526808这个博客里面写到EXPORT_SYMBOL函数使用就是把导出的符号以符号值+符号的字符串表示的形式表示的。只是讲解了EXPORT_SYMBOL宏的作用就是把导出的符号以符号名称+符号值的形式存储在struct kernel_symbol为数据结构的文件里面,如果文...原创 2018-11-26 11:28:52 · 2430 阅读 · 0 评论 -
设备驱动模型之:kobject,kset,ktype(一)
概述kobject结构是linux驱动程序的基础,也是设备模型中抽象的一部分。如果想要了解驱动程序必须了解kobject结构的具体数据组成以及kobject结构的作用。内核为了兼容各种形形色色的设备,必须对各种设备的共同特性进行抽象。这种抽象在C++中称之为基础类,但是C语言没有继承特性,所以需要把此结构体嵌入到要抽象的结构体之中。例如:字符设备驱动的cdev结构,使用的就是kobject的计...原创 2018-12-02 17:39:34 · 1742 阅读 · 0 评论 -
设备驱动模型之:kobject,kset,ktype(二)
之前https://mp.csdn.net/mdeditor/84722837#这个博客里面介绍了关于kobject,set,ktype三个结构体之间的关系以及作用,可以做为参考,下面介绍一下这三个结构体相关的函数的使用以及作用;static void kobject_init_internal(struct kobject *kobj){ if (!kobj) ...原创 2018-12-02 20:47:45 · 1593 阅读 · 0 评论 -
设备驱动模型之:kobject,kset,ktype(三)
这篇博客里面对于kobject作用做了一个剖析,这篇博客是对于kobject一个实际运用,代码如下:<kobject.c>#include <linux/init.h>#include <linux/module.h>#include <linux/kobject.h>#include <linux/sysfs.h>sta...原创 2018-12-02 21:45:26 · 1560 阅读 · 0 评论 -
设备驱动模型之:kobject,kset,ktype(四)
之前的博客介绍的关于kobject的一些操作和函数的用法,此篇博客介绍关于kset函数的一些操作,顺便把有关于kset的kobject函数的一些用法补齐,这样才会有知识共享的效果;关于kset的操作的函数以及操作的作用有以下: 1. extern void kset_init(struct kset *kset); 关于kset初始化的操作,主要初始化如下: (1)初始化kobject的k...原创 2018-12-02 22:15:52 · 1610 阅读 · 0 评论 -
linux命名空间(namespace)学习(二)
Linux的UTS命名空间在上一篇博客里面介绍了Linux命名空间的使用,本博客更新的博客中更新下关于linuxUTS命名空间的介绍以及使用方式;UTS命名空间,是关于linux主机命名或者内核版本命名的一套命名空间,在此命名空间中用户感知的是一个单独命名的的linux主机名称,注意:仅仅是主机名称,如果没有结合其他命名空间操作的话,用户是感知不到一个单独的主机名称的;一下是我学习linux...原创 2018-12-08 08:29:14 · 2499 阅读 · 0 评论 -
linux命名空间(namespace)学习(三)
LinuxPID命名空间学习通过对于前两节的学习我们知道Linux内核使用task_struct结构来表示和管理进程,这个数据结构里面存放了很多有关于PID如何管理的数据,可以这么说,Linux内核所有有关进程管理的数据结构都和此数据结构有关。该数据结构存放在include/linux/sched.h头文件里,并且这个数据结构比较大,就不一一列举了。实际上一一列举也没有什么意思,因这个数据结构过...原创 2018-12-08 11:09:40 · 9226 阅读 · 1 评论 -
设备驱动模型之:kobject,kset,ktype(六)
本篇博客介绍kset与kobject/kset之间的关系,好了,废话不多说,直接上ktype的结构体:struct kobj_type { void (*release)(struct kobject *kobj); const struct sysfs_ops *sysfs_ops; struct attribute **default_attr...原创 2018-12-05 19:14:11 · 1548 阅读 · 0 评论 -
linux命名空间(namespace)学习(一)
关于linux命名空间网络上有很多是关于docker 的,也有关于linux的专门的linux的namespace介绍的,没有专门介绍Linux命名空间的应用的。所以我想先介绍一下linux命名空间的应用,然后再介绍linux内核对于命名空间的管理方式。好了,废话不多说先上原理吧。命名空间在linux中是实现资源隔离的一种手段,也是轻量级虚拟化的一种手段。可以实现多个用户,也可以实现多个网络设备...原创 2018-12-05 20:42:53 · 5404 阅读 · 1 评论 -
设备驱动模型之:kobject,kset,ktype(五)
在《设备驱动模型之:kobject,kset,ktype(四)》这篇博文里面已经详细介绍了kset的操作以及kset与kobject的关系,下面则是对于这篇博文的一些实际操作:#include &lt;linux/module.h&gt;#include &lt;linux/init.h&gt;#include &lt;linux/kobject.h&gt;#include &lt原创 2018-12-03 21:42:30 · 1512 阅读 · 0 评论 -
Linux内核IPC命名空间 (一)(用户层信号量机制实现)
Linux内核IPC机制在Linux内核中IPC全名称之为进程间通信机制,共分为多种,如下:信号量共享内存消息队列管道信号套接字通信每一种实现都有其独特特性,一下博客中我们会讲解其中的分类,作用以及优缺点。分类:1.分类按照实现机制分类:信号量,共享内存,消息队列是在内核中使用了IPC命名空间实现,由统一的键值管理(之前博客中有讲解过IDR机制管理键值),实现起来比较简...原创 2018-12-19 17:34:45 · 1982 阅读 · 0 评论 -
linux命名空间(namespace)学习(四)
Linux的PID命名空间的学习上一篇博客更新了linux的PID命名空间的数据结构,本节讲一下关于PID命名空间的相关操作的函数。会先从需求开始讲起来,慢慢串联成一个线。回想一下,我们在应用空间中获取到的是一个PID号来管理操作系统的所有PID,但是内核是使用task_struct来管理我们的PID的。现在提出来第一个问题:通过一个PID号怎么索引到task_struct结构的?再回想一下...原创 2018-12-09 11:03:30 · 1901 阅读 · 0 评论 -
Linux内核系统调用原理
最近在研究X86汇编,经过研究发现在Linux中使用汇编调用诸如read/write/open/close etc的系统调用都是如下格式:# this is for testing write.section .dataoutput: .asciz "the test string\n"output_len: .int .-output.section ...原创 2019-07-28 18:09:39 · 487 阅读 · 0 评论