Linux内核、驱动开发移植
文章平均质量分 81
无忧老猪
老码农一名:)
展开
-
Linux内核的启动流程
内核本身由一个作了raw_binary处理的目标文件(下文称为kernel.o)以及大量的在运动时可能被动态装载的内核模块构成。关于内核映像的构成,可以参考http://blog.csdn.net/crazycoder8848/article/details/19156503本文仅谈一谈内核的启动流程,基于3.10.102版本的内核源码。内核的启动流程,开始于kerne原创 2017-08-08 02:04:26 · 1149 阅读 · 0 评论 -
raw binary文件探秘
Linux下的目标文件、动态库文件、可执行文件,其格式为elf格式。elf文件是有结构的文件,其内部有丰富的信息,例如,可能包含了可执行文件的入口地址,各个节的起始地址,可重定位信息,还可能包含指令与代码行的对应关系(用于调试)。内核则利用elf文件中的相关信息,加载运行可执行文件。然而内核映像,u-boot映像这些特殊的文件,则是raw_binary文件。这当然有他的原因。以u-原创 2017-04-25 23:57:08 · 3693 阅读 · 0 评论 -
关于Linux文件系统的几点注意事项
本人水平相当有限,不当之处还望大家多多指教。做内核开发的朋友,可能对下面的代码都很眼熟。static const struct file_operations xxx_fops = { .owner = THIS_MODULE, .llseek = no_llseek, .write = xxx_write, .unlocked_ioctl = xxx_ioctl, .原创 2017-05-14 05:20:24 · 736 阅读 · 0 评论 -
Linux内核版本说明
在下水平相当有限,不当之处,还望大家批评指正^_^1. 标准内核版本信息看下图 (截自https://www.kernel.org/)第一列,版本性质:主分支(mainline),稳定版(stable),长期维护版(longterm)第二列,版本号。-rc表示非正式发布版本,[EOL]表示本分支最后一个版本。第三列,版本发布日期。patch列是补丁。用于从本分支原创 2016-03-01 15:02:17 · 12264 阅读 · 0 评论 -
Linux内核模块(驱动)编译详解
本文主要说说如何编译自己开发的内核模块。由于驱动通常也被编译成内核模块,因此文章的内容也适用于驱动的编译。由于在下能力相当有限,有不当之处,还望大家批评指正^_^一、准备工作准备工作如何做,这里就不详说了。a) 首先,你要有一台PC(这不废话么^_^),装好了Linux。b) 安装好GCC(这个指的是host gcc,用于编译生成运行于pc机程序的)、m原创 2015-03-08 15:50:37 · 23512 阅读 · 6 评论 -
代码学习-Linux内核网卡收包过程(NAPI)
本文通过学习RealTek8169/8168/8101网卡的驱动代码(drivers/net/r8169.c),梳理一下Linux下网卡的收包过程。在下水平相当有限,有不当之处,还请大家斧正^_^ 驱动的初始化如下的rtl8169_init_module函数是此驱动的初始化代码,此函数只干了一件事,就是向内核注册一个pci驱动rtl8169_pci_driver。static原创 2015-06-02 19:02:54 · 6722 阅读 · 1 评论 -
一个软件实现的Linux看门狗—soft_wdt
soft_wdt(以下简称本软件)是一个软件实现的Linux看门狗。 本软件是一款开源、免费软件。 下载地址:https://github.com/sunmingbao/soft-wdt/archive/master.zip 本软件和/drivers/watchdog/softdog.c实现的软件看门狗几乎一样。 主要的不同点是,前者原创 2014-11-04 08:23:44 · 6055 阅读 · 0 评论 -
Linux内核中的初始化initcall
由于在下水平相当有限,不当之处,还望大家批评指正^_^基于Linux 2.6.32include\asm-generic\Vmlinux.lds.h中有如下定义:这等于是安排了名称如.initcall[s].init的一系列section的顺序,level越小,越靠前。符号__initcall_start记录了这片区域的开始,__initcall_end符号记录了这原创 2016-03-10 15:49:28 · 3646 阅读 · 0 评论 -
Linux设备与驱动学习笔记(概述)
由于在下能力相当有限,有不当之处,还望大家批评指正^_^本文基于Linux内核2.6.32一、宏观架构在内核中,大量的驱动与设备(但不是全部),都按总线进行分类管理。例如,凡是pci设备或pci设备的驱动,都归到pci总线下管理。1. 从sys文件系统感受这种架构。/sys/bus/目录下列出了各种总线类型,像pci、i2c、usb、platform等。我们以p原创 2016-03-09 19:06:58 · 7041 阅读 · 0 评论 -
pci设备学习笔记
水平有限,错误难免 ^_^参考资料:1) 《Linux内核源代码情景分析》2) Linux内核源代码(2.6.32)。本文只讨论比较简单的软硬件配置场景。系统中的第一条PCI总线(即主PCI总线),挂在“宿主—PCI桥”上。CPU通过“宿主——PCI桥”就可以访问主PCI总线了。PC机中通常只有一个“宿主—PCI桥”。但是,通过引入其他类型的P原创 2015-06-17 20:33:34 · 6622 阅读 · 0 评论 -
Linux内核编译详解
学习了网上的一些资料,自己试着摸索了一下,整理出此文。由于在下水平相当有限,不当之处,还望大家批评指正^_^重要的参考资料有:http://raspberrypi.stackexchange.com/questions/192/how-do-i-cross-compile-the-kernel-on-a-ubuntu-hosthttp://blog.csdn.net/x原创 2015-03-08 12:43:54 · 53117 阅读 · 5 评论 -
Linux内核编译(Red Hat Enterprise/centos/Fedora)
本文描述的是为当前PC机编译内核的方法。若您想了解更一般的通用的内核编译方法,可参考如下博文:http://blog.csdn.net/crazycoder8848/article/details/44131735好了,下面言归正传。一. 下载内核源码包注意,这里要下载的内核源码不是标准的Linux内核源码,而是Red Hat发行版的内核源码。另外需要注意,Red原创 2014-01-27 11:45:36 · 7408 阅读 · 1 评论 -
virtio驱动学习笔记
virtio是对虚拟化环境下guest kernel中io操作的一种优化。首先需要说明的是,在内核的角度来看,virtio设备及其driver,和其他设备及驱动一样,都是普通的设备,并没有什么特殊性。也就是说,内核并不知道这种io优化的存在。virtio设备,在系统层面看,就是pci设备。但是,为了提高io效率,对io操作做出了优化。主要方案是:1) 当virtio设备输出数据时,原创 2015-04-21 11:00:38 · 8339 阅读 · 1 评论 -
Linux内核中实现生产者与消费者(避免无效唤醒)
本文关注的重点是,避免内核线程的无效唤醒,并且主要是关注消费者线程的设计。因此,为了省事,这里关与生产者,消费者本身的处理流程可能不够严密。1. 生产者一个内核线程,每生产一个商品后,就唤醒消费者,然后自己睡眠1秒钟。2. 消费者一个内核线程,每当被唤醒后,就消费商品,然后进入睡眠。对于消费者线程的这种设计,有几个好处:响应快,平时不占任何cpu。但这种原创 2015-01-10 11:03:08 · 1818 阅读 · 0 评论 -
Linux内核中获取时间并转换成本地时区时间
下面的函数get_time_str实现了在内核中获取本地时间的功能。他首先获取utc时间,然后根据系统的时区timezone转换成本地时间,最后将时间以“2014-11-02 21:14:08”的字符串的形式输出到output缓冲区中。函数的返回值,是输出的字符串的长度。#include #include #include int get_time_str(原创 2014-11-02 21:36:37 · 14079 阅读 · 0 评论 -
Linux内核proc文件系统使用示例
/* * kernel programming test code * * Copyright (C) 2014 Sun Mingbao * Dual licensed under the MIT and/or GPL licenses. * */ #include #include #include #include #include #in原创 2015-01-10 09:25:12 · 1482 阅读 · 0 评论 -
Linux内核rootfs的初始化过程
由于在下水平相当有限,不当之处,还望大家批评指正^_^在Linux shell中执行mount命令,通常可以看到某个做了文件系统的磁盘分区或flash分区或内存文件系统做为所谓的根文件系统被mount到了挂载点/处。实际上内核中最初始的根文件系统,并不是来自内核外部,他是由内核自己构建出来的。为了说明这个过程,我们先说说mount的过程。系统调用sys_mount是在fs/n原创 2018-01-27 01:30:42 · 2724 阅读 · 0 评论