linux
文章平均质量分 76
it潮人
这个作者很懒,什么都没留下…
展开
-
【Linux API 揭秘】module_init与module_exit
目录1、函数作用2、module_init函数解析2.1 module_init2.1.1 模块方式2.1.2 内建方式2.2 __initcall2.2.1 代码调用流程2.2.2 #和##的作用2.2.3 函数解析3、module_exit函数解析3.1 module_exit3.1.1 模块方式3.1.2 内建方式3.2 __exitcall4、扩展module_init和module_exit是驱动中最常用的两个接口,主要用来注册、注销设备驱动程序。并且这两个接口的实现机制是一样的,我们先以modu转载 2024-06-06 16:44:44 · 13 阅读 · 0 评论 -
嵌入式Linux--U-Boot(五)NAND命令使用
uboot 是支持 NAND Flash 的,所以也有 NAND Flash 的操作命令,前提是使用的 NAND 版本的核心板,并且编译 NAND 核心板对应的 uboot,然后使用 imxdownload 软件将 u-boot.bin 烧写到 SD 卡中,最后通过 SD 卡启动。从上面给出了 NAND 的页大小、OOB 域大小,擦除大小等信息。上图中的文件就是我们写到 NAND 中的设备树文件,至于设备树文件的详细内容我们后面会有专门的章节来讲解,这里大家知道这个文件就行了。转载 2024-05-27 09:41:16 · 71 阅读 · 0 评论 -
Linux多核运行机制(SMP)
/load_balance检查该cpu在这一层的调度域中是否存在负载不平衡的情况,如果存在该cpu会分担负载最重的那个cpu的一些任务。/* (7) 如果本sd的balance间隔时间已到,进行实际的load_balance() *//* (6) 如果需要串行化(SD_SERIALIZE),做balance之前需要持锁 */for_each_domain(cpu, sd) {//遍历该cpu的所有调度域,从最低一级到最高一级。// next_decay_max_lb_cost 是下一次进行衰减的时间。转载 2024-05-09 17:17:29 · 185 阅读 · 0 评论 -
操作系统 宏内核和微内核的区别
优点:超级稳定,驱动等的错误只会导致相应进程死掉,不会导致整个系统都崩溃,做驱动开发时,发现错误,只需要kill掉进程,修正后重启进程就行了,比较方便。宏内核:简单来说,就是把很多东西都集成进内核,例如linux内核,除了最基本的进程、线程管理、内存管理外,文件系统,驱动,网络协议等等都在内核里面。内核态:CPU可以访问内存的所有数据,包括外围设备,例如硬盘,网卡,CPU也可以将自己从一个程序切换到另一个程序。缺点:稳定性差,开发过程中的bug经常会导致整个系统挂掉。宏内核和微内核的区别。转载 2024-04-28 10:44:04 · 99 阅读 · 0 评论 -
Device Tree 详解
对于DeviceTree的来历和用处大部分人都已经非常了解了,DeviceTree发源于PowerPC架构,为了消除代码中冗余的各种device注册代码而产生的,现在已经成为了linux的通用机制。其中“bootargs”属性用来传递cmdline参数,“stdout-path”属性用来指定标准输出设备,“stdin-path”属性用来指定标准输入设备。“parent unit address”的cells长度由父节点的“#address-cells”指定;每个DeviceTree只有一个根节点。转载 2024-04-03 10:19:44 · 116 阅读 · 0 评论 -
UBoot怎么跳转到Kernel:uboot与linux的交界
_attribute__定义了结构体的属性,将结构体放在.u_boot_cmd段中。这样我们通过U_BOOT_CMD宏就定义了cmd_tbl_t类型的结构体变量,变量名为**__u_boot_cmd_bootm**,同时用U_BOOT_CMD宏中的参数对cmd_tbl_t结构体中的每个成员进行初始化。Struct_Section定义了结构体变量的段属性,cmd_tbl_t类型的结构体变量链接时全部链接到u_boot_cmd段中,可以查看u-boot.lds文件对u_boot_cmd段位置的安排。转载 2024-03-28 09:32:06 · 149 阅读 · 0 评论 -
mkimage与dumpimage使用
通过mkimage -f o.its image.ub打包了image.ub文件,同样可以将image.ub解压,抽取里面的独立文件。版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。其中image.ub是用于启动的内核,他是怎么来的呢?其中its文件里面描述了用于打包itb文件的信息,包括文件类型,路径,压缩方式等。在使用petalinux制作ZYNQ嵌入式系统时,最终产生了如下文件。打包linux内核,增加头部信息,制作uImage。转载 2024-03-26 12:01:43 · 220 阅读 · 0 评论 -
OpenWRT启动流程剖析
这里需要注意的是原生的Linux内核中/sbin/init进程是由busybox实现的,而在OpenWRT中是由procd实现的。o 这里需要注意的是,/etc/rc.d/目录下的启动文件其实是/etc/init.d/目录下文件的软链接,该目录下的启动脚本分为两类,一类是以S开头,另一类是以K开头,S代表start,K代表stop,启动脚本的执行顺序是按照S/K后面的数字大小从小到大依次执行,如果多个init脚本具有相同的起始值,则调用顺序由init脚本名称的字母从小到大依次确定。转载 2024-03-13 15:26:58 · 402 阅读 · 0 评论 -
uboot-的start.S详细注解及分析
注:ARM微处理器支持字节(8位)、半字(16位)、字(32位)3种数据类型。转载 2024-03-12 11:27:21 · 156 阅读 · 0 评论 -
03 openwrt的启动过程
引用博客:https://clockworkbird9.wordpress.com/2016/09/可以明显的看到procd进程接管了init进程。转载 2024-03-08 17:43:53 · 129 阅读 · 0 评论 -
OpenWrt启动脚本(Init Scripts)
因为/etc/rc.common 中已经定义了所有默认的函数,当我们没有重新实现这些函数时,程序会执行/etc/rc.common中的默认函数,比如在这个 example 中,我们没有定义 restart 函数,我们跟参数 restart 时,程序执行/etc/rc.common中的 restart 函数,该函数首先调用 stop 函数,再调用 start 函数。/etc/rc.d/下的所有脚本都是链接到/etc/init.d/下的脚本。神奇的地方就在这两个名字中的K与S了。转载 2024-03-08 15:55:54 · 335 阅读 · 0 评论 -
01.OpenWrt系统介绍
本章节我们将对OpenWrt系统产生的背景进行介绍。OpenWrt最初是群众发现发现思科用了开源代码,并且没有按照协议上的规定公开代码,后来被迫公开源码。才有了今天你和我的故事~不得被佩服老爷子的先见之明。转载 2024-03-08 14:20:15 · 152 阅读 · 0 评论 -
OpenWrt介绍及编译基础教程
编译 OpenWrt 的过程就像是复读机,除了选择系统组件外,几乎每次编译都是复制粘贴相同的命令。而理解每一条命令的作用、什么时候该去执行,这样才能更好的去解决编译中遇到的问题,更顺利的编译出固件。转载 2024-03-08 11:19:05 · 2595 阅读 · 0 评论 -
Bootloader中的PBL、SBL的区别
PBL是我们通常请求的1002会话模式下的程序,当MCU收到1002请求并且响应之后,程序会进入PBL模式中;SBL更新APP程序的步骤:首先1002会话激活保证处于PBL模式下----->其次下载SBL------>接着激活SBL-------->下载APP;3、BOOT刷新所用到的两个文件是FlashDriver驱动程序和boot软件,在这里我们可以将SBL理解为FlashDriver驱动程序,PBL理解为Boot软件。是第一级引导程序,主要执行芯片ECU的初始化和底层硬件的检测;转载 2024-03-07 17:19:07 · 511 阅读 · 0 评论 -
从零开始学习OpenWrt完美教程
查找资料很辛苦,而且OpenWrt的门槛相对较高,希望这篇文章所提供的从零开始学OpenWrt编译 + 刷机 + 使用教程能降低新手们的入门难度,当然,编译过程非必须,一般的路由都可找到可用的稳定固件直接刷机。make作为trunk版本的编译命令,只能在trunk目录执行,进入配置菜单界面,键盘上下是移动光标,左右是选择底部按键,回车是确认,空格是设置选择模式,选项最前面的选择模式有[*]表示编译进固件,[M]表示编译成安装包,[ ]表示不选择,esc是返回上级菜单,按?是帮助,按/是搜索。转载 2024-03-07 16:06:22 · 2732 阅读 · 1 评论 -
1-Openwrt ipv6之-odhcp6c客户端
配置好之后需要重启/etc/init.d/network restart里面会执行ubus call network reload然后就是一系列的ubus传输,最终会调用到/lib/netifd/proto里面对应的脚本,脚本netifd-proto.sh脚本里面会调用_proto_do_setup函数,启动各个协议进程。ipv4的启动在./lib/netifd/proto/dhcp.sh脚本里面的proto_dhcp_setup函数。转载 2024-02-23 17:17:38 · 618 阅读 · 0 评论 -
shell 脚本中常用的内置变量
从上面的结果可以看出, 执行 ./a.sh命令之后,$$ 变量表示的是 执行a.sh脚本的进程ID 13095 ,而 12982 是它的父进程ID,也即是 PPID变量的值,它是当前bash的实例。使用 $*时,如果加上双引号,即 "$* " 的形式,那所有位置的参数会被当作一个单词来处理,如果不包含双引号,即 $* 的形式,则每个位置的参数都被当作一个独立的单词来处理。第十个参数及以后的参数必须要用大括号括起来,例如: ${10}、${11}、${12} 依次表示第十个变量、第十一个变量、第十二个变量。转载 2024-02-22 14:47:24 · 101 阅读 · 0 评论 -
Openwrt procd守护进程
(4)procd_add_reload_trigger,增加配置文件触发器,每次配置文件的修改,如果调用了reload_config时,当前实例都被重启。其实它在内部是调用procd_open_trigger、procd_add_config_trigger和procd_close_trigger这3个函数来增加触发器。至少需要一个参数,第一个参数是服务名称,通常为进程名,第二个是可选参数,是进程实例名称,因为可能有多个进程示例,如果不指定所有的实例将被关闭。输入以下命令,可以看到系统所有注册的验证服务。转载 2024-02-21 14:57:00 · 261 阅读 · 0 评论 -
Linux内核中container_of函数详解
container_of(ptr, type,member)函数的实现包括两部分:1. 判断ptr 与 member 是否为同意类型2. 计算size大小,结构体的起始地址 = (type *)((char *)ptr - size) (注:强转为该结构体指针)现在我们知道container_of()的作用就是通过一个结构变量中一个成员的地址找到这个结构体变量的首地址。container_of(ptr,type,member),这里面有ptr,type,member分别代表指针、类型、成员。1。转载 2024-02-20 17:08:30 · 68 阅读 · 0 评论 -
container_of函数详解
可以说是内核中使用最为频繁的一个函数了,简单来说,它的主要作用就是根据我们结构体中的已知的成员变量的地址,来寻求该结构体的首地址,直接看图,更容易理解。了解完内部完整的实现手法之后,我们也可以手码一个。函数内部涉及的相关知识了然于胸,下面我们再来看。,该如何理解这个表达式呢?,下面我们一一拆解来看。函数中,主要用来断言判断。转载 2024-02-20 15:05:57 · 1126 阅读 · 0 评论 -
Iptables之nf_conntrack模块
表示分组对应的连接已经进行了双向的分组传输,也就是说连接已经建立,而且会继续匹配 这个连接的包。通过系统初始化脚本创建配置文件”/etc/modprobe.d/nf_conntrack.conf”, 内容为“options nf_conntrack hashsize=262144”,通过nf_conntrack模块挂接参数”hashsize”自动设置“net.nf_conntrack_max=2097152”(nf_conntrack_max=hashsize*8),保证后续新初始化服务器配置正确。转载 2024-02-18 10:31:25 · 498 阅读 · 0 评论 -
【Shell 命令集合 文件管理】Linux 补丁文件应用命令 patch命令使用指南
在我们的探索过程中,我们已经深入了解了Shell命令的强大功能和广泛应用。然而,学习这些技术只是开始。真正的力量来自于你如何将它们融入到你的日常工作中,以提高效率和生产力。心理学告诉我们,学习是一个持续且积极参与的过程。所以,我鼓励你不仅要阅读和理解这些命令,还要动手实践它们。尝试创建自己的命令,逐步掌握Shell编程,使其成为你日常工作的一部分。同时,请记住分享是学习过程中非常重要的一环。分享你自己在使用Shell命令时遇到的问题或者有趣的经验,可以帮助更多人从中学习。转载 2024-02-06 14:42:13 · 148 阅读 · 0 评论 -
【linux】patch命令使用简述
pN : 剥离等级,移除patch文件的具体文件的路径个数,用于使patch文件中的修改能与指定的被修改的文件路径匹配。-R : 撤销/恢复已经应用的patch(将patch文件中新的修改与旧的修改反向应用到工程中,达到代码恢复的目的)patch可以将git diff 等命令生成的比较文件(patch文件)应用到不同版本的同一个工程中,是合并代码的一种方式。-d : 指定需要应用patch的文件路径(与-p要配合好)参考命令:patch。转载 2024-02-06 11:21:16 · 459 阅读 · 0 评论 -
<Linux>使用quilt工具制作补丁(patch)文件
patch是Linux项目编程下常用的工具。例如:一份有Makefile管理的驱动代码文件,每次编译时会有Makefile规则从指定目录下解压到固件目录下,此时在驱动代码中添加了一些功能或者改变了一些功能代码,为了不改变原驱动代码,便可以将新修改的代码做成patch文件,使用Makefile在每次编译固件时候将patch安装到代码中。提示:以下步骤均在ubuntu下进行示范操作。转载 2024-02-06 10:19:06 · 167 阅读 · 0 评论 -
OpenWRT数据接收过程【Linux内核-OpenWRT】
OpenWRT数据接收过程 这里使用的是ath9k网卡驱动,硬件平台是TP-link TL-WR841N V7.1 路由器。转载 2024-02-02 11:00:48 · 62 阅读 · 0 评论 -
openwrt上开启syslog打印方法
随后,就想看下bluez的log,可惜一点都没有打印出来,然后修改了源代码,开启了log打印,重新安装了如下3个ipk,发现依旧没有打印,看代码,bluez的打印是通过如下函数完成。最近在openwrt上调试蓝牙时,出现问题,设备上的蓝牙适配器已经正常工作了,执行pair命令后,openwrt和待连接的设备上都出现了配对码,两边都同意,但连接失败。尝试分析log,发现在如下代码处打印了错误,这个错误是一个通用的错误码,走到default分支了,往上看代码也找不到具体的原因。3. 配置system。转载 2024-02-01 11:40:55 · 244 阅读 · 0 评论 -
iptables 常用使用命令
iptables 使用三个不同的链来允许或阻止流量:输入(input)、输出(output)和转发(forward)输入(input) —— 此链用于控制传入连接的行为输出(output) —— 此链用于传出连接转发(forward) —— 这条链用于传入的连接,这些连接实际上不是在本地传递的,比如路由和 NATing。转载 2024-01-31 09:58:02 · 667 阅读 · 0 评论 -
iptables之iptables表、链、规则 、匹配模式、扩展模块、连接追踪模块(一)
默认情况当禁止ping后,其他主机无法ping通本主机,本主机也无法ping通其他主机,现需要本主机可以ping通其他主机,而其他主机依然无法ping同本主机。3.请求从本机发出:local Process(本机) --> OUTPUT --> POSTROUTING。1.请求到达本机: PREROUTING --> INPUT --> Local Process (本机)1.请求到达本机: PREROUTING --> INPUT --> Local Process (本机)转载 2024-01-30 20:37:25 · 216 阅读 · 0 评论 -
openwrt开机自启动脚本编写
START= 和 STOP= 决定脚本启动时的次序. 启动时init.d会根据文件名顺序, 自动执行在/etc/rc.d中找到的脚本. 初始化脚本可以作为/etc/init.d/下文件的软链放置在/etc/rc.d/.原文链接:https://blog.csdn.net/u010835747/article/details/124902701。enable # 启用开机自启动, 实际上是在/etc/rc.d/下创建S?/bin/sh /etc/rc.common指定了执行该脚本的方式(必须)转载 2024-01-30 14:37:56 · 1156 阅读 · 0 评论 -
Linux shell脚本中if的“-e,-d,-f” 说明
[ -z $pid ]] 双对括号,变量不用加双引号。[ -z "$pid" ] 单对中括号变量必须要加。转载 2024-01-30 14:25:09 · 736 阅读 · 0 评论 -
OpenWrt之quilt打补丁
给gdb打补丁修复Remote ‘g’ packet reply is too long。OpenWrt使用的是quilt工具来制作补丁非传统的diff。diff和quilt使用方法参考博客。准备gdb源码以及patch文件。quilt edit 其他文件。返回buildroot目录。更新修改到patch文件。进入到gdb源码目录。转载 2024-01-24 09:30:22 · 164 阅读 · 0 评论 -
OpenWrt LED Configuration(OpenWrt指示灯配置)
以下是OpenWrt默认的各种trigger形式。转载 2024-01-22 14:13:05 · 466 阅读 · 0 评论 -
Openwrt ubus: 进程间通信的例子
ubus_server.c: 向ubusd注册了一个名为"ering_uobj"的对象 , 提供一个名称为"ering_method“的方法, 这个方法的实现依靠3个名称为"id","data","msg"的参数。方法请求是通过回调函数来实现的,程序本身不会退出。2. ubus服务端(ubus server object): 提供软件各种具体功能模块的实现(methods), 服务端的对象名称和具体的mothd名称向ubusd进行注册后,就可以被其他ubus客户端进行传呼(call)。转载 2024-01-19 15:00:10 · 438 阅读 · 0 评论 -
VxWorks关于任务创建的几个函数的概述
对于VxWorks 的任务创建可以通过调用 taskSpawn()或是taskInit()/taskActivate()两种方式,以下就对这两种方式进行说明。 taskSpawn() 实现任务的创建分为两步:1、分配任务栈的空间,初始化WIND_TCB; 2、激活任务。taskSpawn()函数的定义,int taskSpawn (char *name, /*任务名称必须惟一的标示*/ int priority,...转载 2022-01-14 14:21:51 · 3106 阅读 · 0 评论 -
OpenWrt 安装Git
安装git软件,ssh相关的组件。转载 2024-01-15 10:26:38 · 368 阅读 · 0 评论 -
luci的框架和认识
OK ,之前罗里罗嗦的说了很多,现在就进入正题,进入正题的前提是你已经make install正确的安装了lua ,luci,以及编译好链接了相关的so(如果你需要,比如uci.so nixio.so),以及make install正确web server,(我用的web server是thttpd,也编译过mongoose,lighttpd,在这三个之中,lighttpd是功能最完善的,mongoose是最小巧的)。此处也可以这样写, i18n(“reboot”,“重启”),即直接做了国际化。转载 2024-01-15 10:24:21 · 210 阅读 · 0 评论 -
Luci实现框架
对每个节点,最重要的属性当然是target,这也是dispatch()流程最后要执行的方法。target主要有:alise、firstchild、call、cbi、form、template。这几个总体上可以分成两类,前两种主要用于链接其它node,后一个则是主要的操作、以及页面生成。下面分别描述。**链接方法:**在介绍初始登录流程时,已经讲到了这种方法。比如初始登录时,url中的path_info仅为'/',这应该会索引到rootnode节点。转载 2024-01-15 09:07:57 · 41 阅读 · 0 评论 -
从mk文件深度剖析OpenWrt软件编译构建系统、并手把手教学构建自己的系统软件
第二步:回到在openwrt源码顶级目录下,输入make menuconfig进行配置,进入Network模块,然后选择hello(输入M将hello设置为M,M代表模块类型编译,“*”代表系统性编译)然后保存退出,保存之后会更新.config配置文件,如果不进行这一步,下面编译时会出错。在这个例子中,这个命令在启动时取代start函数而执行boot函数,如果boot函数没有被重新定义,将执行rc.common中预定义的 boot函数,boot函数再次调用start函数。转载 2024-01-15 09:11:24 · 607 阅读 · 1 评论 -
OpenWrt Luci页面如何配置底部按钮(返回、保存、复位)
示例: page = entry({“admin”, “network”, “appfilter”}, arcombine(cbi(“appfilter/appfilter”), cbi(“appfilter/dev_status”, {hideapplybtn=true, hidesavebtn=true, hideresetbtn=true})), _(“appfilter”), 100)开发过程中,会用到不同风格的页面,比如有的是配置页面,有的是状态页面 而状态页面是不需要保存按钮的。转载 2024-01-14 22:12:14 · 268 阅读 · 0 评论 -
OpenWrt Luci流程分析
luci.sgi.cgi.run()–cgi程序接下来执行程序,Luci的默认路径是/usr/lib/lua/luci,所以luci.sgi.cgi.run()是运行/usr/lib/lua/luci/sgi/cgi.lua文件中的run函数。如调用Flag的处理:function Flag.parse(self, section),他会通过遍历处理from传下来的每一个Flag,并通过本身的write/remove来启用和禁用这个选项。dispatch:四个部分处理请求。 B.需要显示的部分。转载 2024-01-14 22:04:54 · 130 阅读 · 0 评论