[国嵌攻略][108][Linux内核链表]】的更多相关文章

链表简介 链表是一种常见的数据结构,它通过指针将一系列数据节点连接成一条数据链.相对于数组,链表具有更好的动态性,建立链表时无需预先知道数据总量,可以随机分配空间,可以高效地在链表中的任意位置实时插入或删除数据.链表的开销主要是访问的顺序性和组织链的空间损失. 传统链表与Linux内核链表的区别 Linux内核链表是双向循环链表,提供一套统一的链表和操作函数.内核链表的节点由数据和指针两部分组成,不同的是指针不指向下一个节点的数据部分,而是指向下一个节点的指针部分. 内核链表的结构 struct…
Linux系统架构 1.用户空间:应用程序.C函数库 2.内核空间:系统调用接口.内核.体系结构相关代码 Linux系统利用处理器不同的工作模式,使用其中的两个级别分别来运行Linux内核与应用程序,这样使操作系统本身得到了充分的保护.内核空间与用户空间是程序执行的两种不同的状态,通过系统调用和硬件中断能够完成从用户空间到内核空间的切换. Linux内核架构 1.系统调用接口 2.进程管理模块 3.内存管理模块 4.虚拟文件系统 5.网络协议模块 6.设备驱动模块 7.体系结构相关 Linux内…
为什么要配置内核 基于硬件和软件的需求选出需要的功能,去掉不要的功能. 内核配置的方法 make config:基于文本交互的配置. make menuconfig:基于图形菜单的配置. make menuconfig配置方法 1.菜单项的分类 processor type and features   处理器类型 networking support            网络协议支持 device drivers                设备驱动支持 file systems     …
进程与程序 1.程序:存放在磁盘上的一系列代码和数据的可执行映像,是一个静止的实体. 2.进程:是一个执行中的程序,它是一个动态的实体. 进程四要素 1.有一段程序供其执行.这段程序不一定是某个进程所专有,可以与其他进程共用. 2.有进程专用的内核空间堆栈. 3.在内核中有一个task_struct数据结构,也就是通常所说的进程控制块(PCB).有了这个数据结构,进程才能成为内核调度的一个基本单位,接受内核的调度. 4.有独立的用户空间. 如果有独立的用户空间,那么是进程:如果没独立的用户空间,…
什么是内核模块 Linux内核的整体结构非常庞大,其中包含的组件也非常多,如何使用这些组件.一种方式是把所有的组件都编译进内核文件,即zImage或bzImage,但这样会导致一个问题,占用内存过多.内核模块是一种能让内核文件本身并不包含某些组件,而是是在被需要使用的时候,动态地添加到到在运行的内核中的机制. 内核模块的特点: 1.模块本身并不被编译进内核文件 2.在内核运行期间动态的安装或卸载 内核模块的使用 1.安装内核模块 示例: insmod usb.ko 2,卸载内核模块 示例: rm…
裸机中断: 1.中断统一入口. 2.注册中断处理程序. 3.根据中断源编号,调用中断处理程序. Linux中断 1.在entry-armv.S中的_irq_svc是中断统一入口. 2.获取产生中断源的编号(中断号). 3.根据中断号,找到irq_desc结构 4.从irq_desc描述结构中取出事先注册好的函数来运行. 驱动程序需要做什么 1.实现中断处理程序 2.注册中断处理程序 Linux中断处理程序设计 1.中断注册 request_irp函数用于注册中断. int request_irq…
内存管理子系统 1.虚拟地址与物理地址的映射 2.物理内存的分配 Linux虚拟地址空间分布 设备最后访问的一定是物理地址,但Linux系统中使用的都是虚拟地址.虚拟地址简单的来说就是程序中使用的地址.所以存在虚拟地址到物理地址之间的映射关系. Linux系统支持的虚拟地址空间由硬件来决定.例如处理器是32位,那么访问到的虚拟地址空间就是4G.0-3G是用户空间,也就是应用程序空间.3-4G是内核空间,内核空间又被划分为4个部分,第一个部分是直接映射区(3-3.896G),第二个部分是vmall…
内核模块示例 #inlcude <linux/init.h> #inlcude <linux/module.h> static int hello_init(){ printk(KERN_WARNING”hello_init\n”); ; } static void hello_exit(){ printk(KERN_INFO”hello_exit\n”); } module_init(hello_init); module_exit(hello_exit); 特点: 内核模块代码…
第1类 时间编程类 1.1 获取日历时间 1.1.1 函数名 time 1.1.2 函数原形 time_t time(time_t *t) 1.1.3 函数功能 返回日历时间 1.1.4 所属头文件 <time.h> 1.1.5 返回值 成功:日历时间失败:-1 1.1.6 参数说明 t:不为空的情况下保存返回值   1.2 获取格林威治时间 1.2.1 函数名 gmtime 1.2.2 函数原形 struct tm *gmtime(const time_t *timep) 1.2.3 函数功…
系统调用 函数实现体在内核空间,提供给应用程序来使用,就是一个系统调用. 工作流程 1.通过软中断(swi)从用户空间切换到内核空间.entry-common.S中的ENTRY(vector_swi)是用来处理软中断的.系统调用通常从r7寄存器中取出系统调用编号. 2.通过系统调用编号从系统调用表中找出调用的系统调用函数.也是是calls.S文件中找出系统调用编号对应的函数. 实现系统调用 1.打开.../kernel/printk.c,添加系统调用函数 void sys_iprint(){ p…