kernel
文章平均质量分 67
unbutun
这个作者很懒,什么都没留下…
展开
-
内核东西(netlink通信 工作队列)
1/31/2009使用sockopt实现内核与用户之间通信使用sockopt实现内核与用户之间通信 1. Linux下的sockopt Linux提供了多种通信方式来实现内核和用户之间的数据通信,基于socket的sockopt是最常用也比较简单易用的一种方式。它的本质和ioctl()很相似,只是ioctl()需要创建新的设备文件,而sockopt只需要创建一个soc转载 2009-11-06 17:01:00 · 770 阅读 · 0 评论 -
运用tasklet机制的简单模块
Linux 2008-05-08 21:18 阅读56 评论1 字号: 大大 中中 小小 看了那么多,该动手了。编写一个模块,在其中加入tasklet。------------------------------------------------------------- /*tasklettest.c*/转载 2009-11-06 18:48:00 · 343 阅读 · 0 评论 -
笔记:中断,下半部
先弄清两个概念,进程上下文和中断上下文处理器总处于以下状态中的一种:1、内核态,运行于进程上下文,内核代表进程运行于内核空间;2、内核态,运行于中断上下文,内核代表硬件运行于内核空间;3、用户态,运行于用户空间。用户空间的应用程序,通过系统调用,进入内核空间。这个时候用户空间的进程要传递很多变量、参数的值给内核,内核态运转载 2009-11-07 18:35:00 · 562 阅读 · 0 评论 -
阻塞式IO(就是多个打开当前的open不返回,直到别人用完close了)
这个事LKMG中的例子: #include /* Were doing kernel work */#include /* Specifically, a module */#include /* Necessary because we use proc fs */#include /* For putting processes to sleep and wa转载 2009-11-08 09:16:00 · 460 阅读 · 0 评论 -
The Linux Kernel Module Programming Guide
http://www.faqs.org/docs/kernel/的11和12再试试。 Linux 内核的WorkQueues API做了修改 WorkQueue机制允许内核代码在晚一点的时间执行。Workqueue通过存在的一个或者多个专门的进程实现,去执行队列工作。因为在进程的上下文汇总执行,因此如果需转载 2009-11-08 11:09:00 · 268 阅读 · 0 评论 -
使用工作队列
•驱动为需要延迟处理的工作建立一work_struct 结构, 该结构即为工作单元, 它还包含一函数指针用来处理具体的延迟工作; •该工作单元被添加到当前CPU 的默认工作线程或自定义工作线程的工作队列中等待处理• 在某一时刻, 工作线程被唤醒, 它将循环处理工作队列中的每一个工作单元。使用系统中的默认工作队列 •首先, 要为需要延迟处理的工作单元建立一个work_st转载 2009-11-07 18:38:00 · 362 阅读 · 0 评论 -
Linux网络接口的源码分析
一.前言 Linux的源码里,网络接口的实现部份是非常值得一读的,通过读源码,不仅对网络协议会有更深的了解,也有助于在网络编程的时候,对应用函数有更精确的了解和把握。 本文把重点放在网络接口程序的总体结构上,希望能作为读源码时一些指导性的文字。 本文以Linux2.4.16内核作为讲解的对象,内核源码可以在http://www.kernel.org上下载。我读源码时参考的是http://lxr转载 2009-11-12 20:12:00 · 616 阅读 · 0 评论 -
向内核注册一个新的协议族
说到注册新的协议族(下文用family描述),我们需要再次描述一下数组net_families,这个数组共有NPROTO(32)项,其每一项都固定分配给一个family使用。比如,AF_INET(因特网协议)固定占用net_families[2],如果net_families[2]== NULL,则表示当前内核没有AF_INET模块,不支持因特网协议。net_families的每一项是一个结构体转载 2009-11-16 15:09:00 · 486 阅读 · 0 评论 -
netlink demo
Linux用户态和内核态之间的交互:读书笔记: 原文:《在 Linux 下用户空间与内核空间数据交换的方式》 链接:http://www.ibm.com/developerworks/cn/linux/l-kerns-usrs/ Netlink 是一种在内核与用户应用间进行双向数据传输的非常好的方式,用户态应用使用标准的 socket转载 2010-01-12 15:02:00 · 743 阅读 · 0 评论 -
kernel socket发消息
#include #include #include #include #include #include #include #include static struct socket *sock;static struct work_struct work;static int udp_sendto(struct socket *sock, voi转载 2010-01-14 17:15:00 · 2355 阅读 · 0 评论 -
2.6.29 print_string代替printk朝当前终端打消息
static void print_string(char *str){ struct tty_struct *my_tty; my_tty = current->signal->tty; if (my_tty != NULL) { ((my_tty->driver->ops)->write) (my_tty,str转载 2009-11-19 12:36:00 · 337 阅读 · 0 评论 -
virt_to_page
宏 virt_to_page 从一个内核虚地址得到该页的描述结构 struct page *。所有物理内存都由一个 memmap 数组来描述。这个宏就是通过计算给定地址的物理页在这个数组中的位置。另外这个文件也定义了一个简单的宏检查一个页是不是合法:VALID_PAGE(page)。如果 page 离 memmap 数组的开始太远以至于超过了最大物理页面应有的距离则是不合法的。 但页表转载 2010-01-16 10:12:00 · 3482 阅读 · 2 评论 -
linux 内存管理(转) 分析得很好,有自己理解的东西
前言内存管理一向是所有操作系统书籍不惜笔墨重点讨论的内容,无论市面上或是网上都充斥着大量涉及内存管理的教材和资料。因此我们这里所要写的Linux内存管理采取必重就轻的策略,从理论层面就不去板门弄斧,贻笑大方了。我们最想做的和可能做到的是以开发者的角度谈谈对内存管理的理解,最终目的是把我们在内核开发中使用内存的经验和对Linux内存管理的认识与大家共享。当然这其中我们也会设计一些诸如段页等内存管转载 2010-01-16 10:22:00 · 2121 阅读 · 0 评论 -
如何在Linux中添加新的系统调用
系统调用是应用程序和操作系统内核之间的功能接口。其主要目的是使得用户可以使用操作系统提供的有关设备管理、输入/输入系统、文件系统和进程控制、通信以及存储管理等方面的功能,而不必了解系统程序的内部结构和有关硬件细节,从而起到减轻用户负担和保护系统以及提高资源利用率的作用。 Linux操作系统作为自由软件的代表,它优良的性能使得它的应用日益广泛,不仅得到专业人士的肯定,而且商业化的应用也是如火如荼转载 2009-11-20 21:49:00 · 257 阅读 · 0 评论 -
Linux Kernel Threads in Device Drivers
PurposeThis examples shows how to create and stop a kernel thread.The driver is implemented as a loadable module. In the init_module() routine five kernel threads are created. This kernel threads sle转载 2009-11-21 09:11:00 · 348 阅读 · 0 评论 -
linux 线程与进程
1.4 线程创建的Linux实现我们知道,Linux的线程实现是在核外进行的,核内提供的是创建进程的接口do_fork()。内核提供了两个系统调用__clone()和fork (),最终都用不同的参数调用do_fork()核内API。当然,要想实现线程,没有核心对多进程(其实是轻量级进程)共享数据段的支持是不行的,因此,do_fork()提供了很多参数,包括CLONE_VM(共享内存空间)、转载 2009-11-21 09:31:00 · 335 阅读 · 0 评论 -
二.Linux 2.4内核中的轻量进程实现
最初的进程定义都包含程序、资源及其执行三部分,其中程序通常指代码,资源在操作系统层面上通常包括内存资源、IO资源、信号处理等部分,而程序的执行通常理解为执行上下文,包括对cpu的占用,后来发展为线程。在线程概念出现以前,为了减小进程切换的开销,操作系统设计者逐渐修正进程的概念,逐渐允许将进程所占有的资源从其主体剥离出来,允许某些进程共享一部分资源,例如文件、信号,数据内存,甚至代码,这就发展转载 2009-11-21 09:38:00 · 530 阅读 · 0 评论 -
fork,vfork和clone底层实现
fork,vfork,clone都是linux的系统调用,用来创建子进程的(确切说vfork创造出来的是线程)。先介绍下进程必须的4要点:a.要有一段程序供该进程运行,就像一场戏剧要有一个剧本一样。该程序是可以被多个进程共享的,多场戏剧用一个剧本一样。b.有起码的私有财产,就是进程专用的系统堆栈空间。c.有“户口”,既操作系统所说的进程控制块,在linux中具体实现是task转载 2009-11-21 10:18:00 · 597 阅读 · 0 评论 -
linux进程管理之进程创建
所谓进程就是程序执行时的一个实例. 它是现代操作系统中一个很重要的抽象,我们从进程的生命周期:创建,执行,消亡来分析一下Linux上的进程管理实现. 一:前言 进程管理结构; 在内核中,每一个进程对应一个task.就是以前所讲的PCB.它的结构如下(include/linux/sched.h): struct task_struct { volatile long state; /*转载 2009-11-21 22:07:00 · 496 阅读 · 0 评论 -
Linux2.6内核进程创建过程分析
使用版本: linux-2.6.22.9Fork的系统调用代码在linux/arch/i386/kernel/process.c中:asmlinkage int sys_fork(struct pt_regs regs){return do_fork(SIGCHLD, regs.esp, ®s, 0, NULL, NULL);}Sys_fork系统调用通过 do_fo转载 2009-11-21 22:09:00 · 483 阅读 · 0 评论 -
Linux2.6内核编程实例 (不错可以做做)
http://www.kerneltravel.net/转载 2009-11-21 22:31:00 · 324 阅读 · 0 评论 -
select poll 从应用层到底层
select()函数的作用 系统调用select和poll的后端实现,用这两个系统调用来查询设备是否可读写,或是否处于某种状态。如果poll为空,则驱动设备会被认为即可读又可写,返回值是一个状态掩码如何使用select()函数? select()函数的接口主要是建立在一种叫fd_set类型的基础上。它(fd_set) 是一组文件描述符(fd)的集合。由于fd转载 2010-01-19 15:53:00 · 646 阅读 · 0 评论 -
内核源码学习:进程创建 解释了(sys_fork sys_clone sys_vfork的区别,也就是vfork pthread_create fork的区别)
系统调用fork()通过sys_fork()进入do_fork()时,其clone_flags为SIGCHLD,也就是说,所有的标志位均为0,所以copy_files(),copy_fs(),copy_sighand() 以及copy_mm()全都真正执行了,这四项资源全都复制了vfork()经过sys_vfork()进入do_fork()时,则其clone_flags为VFO转载 2009-11-21 09:50:00 · 2044 阅读 · 0 评论 -
2.4 kernel API
内核源码学习:Linux 2.4内核API(一)2008-09-18 14:10驱动程序的基本函数 类别函数名功能函数形成参数描述驱动程序入口和出口点module_init驱动程序初始化入口点module_in转载 2009-11-21 10:04:00 · 1090 阅读 · 0 评论 -
进程的创建,执行和消亡。 (clone kernel_thread)
Linux把进程的创建与目标程序的执行分为两步,一步为从已经存在的父进程中复制出子进 程,主要是通过fork(),clone(),vfork()。第二步是目标程序的执行,linux系统提供exe cve()让进程执行以文件形式存在的一个可执行程序的映象。 有个函数例外,kernel_thread(),它看起来不是创建执行两步走,而是通俗意义上所说的 “一揽子”创建执行一起来的,它实际上是对c转载 2009-11-21 10:50:00 · 681 阅读 · 0 评论 -
内核中如何调用用户态下的可执行程序?(更好的一个print_string可以fmt)
Re: 内核中如何调用用户态下的可执行程序? 我想在这里我们有一个误会, 就是这个问题的最初提法是内核如何调用一个应用程序, 而不是一个应用程序如何调用内核线程, 应用程序调用内核已经在前面说的很清楚了。 Re: 内核中如何调用用户态下的可执行程序? 我想其实也不要那么绝对,在内核中request_module()就是 调用用户进程in原创 2009-11-21 22:17:00 · 1151 阅读 · 1 评论 -
# define __user __attribute__((noderef, address_space(1)))
参数to的时候有个__user限定,这个在~/include/linux/compiler.h中有如下定义:# define __user __attribute__((noderef, address_space(1)))表示这是一个用户空间的地址,即其指向的为用户空间的内存大家可能对这个__attribute__感到比较转载 2010-01-21 16:30:00 · 5473 阅读 · 0 评论 -
RedHat8.0下完整的内核编译步骤和说明(2.4 内核开发环境)
1.将内核源码包linux-2.4.20.tar.bz2 copy至/usr/src目录下: #cp linux-2.4.20.tar.bz2 /usr/src #cd /usr/src 2.将指向以前内核版本的symbol link删除 #rm -f linux-2.4 3.用以下命令解开压缩包 #bzip2 -d linux-2.4.20.tar.bz2 #tar -xvf linu转载 2009-11-25 10:40:00 · 391 阅读 · 0 评论 -
读写锁与自旋锁
读写锁实际是一种特殊的自旋锁,它把对共享资源的访问者划分成读者和写者,读者只对共享资源进行读访问,写者则需要对共享资源进行写操作。这种锁相对于自旋锁而言,能提高并发性,因为在多处理器系统中,它允许同时有多个读者来访问共享资源,最大可能的读者数为实际的逻辑CPU数。写者是排他性的,一个读写锁同时只能有一个写者或多个读者(与CPU数相关),但不能同时既有读者又有写者。 在读写锁保持期间也是抢占失效转载 2009-11-26 17:50:00 · 1042 阅读 · 0 评论 -
一个比较完整的协议族添加实例(2.6.29测试通过)
#include #include #include #include #include #include #include #define err(msg) printk("""%s/n", msg)#define AF_DRIVER 30static int priv_family_create(struct net *net,struct so转载 2010-01-20 17:07:00 · 410 阅读 · 0 评论 -
make .PHONY的作用,就是如果磁盘中存在相同名字的目标时使用
这称之为假象目的 (Phony Targets) 假设你的一个项目最后需要产生两个可执行文件。你的主要目标 是产生两个可执行文件,但这两个文件是相互独立的——如果一 个文件需要重建,并不影响另一个。你可以使用“假象目的”来 达到这种效果。一个假象目的跟一个正常的目的几乎是一样的, 只是这个目的文件是不存在的。因此, make 总是会假设转载 2010-01-21 13:37:00 · 624 阅读 · 0 评论 -
简单解读linux的/proc下的statm、maps、memmap 内存信息文件分析
几乎看什么内核漏洞分析之类的文章,第一眼都是被 cat /proc/{pid}/maps产生的一堆奇怪的信息唬住了,都不敢往下看居然没有搜到关于它们的详细介绍,旁边也没有表头什么的解释信息那就我来整理一下吧,方便后人ls /proc 能看到一些数字命名的文件夹,这个就不多说了,什么pid、fd的知识还是容易弄到的拿init开刀,[root@localhost proc]# cat /proc/1转载 2009-11-29 22:04:00 · 2048 阅读 · 0 评论 -
单独交叉编译内核模块
文档介绍:此文档用来说明如何构建自己的内核模块以及如何在DBAU1200开发板上运行内核模块。 在确保DBAU1200开发板上可以正确启动linux内核以及正确挂载根文件系统以后,即可进行下面一步工作,开发内核模块。驱动可以通过内核模块的方式动态的加载到内核中,同时也可以动态的卸载,这种加载驱动的方式可以大大加快驱动的开发周期,而不必要每次修改驱动都要重新编译一次内核。 一转载 2009-11-30 15:16:00 · 2216 阅读 · 0 评论 -
通过命令行给自己写的编译进内核的模块传参
有时候还是需要把自己写的驱动模块添加到内核中去编译成一个整体,这样很容易YY,我靠,我也能在内核目录里加代码了首先选一个典型的例子,一个外部驱动模块,需要传入两个参数,然后通过cat /proc/result 查看他们的和/*test_inline_driver.c这是一个例子,把模块参数val1+ val2的和通过 cat /proc/result 显示出来*/#include #includ转载 2009-11-29 21:56:00 · 621 阅读 · 0 评论 -
内核驱动模块如何在/dev文件下自动创建设备文件(不使用mknod)
每次测试自己写的驱动模块都要自己mknod设备文件,总觉得是一种不好的行为而且要自己指定主设备号和次设备号,就是没有书上说sysfs、udev什么程序员不需关心设备号之类的优点了内核TMD经常变,一个2.6.25上还好好的驱动,跑到2.6.29上就不能编译通过了,妈的,可以理解为什么Linux驱动工程师会高薪了,好,我忍了这里的方法只能保证倒2.6.31,再往后就未知了,所以死读书是不行的要融会转载 2009-11-29 22:06:00 · 682 阅读 · 0 评论 -
公平调度(fair-share scheduling)的进程调度算法
公平调度(fair-share scheduling)的进程调度算法:一、公平分享的调度策略 Linux 的调度算法是相对独立的一个模块,而且较容易理解。因此很多系统高手都爱对调度算法做改进。但是可以说调度器是一个非常神秘,难以捉摸的精灵。可能通过改变一个关键参数你就可以大大提高系统的效率。 对于一般进程,CPU的使用时间都是系统平均分配给每一个进程的,因此这种公平转载 2009-12-04 14:11:00 · 2902 阅读 · 0 评论 -
kernel_thread函数简单分析
kernel_thread函数的作用是产生一个新的线程内核线程实际上就是一个共享父进程地址空间的进程,它有自己的系统堆栈.内核线程和进程都是通过do_fork()函数来产生的,系统中规定的最大进程数与线程数由fork_init来决定:[/arch/kernel/process.c/fork_init()]void __init fork_init(unsigned long mempa转载 2009-12-06 16:13:00 · 385 阅读 · 0 评论 -
kernel_thread 的使用
可以在非内核线程中调用kernel_thread, 但这样创建的线程必须在自己调用daemonize(...)来释放资源, 成为真正的内核线程。 #include #include static int noop(void *dummy) { int i = 0; daemonize("mythread"); while(i++ printk("current->mm = %p/n", cur转载 2009-12-06 16:16:00 · 889 阅读 · 0 评论 -
说说内核线程(kthread_create 和 kernel_thread的区别就在于前者多加了个链表)
貌似很神秘的一个东西,我们就来"强行"揭开她的面纱......说实话,我们不是第一次见她了!你说是不?(什么?不是?今天我们DOTA校队去和人家比赛,正因为没看上郁闷着呢,你还来给我添点油是吧...)话说曾经我们在看serio.c的时候,遇到了这么一个模糊的面孔(说模糊是因为我们没对她过多深入): serio_task = kthread_run(serio_thread,转载 2009-12-07 15:27:00 · 6326 阅读 · 1 评论 -
关于内核线程(kernel_thread)
唐宇 carino@mail.ustc.edu.cn 我们知道Linux内核使用内核线程来将内核分成几个功能模块, 像kswapd,kflushd等,系统中的init进程也是由idle进程调用 kernel_thread()来实现产生的. 我们先来看看内核线程的实现,再来分析内核线程的性质. int kernel_thread(int(*fn)(void*arg),void *arg,in转载 2009-12-06 16:14:00 · 501 阅读 · 0 评论