
linux内核
yldfree
有技术就是一切
展开
-
kobject的使用基本框架
下面是伪代码 可以根据此框架写自己的kobject属性struct myobject{ int a; int b; struct kobject object;}g_object;struct myattr{ struct attribute attr; ssize_t (*show)(struct myobject *myobj,char *); ...原创 2019-10-18 09:48:47 · 192 阅读 · 0 评论 -
linux rcu锁的使用
原创 2018-11-14 13:26:32 · 3019 阅读 · 0 评论 -
linux 字符设备框架使用 初级
#include <linux/module.h>#include <linux/init.h>#include <linux/kernel.h>#include <linux/types.h>#include <linux/cdev.h>#include <linux/fs.h>#include <lin...原创 2018-11-14 17:55:16 · 1622 阅读 · 0 评论 -
浅谈Linux PCI设备驱动
转自 http://www.uml.org.cn/embeded/201205152.asp 浅谈Linux PCI设备驱动(一) 要弄清楚Linux PCI设备驱动,首先要明白,所谓的Linux PCI设备驱动实际包括Linux PCI设备驱动和设备本身驱动两部分。不知道读者理不理解这句话,本人觉得这句话很重要,对于PCI、USB这样的驱动来说,必须要理解这...转载 2018-11-22 14:00:24 · 2410 阅读 · 0 评论 -
各种网络设备分配创建net_device{}流程
接下来分析alloc_netdev_mq() /*@sizeof_priv 私有数据大小,驱动可以使用netdev_priv()得到该私有数据@name:网络接口的名字@setup:驱动程序负责实现此函数,实现的此函数用于初始化net_device中的一些成员@queue_count:网络设备的发送队列net_device数据结构的内存空间+私有数据内存空间+设备发送队列的内存...原创 2018-11-22 16:57:41 · 2135 阅读 · 0 评论 -
linux pid
转发自https://www.cnblogs.com/hazir/p/linux_kernel_pid.html进程ID类型要想了解内核如何来组织和管理进程ID,先要知道进程ID的类型:PID:这是 Linux 中在其命名空间中唯一标识进程而分配给它的一个号码,称做进程ID号,简称PID。在使用 fork 或 clone 系统调用时产生的进程均会由内核分配一个新的唯一的PID值。 T...转载 2018-11-30 09:45:48 · 11668 阅读 · 1 评论 -
linux 在内核模块调用应用层程序
内核模块代码#include <linux/module.h>#include <linux/init.h>#include <linux/kernel.h>#include <linux/types.h>#include <linux/kmod.h>//需要调用的应用层程序#define APPNAME "/sbin...原创 2018-11-30 18:15:52 · 3368 阅读 · 0 评论 -
netdev_wait_allrefs()流程
//此函数会等待net_device{}中的refcnt减值为0 才会退出static void netdev_wait_allrefs(struct net_device *dev){ unsigned long rebroadcast_time, warning_time; rebroadcast_time = warning_time = jiffies; while (...原创 2018-12-05 10:33:39 · 2205 阅读 · 0 评论 -
percpu基础知识
(1)将.data.percpu数据段中的数据复制到每个cpu的percpu地址start_kernel()->setup_per_cpu_areas()复制后的结果图如下:代码如下:void __init setup_per_cpu_areas(void){ unsigned long size, i; char *ptr; //取得cpu数量 unsig...原创 2018-12-14 11:57:55 · 2141 阅读 · 0 评论 -
内核流程简图
(1)中断(2) takslet流程图原创 2018-12-11 14:55:45 · 1086 阅读 · 0 评论 -
内核模块在/sys/module/xx/产生自己的配置文件
下面代码会产生/sys/module/xxx/security/testhello 配置文件#include <linux/kmod.h>#include <linux/module.h>#include <linux/init.h>#include <linux/kernel.h>#include <linux/kobject...原创 2019-03-25 16:46:03 · 1265 阅读 · 0 评论 -
create_workqueue和create_singlethread_workqueue【转】
本文转载自:http://bgutech.blog.163.com/blog/static/18261124320116181119889/1. 什么是workqueueLinux中的Workqueue机制就是为了简化内核线程的创建。通过调用workqueue的接口就能创建内核线程。并且可以根据当前系统CPU的个数创建线程的数量,使得线程处理的事务能够并行化。workqueue是内核中实现简...转载 2019-03-26 11:04:59 · 311 阅读 · 0 评论 -
2.4内核动态模块基本使用方式
module.c#define MODULE //一定要定义此宏#include <linux/kmod.h>#include <linux/module.h>#include <linux/init.h>#include <linux/kernel.h>static int __init hello_init(void)...原创 2019-06-28 14:04:31 · 204 阅读 · 0 评论 -
内核内存相关图
用户空间内存布局(经典 与新布局方式)原创 2019-07-11 10:54:53 · 120 阅读 · 0 评论 -
释放页__free_one_page()
/*释放到指定的伙伴系统类型链表*/ static inline void __free_one_page(struct page *page, struct zone *zone, unsigned int order, int migrat...原创 2019-07-16 11:08:41 · 1033 阅读 · 2 评论 -
linux内核函数伙伴系统部分expand()
先看个分配图在看下面的函数static inline void expand(struct zone *zone, //内存区域 struct page *page, //页块首页地址 int low, //需要的页阶 ...原创 2019-07-12 11:55:44 · 406 阅读 · 0 评论 -
linux内核 hash表的基本使用
栗子如下:#include <stdio.h>#include <stdlib.h>#include <string.h>#include "hlist.h"typedef struct list_test{ struct hlist_node hnode; int ap;}HlistTest;//计算hash值stru...原创 2018-11-13 15:24:18 · 4964 阅读 · 2 评论 -
工作对列与tasklet
转载https://www.cnblogs.com/oceanding/p/7595738.htmllinux工作队列转载http://bgutech.blog.163.com/blog/static/18261124320116181119889/1. 什么是workqueue Linux中的Workqueue机制就是为了简化内核线程的创建。通过调用workqueue的...转载 2018-10-29 11:14:17 · 1745 阅读 · 0 评论 -
netfilter nf_ct_get获得连接状态返回为空的问题
struct nf_conn *ct = NULL;enum ip_conntrack_info ctinfo;ct = nf_ct_get(skb,&ctinfo);获得连接状态.但ct返回去的结果为空,这怎么回事,只能查找内核看看啥原因,这个首先要看看ct这个东西是什么时候创建的了,经过看内核,发现这个结构体是在ipv4_conntrack_in和ipv4_conntrack_loca...原创 2018-02-09 15:07:13 · 3068 阅读 · 0 评论 -
内核 DEBUG日志控制
在开发过程中,无可避免的会遇到printk打印信息的输出,在写新功能或BUG调试的时候我们想看到更多的调试信息,但版本发出后,我们想看到尽可能少的输出信息,那么怎么控制这个呢。。 下面的方法可以对输出进行控制: #undefPRINTD#undefPRINTDD#ifdefFREE_DEBUGG#definePRINTDD(nu,fmt,arg...) printk(KERN_DEBUG"free...原创 2018-03-07 11:59:52 · 2146 阅读 · 0 评论 -
手把手操作系统之工具篇
开发前的准备工具篇参考的书籍《30天自制操作系统》 《linux内核设计的艺术》今天是第一篇,此篇主要是准备好开发用的工具,工具有虚拟机我用的VMware10 至于虚拟机的安装 网上有一大批,我们的重点就不在这耽误了,好了,小狼就任务你已经准备好这个虚拟机了,打开如下 大家可以看到上面有几个标签,刚安装的虚拟机是没这几个标签的,很明显这是小狼我已经装好的虚拟linux系统了,我们将用的版本...原创 2018-03-10 18:02:06 · 1032 阅读 · 0 评论 -
手把手操作系统之 int10
AH:存放的功能号,不同的功能会使用不同的寄存器来保存参数 这个就要看具体的手册了,下面列出几个基本应用的例子,更详细的其他使用请参考手册(1) AH=0x01 此功能设置光标显示的行数(在当前文本行)参数CH传递光标顶部在哪行参数CL传递光标的底部在哪行例子如下:当AH=1, CH=0, CL=10 此设置的行数 只能在本行文本的高度之内(2) AH=0x02 设置光...原创 2018-03-11 00:28:20 · 1347 阅读 · 0 评论 -
手把手操作系统之 BIOS int13读取软盘软盘的大小计算
软盘的大小计算软盘有2个面,一个面上有80个柱面,一个柱面上有18个扇区,一个扇区有512字节软盘大小=2*80*18*512 = 1474560字节总共是1440KB机器加载第一扇区后的图从上面可以看到现在的内存的使用情况,根据已知的内存使用我们决定接下来的磁盘数据放到内存的什么地方,《30天自制操作系统》上将接下来第二扇区的内荣放到了08200-083FF的地方,而linux系统将07C00处...原创 2018-03-11 11:02:52 · 1980 阅读 · 0 评论 -
手把手操作系统之接着读软盘
上一节我们已经读取C0H0S2的数据到08200-083FF的位置了,接下来我们读取10个柱面的内容到内存中….读取10个柱面到内存中代码如下:上面就是完整的代码了,,, 在内存中的我们的代码量为 10(柱面)*2(磁头)*18(扇区)*512(字节)= 184320字节 180Kb的字节内存现在的分布如下:...原创 2018-03-11 12:01:41 · 1561 阅读 · 0 评论 -
linux kdump crash
我的设备环境如下:[root@localhost ~]# uname -r2.6.32-431.el6.i686[root@localhost ~]# cat /etc/redhat-release CentOS release 6.5 (Final)(1) 先我们将crash安装上,这个用yum install 就能安装[root@localhost ~]# yum install crash[...原创 2018-03-04 17:35:50 · 2090 阅读 · 0 评论 -
手把手操作系统之跳转到setup接着执行代码
在上面我们将2扇区的内容已经加载到了0x08200的内存中,其实在第二扇区我们存放我们的setup代码,我们会跳转到0x08200处执行我们的代码, 接下来我们就写我们的setup,并将setup写到我们的boot.img中 ...好了开始工作..添加setup.s很简单调用了int 10h的0x0a号功能,是什么来着 想想,对了 就是显示字符,具体的用法,请参考前面的文章, setup.s...原创 2018-03-11 18:13:39 · 1903 阅读 · 0 评论 -
手把手操作系统之键盘 显示器模式
显示器模式设置我们在这里会调用int 10h的0号功能不熟悉的可以看上面的文章对int 10h的介绍设置完之后对显示器模式进行保存当显示器使用al=0x13模式的时候,其显卡内存在0xa0000-0xaffff 64kb这个大小的内存中读取键盘的状态AH=0:从键盘读入ASCII字符,放在AL中。AH=1:测试有无键被按下。ZF=0,表示按过任意键,并在AL中获得该键的ASCII码。ZF=1,未按...原创 2018-03-11 19:53:58 · 1675 阅读 · 0 评论 -
从bprm结构获得程序的参数
<内核3.10.x>#include <linux/highmem.h>#include <linux/mm.h>static void acct_arg_size(struct linux_binprm *bprm, unsigned long pages){ struct mm_struct *mm = current->mm; ...原创 2018-04-20 16:33:55 · 3006 阅读 · 0 评论 -
linux内核基础--通知链
/******************************init.c**********************/#include <linux/module.h>#include <linux/init.h>#include <linux/kernel.h>#include <linux/notifier.h>//初始化通知链头RAW_NOT...原创 2018-06-11 11:43:15 · 1633 阅读 · 0 评论 -
利用内核函数找出所有的内核导出符号 不用自己通过/proc/kallsyms来查询符号地址
#include <linux/module.h>#include <linux/init.h>#include <linux/kernel.h>#include <linux/syscalls.h>#include <linux/kallsyms.h>int kallsymcall(void *data , const char *na...原创 2018-06-11 11:53:35 · 2962 阅读 · 0 评论 -
进程状态
#define TASK_RUNNING 0 //正在运行或处于就绪状态 两种状态在linux中都为TASK_RUNNING#define TASK_INTERRUPTIBLE 1//处于等待队伍中,等待资源有效时唤醒,可被中断唤醒#define TASK_UNINTERRUPTIBLE 2//处于等待队伍中,等待资源有效时唤醒 不可被中断唤醒#define __TASK_STOPPED 4/...原创 2018-07-12 00:32:22 · 1876 阅读 · 0 评论 -
__wake_up唤醒等待队列中的进程
等待队列头struct __wait_queue_head { spinlock_t lock; //自旋锁用于保护自身资源(task_list链表)不被多个进程同时访问 struct list_head task_list;//双向循环链表通过此字段连接成等待对列链表};typedef struct __wait_queue_head wait_queue_hea...原创 2018-07-12 16:59:37 · 6537 阅读 · 0 评论 -
从内核获得进程的参数
#include <linux/module.h>#include <linux/init.h>#include <linux/kernel.h>#include <linux/mount.h>#include <linux/fs.h>#include <linux/sched.h>static int __i...原创 2018-08-08 18:35:43 · 2636 阅读 · 0 评论 -
内核模块参数传递
(1)Linux 版本: 2.6.32-431.el6.x86_64(2)需要头文件: #include(3)涉及的宏介绍普通参数需要的宏: module_param(name,type,perm)数组参数需要的宏:module_param_array(name,type,nump,perm)name: 参数名字type:参数类型, 如下bool : 布尔型inbo原创 2018-01-24 15:06:42 · 2155 阅读 · 0 评论