![](https://img-blog.csdnimg.cn/20201014180756923.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
linux内核驱动
文章平均质量分 60
小春222
这个作者很懒,什么都没留下…
展开
-
gcc中的内嵌汇编语言
gcc中的内嵌汇编语言(Intel i386平台) 一.声明 虽然Linux的核心代码大部分是用C语言编写的,但是不可避免的其中 还是有一部分是用汇编语言写成的。有些汇编语言代码是直接写在汇 编源程序中的,特别是Linux的启动代码部分;还有一些则是利用gcc 的内嵌汇编语言嵌在C语言程序中的。这篇文章简单介绍了gcc中的内 嵌式汇编语言,主要想帮助那些才开始阅读Linux核心代码的朋友原创 2006-08-29 16:47:00 · 3058 阅读 · 1 评论 -
linux汇编 常见问题 (zz)
http://firstdot.spaces.live.com/1.gcc嵌入汇编(1). 在gcc嵌入汇编中输入输出使用相同的寄存器?static void * __memcpy(void * to, const void * from, size_t n){ int d0,d1,d2; __asm__ __volatile__( "rep;movsl/n/t" "testb $2原创 2006-08-29 16:48:00 · 1212 阅读 · 0 评论 -
linux系统内核空间保护
/* Arrange for userspace references to be interpreted as kernel * pointers. That way we can pass a kernel pointer to a routine * that expects a __user pointer and it will work原创 2006-08-29 16:46:00 · 4595 阅读 · 1 评论 -
read_lock()和write_lock()
read_lock()和write_lock()的过程描述如下: 锁变量的初值为RW_LOCK_UNLOCKED(0x01000000),锁变量为正时为未锁状态,反之为上锁状态。 read_lock()对锁变量减1,如果结果为负,则说明已被某个write_lock()上锁。然后read_lock()对锁变量加1,释 放read_lock状态,接着等待锁变量的值变为1;一旦锁变量变为1,read_原创 2006-08-29 16:38:00 · 15132 阅读 · 1 评论 -
spinlock的设计和实现
http://www.linuxforum.net/forum/gshowflat.php?Cat=&Board=linuxK&Number=263448&page=4&view=collapsed&sb=5&o=all&fpart= 在Linux的内核中,spin lock用在多处理器环境中。当一个CPU访问一个临界资源 (critical section)的时候,需要预先取得sp原创 2006-08-29 16:30:00 · 2467 阅读 · 0 评论 -
Linux2.4.18内核下的系统调用劫持 [转]
注:本文提到的方法和技巧,如有兴趣请参考后面提到的两篇参考文章,虽然比较老了,但是对于本文内容的实现有很大的参考价值。因为篇幅关系,没有列出完整代码,但是核心代码已经全部给出。Linux 现在使用是越来越多了,因此Linux的安全问题现在也慢慢为更多人所关注。Rootkit是攻击者用来隐藏踪迹和保留root访问权限的工具集,在这些 工具当中,基于LKM的rootkit尤其受到关注。这些rootk原创 2006-08-29 16:29:00 · 950 阅读 · 0 评论 -
printk ##
"#" 代表和一个字符串相连接 "##" 代表和一个符号连接,符号可以是变量,或另一个宏符号。 #define printk(format,arg...) printf(format,#arg)prinfk("hello : %d %d %d",1,2,3) gcc -E 是 printf("hehe%d %d %d/n","1,2,3");prinfk("he原创 2006-11-07 12:11:00 · 2651 阅读 · 2 评论 -
如何在Linux下增加Swap (转)
1.查看系统Swap空间使用[root@jumper usr]# free total used free shared buffers cachedMem: 513980 493640 20340 0 143808 271780-/+ buffers/cac原创 2006-11-07 10:28:00 · 2190 阅读 · 0 评论 -
netlink (转)
Netlink 是一种特殊的 socket,它是 Linux 所特有的,类似于 BSD 中的AF_ROUTE 但又远比它的功能强大,目前在最新的 Linux 内核(2.6.14)中使用netlink 进行应用与内核通信的应用很多,包括:路由 daemon(NETLINK_ROUTE),1-wire 子系统(NETLINK_W1),用户态 socket 协议(NETLINK_USERSOCK),防火原创 2006-11-06 00:13:00 · 2870 阅读 · 0 评论 -
(转载)使用kgdb调试linux内核及内核模块
使用kgdb调试linux内核及内核模块创建时间:2005-09-09文章属性:原创文章提交:xcspy (xcspy.com_at_gmail.com)作者:xcspy成员 ladybugE-mail:xcspy.com@gmail.com主页:www.xcspy.com1. 几种内核调试工具比较kdb:只能在汇编代码级进行调试; 优点是不需要两台机器进行调试。g原创 2006-10-30 16:07:00 · 2307 阅读 · 0 评论 -
linux汇编 __copy_user宏(zz)
该文档主要是将以下两篇文档的内容copy到了一起:(1)"利用异常表处理 Linux 内核态缺页异常" http://www-128.ibm.com/developerworks/cn/linux/kernel/l-page/index.html;(2)"对用户/内核空间数据复制的实现和自己的理解"www.linuxforum.net。 用户进程的地原创 2006-08-29 16:49:00 · 2060 阅读 · 0 评论 -
2.4 2.6块设备区别---mmc
2。4里是通过2个全局变量来设置每个设备信息int blk_size[][];该数组通过主设备号和次设备号索引。它描述了每个设备的大小,以千字节为单位。如果 blk_size[major] 为 NULL,则不会检查该设备的大小(也就是说,内核可以访问超过设备尾部的数据)。int blksize_size[][];该 数组包含了每个设备所使用的块大小,以字节为单位。和前述数组一样,该二维数组也通过原创 2006-08-29 16:49:00 · 990 阅读 · 0 评论 -
关中断,睡眠
睡眠函数里 spin_lock_irqsave(&q->lock,flags); 先关了中断然后就 schedule()了, schedule()里是打开所有中断void interruptible_sleep_on(wait_queue_head_t *q){ unsigned long flags; wait_queue_t wait;原创 2006-08-29 16:50:00 · 1164 阅读 · 0 评论 -
嵌入式系统中的CACHE问题
嵌入式系统中的CACHE问题随着社会的发展、人们生活水平的提高,人们 对嵌入式计算机应用的要求也越来越高。因此,对嵌入式系统的性能要求也越来越高。明显体现在嵌入式系统的CPU速度的不断提高上。但问题也随之而来,嵌入 式CPU的主频不断地提高,一方面加强了CPU的处理能力,另一方面,在速度上造成了与慢速的系统存储器极不相配的情况,从而影响了整个系统的性能。为了解决这个问题,引入了CAC原创 2006-08-29 16:44:00 · 1245 阅读 · 0 评论 -
volatile的作用
volatile的本意是“易变的” 由于访问寄存器的速度要快过RAM,所以编译器一般都会作减少存取外部RAM的优化。比如:static int i=0;int main(void){...while (1){if (i) dosomething();}}/* Interrupt service routine. */void ISR_2(void){i=1;}程序的本意是原创 2006-08-29 16:32:00 · 864 阅读 · 0 评论 -
console tty
tty是一类char设备的通称,它们有相同的特性,比如对^C的处理,驱动使用tty_register_driver注册一个tty。 /dev/console是一个虚拟的tty,它映射到真正的tty上,如何映射等会再说。 console 有多种含义,这里特指printk输出的设备,驱动使用register_console注册一个console。 最后一个注册的conole称为prefer cons原创 2006-08-29 16:30:00 · 3019 阅读 · 0 评论 -
关于零长度数组
struct test { int inode; char name[0]; }; 这样定义后sizeof(struct test) 一直是4, name这个变量要是赋值的话, 其地址比test高4字节的地方 ,所以这样就方便结构体的使用者灵活使用,一般每次alloc多一点空间留给私有数据,name放到最后,name地址比结构体最高地址高4字节,所以name就指向结构体后面的原创 2006-08-29 16:47:00 · 1186 阅读 · 1 评论 -
Linux下把kernel空间映射到用户进程空间
在mmap函数里,使用remap_pfn_range函数。代码如下。注意要设置一下vma->vm_pgoff为你要map的io空间的物理地址对应的页。arm IO/ 内存统一编址 所以#define io_remap_pfn_range(vma,from,pfn,size,prot) / remap_pfn_range(vma, from, pfn, size,原创 2006-08-29 16:41:00 · 4431 阅读 · 0 评论 -
ifconfig promisc
ifconfig promisc调用 ioctl(skfd, SIOCSIFFLAGS, &ifr)||net/core/dev.c net/core/dev_mcast.cint dev_ioctl(unsigned int cmd, void __user *arg)||int dev_change_flags(struct net_device原创 2006-08-29 16:35:00 · 2356 阅读 · 0 评论 -
atomic_inc
atomic_inc(&v)对变量v用锁定总线的单指令进行不可分解的"原子"级增量操作,避免v的值由于中断或多处理器同时操作造成不确定状态。X86 用LOCK 指令实现, 不懂ARM代码如下, ldrex : ARMv6_Architecture.pdf 解释如下 还是不大明白• LDREX{} , []This performs a load, the原创 2006-08-29 16:34:00 · 8007 阅读 · 0 评论 -
hotplug firmware
Linux 2.6.x hotplug 和firmware 功能 因为工作中需要,我做了一些了解,因此写了一点心得。所以这篇文章并不是一个完整的教材。 1.: 一些概念 hotplug 它是系统在安装即插即用模块常用的工具 例如:PCI,USB,PCMCIA. 大概流程如下: (1) Linux 系统启动后,一切都在工作中;原创 2006-08-29 16:51:00 · 3191 阅读 · 0 评论 -
xwindows 在非fb,用pci方式访问显卡
http://www.linuxforum.net/forum/showflat.php?Cat=&Board=linuxK&Number=610779http://www.linuxforum.net/forum/showflat.php?Cat=&Board=kylix&Number=618721If neither the driver for your card nor the VESA原创 2006-08-29 16:50:00 · 1116 阅读 · 0 评论 -
jiffies volatile
>>>问题: 在/kernel/sched.c中有一句: ... (*(unsigned long *)&jiffies)++ 这么理解妥否: 取jiffies地址,强行转换为unsigned long型的指针,此地址指向的目标变量进行++操作。 为何要这样绕圈子,不就是jiffies++操作吗? >>>回应: by 硅谷农民 on Friday June 07 2002 @ 02:08PM ED转载 2006-10-30 13:44:00 · 1472 阅读 · 0 评论 -
list_entry 等
typedef struct guhuo{int a;char c;int b;}zqy;zqy *pp;typeof(pp->b) a; OK#define typez(type,mem) typeof(type->mem)typez(pp,b) OK#define list_entry(ptr, type, member)原创 2006-09-30 15:17:00 · 1629 阅读 · 0 评论 -
访问 other process | 用户 空间
往任意USER PROCESS的内存读写kernel/ptrace.c :/* * Access another process address space. * Source/target buffer must be kernel space, * Do not walk the page table directly, use get_user_pages */int access_pr原创 2006-09-04 13:35:00 · 1716 阅读 · 0 评论 -
copy_from_user为什么会休眠
在__copy_frome_user内嵌汇编来拷贝内存访问不对会do_page_fault , 这时会find_vma 之类的有锁的, 就会睡眠kmalloc 同理原创 2006-08-29 16:43:00 · 1440 阅读 · 0 评论 -
slab着色
看过ULK,LDD和kernel代码后对内存管理的理解加深了不少,但还有一点一直不甚明了,SLAB里面的着色(color)一直不知道什么原理. 关键对CPU CACHE 理解不对. 今天仔细搜了搜终于明白一点儿: 比如cache line 32 字节, 字节0-31一次从内存写入/读取, 字节32-63一次从内存写入/读取….. 另外cache对应到内存位置不是任意的Ca原创 2006-08-29 16:41:00 · 8318 阅读 · 4 评论 -
(转载)Linux内核网络设备操作部分阅读笔记
原文出处:http://tb.blog.csdn.net/TrackBack.aspx?PostId=589444一、网络设备的初始化网络设备初始化就是调用具有__init 前缀的net_dev_init函数完成的,网络设备初始化包含两个部分(在linux内核2.4办源代码分析大全一书的第550页有详细说明),就是:在系统初始化期间对系统已知的网络设备进行初始化过程,也就是,我们在编译内核时原创 2006-08-29 16:40:00 · 1132 阅读 · 0 评论 -
内核中的互斥之我见
关于内核中spinlock的一些个人理解由于2.6内核可以抢占,应该在驱动程序中使用 preempt_disable() 和 preempt_enable(),从而保护代码段不被抢占(禁止 IRQ 同时也就隐式地禁止了抢占)。在这里,我主要把自己对内核中spinlock的一些理解写出来,并不是要告诉大家什么(因为我对我所说的也不能确定),而是希望大家对我的这些理解对的地方给我肯定,错原创 2006-08-29 16:39:00 · 1360 阅读 · 0 评论 -
软中断
软中断 软中断softirq softirq简介 提出softirq的机制的目的和老版本的底半部分的目的是一致的,都是将某个中断处理的一部分任务延迟到后面去执行。 Linux内核中一共可以有32个softirq,每个softirq实际上就是指向一个函数。当内核执行softirq(do_softirq),就对这32个softirq进行轮询: (1)是否该softirq被定义了,并原创 2006-08-29 16:39:00 · 1589 阅读 · 0 评论 -
barrier(wmb,mb,rmb)和cache coherence
http://www.linuxforum.net/forum/gshowflat.php?Cat=&Board=linuxK&Number=428239&page=5&view=collapsed&sb=5&o=all&fpart=注: 这里的barrier 指的是wmb, rmb, mb. 一 直找不到合适的资料说明barrier和 Cache coherence 之间的关系.原创 2006-08-29 16:32:00 · 5443 阅读 · 0 评论 -
ip_tables.h分析
http://www.linuxforum.net/forum/gshowflat.php?Cat=&Board=linuxK&Number=112607&page=5&view=collapsed&sb=5&o=all&fpart=1 /* 2 * 25-Jul-1998 Major changes to allow for ip chain table 3 * 4 * 3-Jan-2000原创 2006-08-29 16:31:00 · 1222 阅读 · 0 评论 -
kgdb调试kernel或者driver module
Who may read this document? =========================== 1. People who familiar with gdb but not never use kgdb 2. People who like to debug kernel or driver module using the gdb way. Why to Using KGDB原创 2006-08-29 16:31:00 · 1275 阅读 · 0 评论 -
使用 Kprobes 调试内核(zz)
http://www-128.ibm.com/developerworks/cn/linux/l-kprobes.html使用 printk 收集 Linux ™ 内核的调试信息是一个众所周知的方法 —— 而使用了 Kprobes,不需要经常重新引导和重新编译内核就可以完成这一任务。Kprobes 与 2.6 内核结合起来提供了一个动态插入 printks 的轻量级、无干扰而且强大的装置。记录原创 2006-08-30 13:24:00 · 1984 阅读 · 0 评论 -
local_irq_save
include/asm-arm/system.h #define local_irq_save(x) / ({ / __asm__ __volatile__(原创 2006-08-30 17:21:00 · 5712 阅读 · 1 评论 -
PTR_ERR
内核里返回指针的话, 把-1 ~ -1000 转换为指针 作为错误码内核中许多函数用返回值[-1L,-1000L]代表错误,这部分空间没有被影射.有些地方的返回值类型是指针,那么 如果没有检测返回值就访问该指针的话,那么就发生内核缺页异常,非法访问被捕获.内核专门有两个函数PTR_ERR(),IS_ERR()做这种检测. vfs_read//generic_file_read//sys_rea原创 2006-09-01 10:49:00 · 3133 阅读 · 0 评论 -
I/O端口 zz
关键词:设备管理、驱动程序、I/O端口、资源 申明:这份文档是按照自由软件开放源代码的精神发布的,任何人可以免费获得、使用和重新发布,但是你没有限制别人重新发布你发布内容的权利。发布本文的目的是希望它能对读者有用,但没有任何担保,甚至没有适合特定目的的隐含的担保。更详细的情况请参阅GNU通用公共许可证(GPL),以及GNU自由文档协议(GFDL)。 几乎每一种外设都是通过读写设备原创 2006-09-30 14:53:00 · 1481 阅读 · 0 评论 -
同步与异步通讯
异步通信异步通信以字节为单位,长度为5至8位。异步通信的数据格式字符在异步传输中的格式:起始位+数据位+校验位+停止位常用格式a、8N1:1bit起始位+8bit数据位+无校验位+1bit停止位b、7E1:1bit起始位+7bit数据位+1位偶校验位+1bit停止位 1个字符通常用10bit代表。数据格式在通信软件(如Windows95中的“超级终端”)中设置。 同步通信同步通信以多字节组成原创 2006-09-30 12:44:00 · 2866 阅读 · 1 评论 -
揭开Linux的Swap之谜 zz
ULK :对换仅适用于以下类型的页1 属于进程的匿名线型区 (比如 用户态堆栈)的页2 属于进程的石油内存映射修改过的页3 属于IPC共享线型区的页其他类型的或者被内核使用,或者用来映射磁盘上的文件.1 对换忽略这些页,可以简化内核的设计2 这些页最好的对换区就是文件本身Swap的原理是一个较复杂的问题,需要大量的篇幅来说明。在这里只作简单的介绍,在以后的文章中将和大家详细讨论Swap实现的细节原创 2006-09-30 12:33:00 · 1221 阅读 · 0 评论 -
GCC内嵌汇编简介- - zz
在内嵌汇编中,可以将C语言表达式指定为汇编指令的操作数,而且不用去管如何将C语言表达式的值读入哪个寄存器,以及如何将计算结果写回C 变量,你只要告诉程序中C语言表达式与汇编指令操作数之间的对应关系即可, GCC会自动插入代码完成必要的操作。 1、简单的内嵌汇编 例: __asm__ _原创 2006-09-27 18:35:00 · 1344 阅读 · 0 评论