
内核开发
文章平均质量分 91
lanhuazui10
这个作者很懒,什么都没留下…
展开
-
Linux内核网络设备驱动
NAPI。转载 2024-11-30 00:19:16 · 103 阅读 · 0 评论 -
内核中宏定义#和##作用
内核中经常会看到很多宏函数的定义,其中用到了很多很多#和##,而且宏定义或宏函数还会嵌套引用宏定义或函数,有啥含义一个#的作用就是把后面的参数当做一个字符串,也就是说等同于把后面的宏变量加上双引号:int main()return;运行上述代码,可以得到输出:HelloWorld说明 #define PRINT(NAME) printf(#NAME)这个宏,等同于把NAME加上了双引号“”,即替换成了“NAME”,所以,第一个PRINT可以直接把括号内的内容打印出来。原创 2024-11-27 18:52:20 · 586 阅读 · 0 评论 -
linux文件系统基础--内核常用的链表结构hlist_head list_head hlist_node
Linux 内核中提供了的实现,这其中包括了双向和用于的 hash list(hlist)。双向链表的实现采用侵入式的方式,链表节点不保存任何数据内容,而是将链表结构作为具体数据结构的成员;hlist 虽然有 pprev 和 next 成员,但它并不是双向链表,因为 pprev 指向的是前一个节点的 next 指针。原创 2024-11-26 22:46:35 · 1155 阅读 · 0 评论 -
linux文件系统基础3--VFS的重要概念及其操作
因为安装一个文件系统的关键一步就是要为“被安装设备”创建和设置一个 super_block,而不同的具体的文件系统的 super_block 有自己特定的信息,因此要求具体的文件系统首先向内核注册,并提供 read_super() 的实现。现在从内核的角度去看,就很容易明白“文件描述符”是怎么回事了。本来,inode 中应该包括“目录节点”的名称,但由于符号链接的存在,导致一个物理文件可能有多个文件名,因此把和“目录节点”名称相关的部分从 inode 结构中分开,放在一个专门的 dentry 结构中。转载 2024-11-26 22:28:23 · 104 阅读 · 0 评论 -
linux文件系统基础2
比如我要打开/usr/bin/vim 文件, 1 首先需要去/所在的inode找到/的数据块,从/的数据块中读取到usr这个条目的inode, 2 跳转到user 对应的inode,根据/usr inode 指向的数据块,读取到/usr 目录的内容,从中读取到bin这个条目的inode 3 跳转到/usr/bin/对应的inode,根据/usr/bin/指向的数据块,从中读取到/usr/bin/目录的内容,从里面找到vim的inode。该结构体,浮于表面,更贴近用户,更贴近进程。转载 2024-11-26 22:22:22 · 52 阅读 · 0 评论 -
linux文件系统基础--VFS的大核心概念:超级块(super block)、索引节点(inode)、目录项(dentry)和文件对象(file)
Filesystem Switch)称为虚拟文件系统或虚拟文件系统转换,是一个内核软件层,在具体的文件系统之上抽象的一层,用来处理与Posix文件系统相关的所有调用,表现为能够给各种文件系统提供一个通用的接口,使上层的应用程序能够使用通用的接口访问不同文件系统,同时也为不同文件系统的通信提供了媒介。它保存了挂载点、设备、挂载选项等信息。一个文件对象包括的内容就是编程语言支持设置的各种文件打开的flag、mode,文件名称、当前的偏移等,其中非常重要的一个字段就是f_op,指向了当前文件所支持的操作集合。转载 2024-11-26 22:08:52 · 287 阅读 · 0 评论 -
ramdisk、ramfs、tmpfs、initramfs和rootfs内存文件系统概念
如果在cpio文档解压缩后的rootfs中没有init程序(init文件),内核执行旧的代码,定位并且安装root分区,执行/sbin/init程序。ram disk的使用需要从这个假的块设备到page cache之间拷贝内存,生成和销毁dentry,而且需要文件系统的驱动格式化和解释上面的数据,所以ram disk的机制不再使用。initramfs执行的init程序不返回内核(如果/init需要向内核传递控制权,可以再次安装在/目录下一个新的root设备并且启动一个新的init程序)。原创 2024-11-26 21:32:45 · 745 阅读 · 0 评论 -
中断申请函数request_irq详解
根据我们前面中断模型的知识,可以看出发生中断时,内核并不判断究竟是共享中断线上的哪个设备产生了中断,它会循环执行所有该中断线上注册的中断处理函数(即irqaction->handler函数)。因此将设备结构体通过dev_id传递给设备中断处理程序的另一个作用就是使用共享中断时,可以在中断处理函数内通过读取该设备结构 (dev_id) 中提供的中断Flag标志位地址信息进行判断,是否是该设备产生了中断,然后再进一步判断是否继续往下执行还是跳到下一个irqaction->handler函数再判断执行。转载 2024-11-08 20:57:45 · 1088 阅读 · 0 评论 -
ioremap() 函数和iounmap函数
但是CPU通常并没有为这些已知的外设I/O内存资源的物理地址预定义虚拟地址范围,驱动程序并不能直接通过物理地址访问I/O内存资源,而必须将它们映射到核心虚地址空间内(通过页表),然后才能根据映射所得到的核心虚地址范围,通过访内指令访问这些I/O内存资源。典型地,如X86处理器为外设专门实现了一个单独的地址空间,称为"I/O地址空间"或者"I/O端口空间",CPU通过专门的I/O指令(如X86的IN和OUT指令)来访问这一空间中的地址单元。readl() 从内存映射的 I/O 空间上。转载 2024-11-08 20:48:12 · 169 阅读 · 0 评论 -
Cortex-A9 uboot启动代码详解
uboot启动流程如上图所示:设备上电之后,先执行iROM中的出厂代码,先进行必要硬件的初始化,再去执行uboot,通常把kernel、设备树文件放到flash中程序启动之后,往往先从flash启动,运行uboot第一步:先进行硬件的初始化(svc模式栈、clock、内存、串口第二步:自搬移:把uboot从flash中拷贝到RAM中,跳转到RAM中执行剩下的uboot代码第三步:把内核拷贝到RAM中,执行内核,把控制权交给内核。转载 2024-11-02 18:39:01 · 199 阅读 · 0 评论 -
Linux内核时间子系统--RTC时间架构
同时发现rtc0文件为指向/sys/devices/platform/fe5e0000.i2c/i2c-5/5-0051/rtc/rtc0的符号链接,RTC芯片是I2C接口,所以rtc0挂载在I2C的总线上,总线控制器地址fe5e0000,控制器编号为5,RTC芯片作为slave端地址为0x51。在瑞芯微的系统中,安卓部分程序其实最终也是依赖**/sys/class/rtc/rtc0** 下的文件节点实现时间管理功能的。这是就是为什么,我们的设备关机并重启后,仍然能够显示正确的时间的原因。转载 2024-11-02 15:46:19 · 285 阅读 · 0 评论 -
内核抢占和中断(区别)
内核从2.6开始就支持内核抢占,对于非内核抢占系统,内核代码可以一直执行,直到完成,也就是说当进程处于内核态时,是不能被抢占的(当然,运行于内核态的进程可以主动放弃CPU,比如,在系统调用服务例程中,由于内核代码由于等待资源而放弃CPU,这种情况叫做计划性进程切换(planned process switch))。在中断处理程序中,通常会禁止同一中断,甚至会禁止整个本地中断,所以中断处理程序应该尽可能迅速,所以又把中断处理分成上部和下部(关于中断)。在进程上下文中,可以通过current关联相应的任务。转载 2024-10-31 17:11:06 · 187 阅读 · 0 评论 -
Linux 内核配置机制(make menuconfig、Kconfig、makefile)讲解
但是一般我们不采取这个方案,我们选择在配置界面中通过空格、esc、回车选择某些选项选中或者不选中,最后保存退出的时候,Linux内核会把新的选项(正确的参考答案)更新到.config中,此时我们可以把.config重命名为其它文件保存起来(当你执行make distclean时系统会把.config文件删除),以后我们再配置内核时就不需要再去arch/arm/configs下考取相应的文件了,省去了重新配置的麻烦,直接将保存的.config文件复制为.config即可.转载 2023-05-21 14:49:00 · 1900 阅读 · 0 评论