![](https://img-blog.csdnimg.cn/20201014180756930.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
【Linux内核】
文章平均质量分 69
stan_linux
爱linux,爱arm,爱电子,爱创新
展开
-
内核调试函数printk()
内核模式下系统信息输出函数printk() 与用户模式下printf()函数在输出内容上是有区别的,第一:内核在切换模式时不保存处理器的浮点状态,因此printk()并不支持浮点数运算;第二:printk()可以指定一个记录级别,内核根据这个级别来判断是否在终端上打印消息,而printf()则不要。内核通过 printk() 输出的信息具有日志级别,日志级别是通过在 printk() 输出的字原创 2013-12-23 22:57:28 · 1017 阅读 · 0 评论 -
linux中GFP_KERNEL
GFP_KERNEL是在linux/gfp.h中定义的一个宏,是分配内核空间的内存时的一个标志位。这个标志位分配内存的一个选项,GFP_KERNEL是内核内存分配时最常用的,无内存可用时可引起休眠。以下是GFP_KERNEL在内核中的代码:#define GFP_ATOMIC (__GFP_HIGH)#define GFP_NOIO (__GFP_WAIT)#define GFP_转载 2014-01-16 18:20:44 · 9610 阅读 · 1 评论 -
Linux内核模块导出后无法调用问题解决(模块间函数调用通讯)
Linux模块间通讯方法非常的多,最便捷的方法莫过于函数符号导出,然后直接调用。然而在linux2.6.26以后的内核中模块的符号导出经常会出现问题,一个模块中的导出符号不能被另外一个模块进行调用。这个使得处理有依赖关系的模块非常的头疼。 1. 符号导出函数EXPORT_SYMBOL() EXPORT_SYMBOL标签内定义的函数对全部内核代码公开,不用修改内核代码就可以在您的内核转载 2014-01-16 12:46:35 · 967 阅读 · 0 评论 -
Linux用户空间与内核空间
Linux 操作系统和驱动程序运行在内核空间,应用程序运行在用户空间,两者不能简单地使用指针传递数据,因为Linux使用的虚拟内存机制,用户空间的数据可能被换出,当内核空间使用用户空间指针时,对应的数据可能不在内存中。Linux内核地址映射模型x86 CPU采用了段页式地址映射模型。进程代码中的地址为逻辑地址,经过段页式地址映射后,才真正访问物理内存。段转载 2014-01-16 21:41:50 · 627 阅读 · 0 评论 -
我对linux内核链表实现中的部分函数的理解——第一节
linux内核链表是一个双向循环链表,其实现与具体硬件平台无关,理解了linux内核链表的实现机制,我们能够把其移植到引用层程序设计当中。 linux内核链表相关的一些函数声明在include/linux/list.h中。首先是链表数据结构的定义struct list_head { struct list_head *next, *prev;原创 2014-01-17 14:10:11 · 1021 阅读 · 0 评论 -
我对linux内核链表实现中的部分函数的理解——第二节
接下来是linux内核链表结点的删除在内核当中链表结点删除的函数是static inline void list_del(struct list_head *entry);我们来看一下它的实现:static inline void list_del(structlist_head *entry){ __list_del(entry->prev,entry->next原创 2014-01-17 15:27:57 · 985 阅读 · 0 评论 -
Linux内核中的常用宏container_of其实很简单
Container_of在Linux内核中是一个常用的宏,用于从包含在某个结构中的指针获得结构本身的指针,通俗地讲就是通过结构体变量中某个成员的首地址进而获得整个结构体变量的首地址。 Container_of的定义如下: [cpp] view plaincopy#define container_of(ptr, type, member)转载 2014-01-17 15:52:36 · 871 阅读 · 0 评论 -
对container_of(ptr,type,member)分析
原型为#define container_of(ptr, type, member) ({\ const typeof( ((type *)0)->member ) *__mptr = (ptr);\ (type *)( (char *)__mptr - offsetof(type,member) );}) 其中 ptr是指向正被使用的某类型变量指针;type是包含ptr指转载 2014-01-17 15:46:28 · 1048 阅读 · 0 评论 -
linux进程状态及转换关系
linux中的进程状态:◆运行状态(TASK_RUNNING)指正在被CPU运行或者就绪的状态。这样的进程被成为runnning进程。运行态的进程可以分为3种情况:内核运行态、用户运行态、就绪态。◆可中断睡眠状态(TASK_INTERRUPTIBLE)处于等待状态中的进程,一旦被该进程等待的资源被释放,那么该进程就会进入运行状态。◆不可中断睡眠状态(TASK_U转载 2014-01-17 22:37:36 · 1079 阅读 · 0 评论 -
struct vm_struct和struct vm_area_struct
内存映射信息放在vma参数中,注意,这里的vma的数据类型是struct vm_area_struct,它表示的是一块连续的虚拟地址空间区域,在函数变量声明的地方,我们还看到有一个类似的结构体struct vm_struct,这个数据结构也是表示一块连续的虚拟地址空间区域,那么,这两者的区别是什么呢?在Linux中,struct vm_area_struct表示的虚拟地址是给进程使用的,而stru原创 2014-03-29 19:35:44 · 5173 阅读 · 3 评论 -
kmalloc
Kmalloc内存分配和malloc相似,除非被阻塞否则他执行的速度非常快,而且不对获得空间清零。Flags参数#includeVoid *kmalloc(size_t size, int flags);第一个参数是要分配的块的大小,第二个参数是分配标志(flags),他提供了多种kmalloc的行为。最常用的GFP_KERNEL,他表示内存分配(最终总是调用get_free_转载 2014-01-16 17:32:36 · 949 阅读 · 0 评论 -
内核模块的Makefile
1. 内核模块的Makefile若要编译hello的内核模块,最简单的方法就是要编写如下内容的Makefile(若对Makefile比较陌生,请参考Linux开发基础讲义):-----------------------------------------------------------------------ifeq ($(KERNELRELEASE),)KERNELDIR转载 2014-01-08 16:15:58 · 814 阅读 · 0 评论 -
关于linux内核模块Makefile的解析
装载自:http://blog.chinaunix.net/uid-25100840-id-271100.htmlLinux内核是一种单体内核,但是通过动态加载模块的方式,使它的开发非常灵活 方便。那么,它是如何编译内核的呢?我们可以通过分析它的Makefile入手。以下是 一个简单的hello内核模块的Makefile. ifneq ($(KERNELRELEASE),)ob转载 2014-01-08 16:18:09 · 685 阅读 · 0 评论 -
Linux内核模块编程
简介模块(module)是在内核空间运行的程式,实际上是一种目标对象文件,没有链接,不能独立运行,不过能装载到系统中作为内核的一部分运行,从而能动态扩充内核的功能。模块最主要的用处就是用来实现设备驱动程式。使用模块的好处: 1,将来修改内核时,不必全部重新编译整个内核,可节省不少时间 2,系统中如果需要使用新模块,不必重新编译内核,只要插入相应的模块即可 模块的使用方式:(转载 2013-12-24 14:05:12 · 860 阅读 · 0 评论 -
RHEL5.1系统内核版本2.6.18升级到内核版本2.6.30
由于要编译X86平台上的linux模块,原操作系统上面没有配备内核源代码,所以无法编译内核,更不能进行内核模块的实验了。参考了很多的资料,决定对运行的linux的内核版本进行升级。最后升级成功。下面把方法总结如下: 一、环境红帽子企业版5,在linux下进入root用户#uname -r2.6.18-53.el5 二、升级过程1)原创 2014-01-09 16:13:03 · 1537 阅读 · 0 评论 -
Linux软连接和硬链接
1.Linux链接概念Linux链接分两种,一种被称为硬链接(Hard Link),另一种被称为符号链接(Symbolic Link)。默认情况下,ln命令产生硬链接。【硬连接】硬连接指通过索引节点来进行连接。在Linux的文件系统中,保存在磁盘分区中的文件不管是什么类型都给它分配一个编号,称为索引节点号(Inode Index)。在Linux中,多个文件名指向同一索引节点是存在的转载 2014-01-08 16:44:03 · 541 阅读 · 0 评论 -
内核链表和普通链表的区别
.内核链表和普通链表的区别 内核链表是一个双向链表,但是与普通的双向链表又有所区别。内核链表中的链表元素不与特定类型相关,具有通用性。 我们先来看一幅图 kernel list展示的是内核链表的结构,normallist展示的是普通链表的结构。head是链表头,p1,p2,p3是链表节点。从图中可以看出普通链表的p1的n转载 2014-01-12 12:06:08 · 1957 阅读 · 0 评论 -
内核链表
Linux内核链表定义在include/linux/list.h文件中链表结构定义struct list_head { struct list_head *next, *prev;};Linux内核链表它是一个双向循环链表,里面只包含两个struct list_head结构指针。1. 链表初始化链表初始化有两种方式:(1)使用LIST_HEAD宏定义个头转载 2014-01-12 12:41:05 · 603 阅读 · 0 评论 -
task_struct结构
在linux中,线程、进程都使用struct task_struct来表示,它包含了大量描述进程/线程的信息,其中比较重要的有 pid_t pid;volatile long state; /*进程状态*/。 int exit_state; /*进程退出时的状态*/ 等。 在linux中用current指针指向当前正在运行的进程原创 2014-03-28 22:35:50 · 671 阅读 · 0 评论