U-Boot 图形化配置及其原理

2023-10-27

在前两章中我们知道uboot 可以通过mx6ull_alientek_emmc_defconfig 来配置,或者通过文件mx6ull_alientek_emmc.h 来配置uboot。还有另外一种配置uboot 的方法,就是图形化配置,以前的uboot 是不支持图形化配置,只有Linux 内核才支持图形化配置。不过不知道从什么时候开始,uboot 也支持图形化配置了,本章我们就来学习一下如何通过图形化配置uboot,并且学习一下图形化配置的原理,因为后面学习Linux 驱动开发的时候可能要修改图形配置文件。

在这里插入图片描述

U-Boot 图形化配置体验(如何使能dns 命令)

uboot 或Linux 内核可以通过输入“make menuconfig”来打开图形化配置界面,menuconfig是一套图形化的配置工具,需要ncurses 库支持。ncurses 库提供了一系列的API 函数供调用者生成基于文本的图形界面,因此需要先在Ubuntu 中安装ncurses 库,命令如下:

sudo apt-get install build-essential
sudo apt-get install libncurses5-dev

menuconfig 重点会用到两个文件:.config 和Kconfig,.config 文件前面已经说了,这个文件保存着uboot 的配置项,使用menuconfig 配置完uboot 以后肯定要更新.config 文件。Kconfig文件是图形界面的描述文件,也就是描述界面应该有什么内容,很多目录下都会有Kconfig 文件。

在打开图形化配置界面之前,要先使用“make xxx_defconfig”对uboot 进行一次默认配置,只需要一次即可。如果使用“make clean”清理了工程的话就那就需要重新使用“make xxx_defconfig”再对uboot 进行一次配置。进入uboot 根目录,输入如下命令:

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- mx6ull_alientek_emmc_defconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig

如果已经在uboot 的顶层Makefile 中定义了ARCH 和CROSS_COMPILE 的值,那么上述命令可以简化为:

make mx6ull_alientek_emmc_defconfig
make menuconfig

打开后的图形化界面如图34.1.1 所示:
在这里插入图片描述

通过键盘上的“↑”和“↓”键来选择要配置的菜单,按下“Enter”键进入子菜单。菜单中高亮的字母就是此菜单的热键,在键盘上按下此高亮字母对应的键可以快速选中对应的菜单。

选中子菜单以后按下“Y”键就会将相应的代码编译进Uboot 中,菜单前面变为“< * >”。按下“N”键不编译相应的代码,按下“M”键就会将相应的代码编译为模块,菜单前面变为“< M >”。

按两下“Esc”键退出,也就是返回到上一级,按下“?”键查看此菜单的帮助信息,按下“/”键打开搜索框,可以在搜索框输入要搜索的内容。
在配置界面下方会有五个按钮,这五个按钮的功能如下:

  • < Select>:选中按钮,和“Enter”键的功能相同,负责选中并进入某个菜单。
  • < Exit>:退出按钮,和按两下“Esc”键功能相同,退出当前菜单,返回到上一级。
  • < Help>:帮助按钮,查看选中菜单的帮助信息。
  • < Save>:保存按钮,保存修改后的配置文件。
  • < Load>:加载按钮,加载指定的配置文件。

在图34.1.1 中共有13 个配置主配置项,通过键盘上的上下键调节配置项。后面跟着“—>”表示此配置项是有子配置项的,按下回车键就可以进入子配置项。

我们就以如何使能dns 命令为例,讲解一下如何通过图形化界面来配置uboot。进入“Command line interface —>”这个配置项,此配置项用于配置uboot 的命令,进入以后如图34.1.2 所示:
在这里插入图片描述
从图34.1.2 可以看出,有很多配置项,这些配置项也有子配置项,选择“Network commands—>”,进入网络相关命令配置项,如图34.1.3 所示:
在这里插入图片描述
从图34.1.3 可以看出,uboot 中有很多和网络有关的命令,比如bootp、tftpboot、dhcp 等等。选中dns,然后按下键盘上的“Y”键,此时dns 前面的“[ ]”变成了“[ * ]”,如图34.1.4所示:
在这里插入图片描述
每个选项有3 种编译选项:编译进uboot 中(也就是编译进u-boot.bin 中)、取消编译(也就是不编译这个功能模块)、编译为模块。按下“Y”键表示编译进uboot 中,此时“[ ]”变成了“[ * ]”;按下“N”表示不编译,“[ ]”默认表示不编译;有些功能模块是支持编译为模块的,这个一般在Linux 内核里面很常用,uboot 下面不使用,如果要将某个功能编译为模块,那就按下“M”,此时“[ ]”就会变为“< M >”。

细心的朋友应该会发现,在mx6ull_alientek_emmc.h 里面我们配置使能了dhcp 和ping 命令,但是在图34.1.3中dhcp 和ping 前面的“[ ]”并不是“[ * ]”,也就是说不编译dhcp 和ping命令,这不是冲突了吗?实际情况是dhcp和ping 命令是会编译的。之所以在图34.1.3 中没有体现出来时因为我们是直接在mx6ull_alientek_emmc.h中定义的宏CONFIG_CMD_PING 和 CONFIG_CMD_DHCP,而menuconfig 是通过读取.config
文件来判断使能了哪些功能,.config里面并没有宏CONFIG_CMD_PING
和CONFIG_CMD_DHCP,所以menuconfig 就会识别出错。

选中dns,然后按下“H”或者“?”键可以打开dns 命令的提示信息,如图34.1.5 所示:
在这里插入图片描述
按两下ESC 键即可退出提示界面,相当于返回上一层。选择dns 命令以后,按两下ESC 键(按两下ESC 键相当于返回上一层),退出当前配置项,进入到上一层配置项。如果没有要修改的就按两下ESC 键,退出到主配界面,如果也没有其他要修改的,那就再次按两下ESC 键退出menuconfig 配置界面。如果修改过配置的话,在退出主界面的时候会有如图34.1.6 所示提
示:
在这里插入图片描述
图34.1.6 询问是否保存新的配置文件,通过键盘的←或→键来选择“Yes”项,然后按下键盘上的回车键确认保存。至此,我们就完成了通过图形界面使能了uboot 的dns 命令,打开.config文件,会发现多了“CONFIG_CMD_DNS=y”这一行,如图34.1.7 中的323 行所示:
在这里插入图片描述
使用如下命令编译uboot:

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j16

千万不能使用如下命令:

./mx6ull_alientek_emmc.sh

因为mx6ull_alientek_emmc.sh 在编译之前会清理工程,会删除掉.config 文件!通过图形化界面配置所有配置项都会被删除,结果就是竹篮打水一场空。

编译完成以后烧写到SD 卡中,重启开发板进入uboot 命令模式,输入“?”查看是否有“dns”命令,一般肯定有的。使用dns 命令来查看一下百度官网“www.baidu.com”的IP 地址。

注意!如果要与外部互联网通信,比如百度官网,这个时候要保证开发板能访问到外部互联网。如果你的开发板和电脑直接用网线连接的,那么肯定无法连接到外部网络,这个时候dns命令查看百度官网也会失败!所以开发板一定要连接到路由器上,而且要保证你的路由器能访问外网,比如手机连接到这个路由器上以后可以正常访问互联网。

要先设置一下dns 服务器的IP 地址,也就是设置环境变量dnsip 的值,命令如下:

setenv dnsip 114.114.114.114
saveenv

设置好以后就可以使用dns 命令查看百度官网的IP 地址了,输入命令:

dns www.baidu.com

结果如图34.1.8 所示:
在这里插入图片描述
从图34.1.7 可以看出,“www.baidu.com”的IP 地址为14.215.177.38,说明dns 命令工作正常。这个就是通过图形化命令来配置uboot,一般用来使能一些命令还是很方便的,这样就不需要到处找命令的配置宏是什么,然后在到配置文件里面去定义。

menuconfig 图形化配置原理

make menuconfig 过程分析

当输入make menuconfig 以后会匹配到顶层Makefile 的如下代码:
在这里插入图片描述
这个在31.3.13 小节已经详细的讲解过了,其中build=-f ./scripts/Makefile.build obj,将490行的规则展开就是:

@ make -f ./scripts/Makefile.build obj=scripts/kconfig menuconfig

Makefile.build 会读取scripts/kconfig/Makefile 中的内容,在scripts/kconfig/Makefile 中可以
找到如下代码:

示例代码34.2.1.2 scripts/kconfig/Makefile 代码段
menuconfig: $(obj)/mconf
$< $(silent) $(Kconfig)

其中obj= scripts/kconfig,silent 是设置静默编译的,在这里可以忽略不计,Kconfig=Kconfig,因此扩展以后就是:

menuconfig: scripts/kconfig/mconf
scripts/kconfig/mconf Kconfig

目标menuconfig 依赖scripts/kconfig/mconf,因此scripts/kconfig/mconf.c 这个文件会被编译,生成mconf 这个可执行文件。目标menuconfig 对应的规则为scripts/kconfig/mconf Kconfig,也就是说mconf 会调用uboot 根目录下的Kconfig 文件开始构建图形配置界面。

Kconfig 语法简介

上一小节我们已经知道了scripts/kconfig/mconf 会调用uboot 根目录下的Kconfig 文件开始构建图形化配置界面,接下来简单学习一下Kconfig 的语法。因为后面学习Linux 驱动开发的时候可能会涉及到修改Kconfig,对于Kconfig 语法我们不需要太深入的去研究,关于Kconfig的详细语法介绍,可以参考linux 内核源码(不知为何uboot 源码中没有这个文件)中的文件
Documentation/kbuild/kconfig-language.txt,本节我们大概了解其原理即可。打开uboot 根目录下的Kconfig,这个Kconfig 文件就是顶层Kconfig,我们就以这个文件为例来简单学习一下Kconfig语法。

1、mainmenu

顾名思义mainmenu 就是主菜单,也就是输入“make menuconfig”以后打开的默认界面,在顶层Kconfig 中有如下代码:

示例代码34.2.2.1 顶层Kconfig 代码段
mainmenu "U-Boot $UBOOTVERSION Configuration"

上述代码就是定义了一个名为“U-Boot $UBOOTVERSION Configuration”的主菜单,其中UBOOTVERSION=2016.03,因此主菜单名为“U-Boot 2016.03 Configuration”,如图34.2.2.1 所示:

在这里插入图片描述

2、调用其他目录下的Kconfig 文件

和makefile 一样,Kconfig 也可以调用其他子目录中的Kconfig 文件,调用方法如下:

source "xxx/Kconfig" //xxx 为具体的目录名,相对路径

在顶层Kconfig 中有如下代码:

在这里插入图片描述
从示例代码34.2.2.2 中可以看出,顶层Kconfig 文件调用了很多其他子目录下的Kcofig 文件,这些子目录下的Kconfig 文件在主菜单中生成各自的菜单项。

3、menu/endmenu 条目

menu 用于生成菜单,endmenu 就是菜单结束标志,这两个一般是成对出现的。在顶层Kconfig 中有如下代码:

在这里插入图片描述
在这里插入图片描述
示例代码34.2.2.3 中有两个menu/endmenu 代码块,这两个代码块就是两个子菜单,第14行的“menu “General setup””表示子菜单“General setup”。第102 行的“menu “Boot images””表示子菜单“Boot images”。体现在主菜单界面中就如图34.2.2.2 所示:

在这里插入图片描述
在“General setup”菜单上面还有“Architecture select (ARM architecture)”和“ARM architecture ”这两个子菜单,但是在顶层Kconfig 中并没有看到这两个子菜单对应的menu/endmenu 代码块,那这两个子菜单是怎么来的呢?这两个子菜单就是arch/Kconfig 文件生成的。包括主界面中的“Boot timing”、“Console recording”等等这些子菜单,都是分别由顶层Kconfig 所调用的common/Kconfig、cmd/Kconfig 等这些子Kconfig 文件来创建的。

3、config 条目

顶层Kconfig 中的“General setup”子菜单内容如下:

在这里插入图片描述
在这里插入图片描述
可以看出,在menu/endmenu 代码块中有大量的“config xxxx”的代码块,也就是config 条目。config 条目就是“General setup”菜单的具体配置项,如图34.2.2.3 所示:
在这里插入图片描述
“config LOCALVERSION”对应着第一个配置项,“config LOCALVERSION_AUTO”对应着第二个配置项,以此类推。我们以“config LOCALVERSION ”和“config LOCALVERSION_AUTO”这两个为例来分析一下config 配置项的语法:
在这里插入图片描述

第16 和26 行,这两行都以config 关键字开头,后面跟着LOCALVERSION 和LOCALVERSION_AUTO,这两个就是配置项名字。假如我们使能了LOCALVERSION_AUTO这个功能,那么就会下.config 文件中生成CONFIG_LOCALVERSION_AUTO,这个在上一小节讲解如何使能dns 命令的时候讲过了。由此可知,.config 文件中的“CONFIG_xxx”(xxx 就是
具体的配置项名字)就是Kconfig 文件中config 关键字后面的配置项名字加上“CONFIG_”前缀。

config 关键字下面的这几行是配置项属性,17~24 行是LOCALVERSION 的属性,27~44 行是LOCALVERSION_AUTO 的属性。属性里面描述了配置项的类型、输入提示、依赖关系、帮助信息和默认值等。

第17 行的string 是变量类型,也就是“CONFIG_ LOCALVERSION”的变量类型。可以为:bool、tristate、string、hex 和int,一共5 种。最常用的是bool、tristate 和string 这三种,bool 类型有两种值:y 和n,当为y 的时候表示使能这个配置项,当为n 的时候就禁止这个配置项。

tristate 类型有三种值:y、m 和n,其中y 和n 的涵义与bool 类型一样,m 表示将这个配置项编译为模块。string 为字符串类型,所以LOCALVERSION 是个字符串变量,用来存储本地字符串,选中以后即可输入用户定义的本地版本号,如图34.2.2.4 所示:

在这里插入图片描述
string 后面的“Local version - append to U-Boot release”就是这个配置项在图形界面上的显示出来的标题。

第18 行,help 表示帮助信息,告诉我们配置项的含义,当我们按下“h”或“?”弹出来的帮助界面就是help 的内容。

第27 行,说明“CONFIG_LOCALVERSION_AUTO”是个bool 类型,可以通过按下Y 或N 键来使能或者禁止CONFIG_LOCALVERSION_AUTO。

第28 行,“default y”表示CONFIG_LOCALVERSION_AUTO 的默认值就是y,所以这一行默认会被选中。

4、depends on 和select

打开arch/Kconfig 文件,在里面有这如下代码:

在这里插入图片描述
在这里插入图片描述
第9 行,“depends on”说明“SYS_GENERIC_BOARD”项依赖于“HAVE_GENERIC_BOARD”,也就是说“HAVE_GENERIC_BOARD”被选中以后“SYS_GENERIC_BOARD”才能被选中。

第17~20 行,“select”表示方向依赖,当选中“ARC”以后,“HAVE_PRIVATE_LIBGCC”、“HAVE_GENERIC_BOARD”、“SYS_GENERIC_BOARD”和“SUPPORT_OF_CONTROL”这四个也会被选中。

4、choice/endchoice

在arch/Kconfig 文件中有如下代码:
在这里插入图片描述
choice/endchoice 代码段定义了一组可选择项,将多个类似的配置项组合在一起,供用户单选或者多选。示例代码34.2.2.7 就是选择处理器架构,可以从ARC、ARM、AVR32 等这些架构中选择,这里是单选。在uboot 图形配置界面上选择“Architecture select”,进入以后如图34.2.2.5所示:

在这里插入图片描述
可以在图34.2.2.5 中通过移动光标来选择所使用的CPU 架构。第12 行的prompt 给出这个choice/endchoice 段的提示信息为“Architecture select”。

5、menuconfig

menuconfig 和menu 很类似,但是menuconfig 是个带选项的菜单,其一般用法为:
在这里插入图片描述
第1 行,定义了一个可选的菜单MODULES,只有选中了MODULES 第3~5 行if 到endifx之间的内容才会显示。在顶层Kconfig 中有如下代码:
在这里插入图片描述
在这里插入图片描述
第74~99 行使用menuconfig 实现了一个菜单,路径如下:

General setup
-> Configure standard U-Boot features (expert users) --->

如图34.2.2.6 所示:
在这里插入图片描述
从图34.2.2.6 可以看到,前面有“[ ]”说明这个菜单是可选的,当选中这个菜单以后就可以进入到子选项中,也就是示例代码34.2.2.9 中的第83~99 行所描述的菜单,如图34.2.2.7 所示:
在这里插入图片描述
如果不选择“Configure standard U-Boot features (expert users)”,那么示例代码34.2.2.9 中的第83~99 行所描述的菜单就不会显示出来,进去以后是空白的。

6、comment

comment 用于注释,也就是在图形化界面中显示一行注释,打开文件
drivers/mtd/nand/Kconfig,有如下所示代码:

74 config NAND_ARASAN
75 bool "Configure Arasan Nand"
76 help
......
80
81 comment "Generic NAND options"

第81 行使用comment 标注了一行注释,注释内容为:“Generic NAND options”,这行注释在配置项NAND_ARASAN 的下面。在图形化配置界面中按照如下路径打开:

-> Device Drivers
-> NAND Device Support

结果如图34.2.2.8 所示:
在这里插入图片描述

从图34.2.2.8 可以看出,在配置项“Configure Arasan Nand”下面有一行注释,注释内容为“*** Generic NAND options ***”。

7、source

source 用于读取另一个Kconfig,比如:

source "arch/Kconfig"

这个在前面已经讲过了。

Kconfig 语法就讲解到这里,基本上常用的语法就是这些,因为uboot 相比Linux 内核要小很多,所以配置项也要少很多,所以建议大家使用uboot 来学习Kconfig。一般不会修改uboot中的Kconfig 文件,甚至都不会使用uboot 的图形化界面配置工具,本小节学习Kconfig 的目的主要还是为了Linux 内核作准备。

添加自定义菜单

图形化配置工具的主要工作就是在.config 下面生成前缀为“CONFIG_”的变量,这些变量一般都要值,为y,m 或n,在uboot 源码里面会根据这些变量来决定编译哪个文件。本小节我们就来学习一下如何添加自己的自定义菜单,自定义菜单要求如下:

  • ①、在主界面中添加一个名为“My test menu”,此菜单内部有一个配置项。
  • ②、配置项为“MY_TESTCONFIG”,此配置项处于菜单“My test menu”中。
  • ③、配置项的为变量类型为bool,默认值为y。
  • ④、配置项菜单名字为“This is my test config”。
  • ⑤、配置项的帮助内容为“This is a empty config, just for tset!”。

打开顶层Kconfig,在最后面加入如下代码:

menu "My test menu"

config MY_TESTCONFIG
 bool "This is my test config"
 default y
 help
  This is a empty config, just for test!

endmenu # my test menu

添加完成以后打开图形化配置界面,如图34.3.1 所示:
在这里插入图片描述
从图34.3.1 可以看出,主菜单最后面出现了一个名为“My test menu”的子菜单,这个就是我们上面添加进来的子菜单。进入此子菜单,如图34.3.2 所示:
在这里插入图片描述
从图34.3.2 可以看出,配置项添加成功,选中“This is my test config”配置项,然后按下“H”键打开帮助文档,如图34.3.3 所示:

在这里插入图片描述
从图34.3.3 可以看出,帮助信息也正确。配置项MY_TESTCONFIG 默认也是被选中的,因此在.config 文件中肯定会有“CONFIG_MY_TESTCONFIG=y”这一行,如图34.3.4 所示:
在这里插入图片描述
至此,我们在主菜单添加自己的自定义菜单就成功了,以后大家如果去半导体原厂工作的话,如果要编写Linux 驱动,那么很有可能需要你来修改甚至编写Kconfig 文件。Kconfig 语法其实不难,重要的点就是34.2.2 小节中的那几个,最主要的是记住:Kconfig 文件的最终目的就是在.config 文件中生成以“CONFIG_”开头的变量。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

U-Boot 图形化配置及其原理 的相关文章

  • 终止 ssh 会话会终止正在运行的进程

    我正在使用 ssh 连接到我的 ubuntu 服务器 我使用命令启动编码程序 然而 似乎当我的 ssh 会话关闭时 因为我在进入睡眠状态的笔记本电脑上启动它 有没有办法避免这种情况 当然 阻止我的笔记本电脑休眠并不是永久的解决方案 运行你的
  • PostgreSQL docker:“无法绑定 IPv6 套接字:无法分配请求的地址”

    编辑2 经过很长一段时间 解决了 请参阅下面的答案 编辑 我很遗憾地说 从昨天到今天 问题 自行 消失了 而我没有做任何事情 在这里学习很棒的非确定性课程 额外的乐趣 无法绑定 IPv6 套接字 错误仍然出现在错误日志中 因此这可能根本不是
  • gnutls_handshake() 失败:握手失败 GIT

    一切都工作正常 但突然我收到错误 致命 无法访问 https 电子邮件受保护 cdn cgi l email protection name repo name git gnutls handshake 失败 握手失败 我在我的计算机和 E
  • 如何搭建qtwayland?

    我花了一整天的时间尝试使用QtWayland Compositor 1 0在 Qt 创建者中 我已经遵循了从那里开始的所有步骤https wiki qt io QtWayland https wiki qt io QtWayland但我收到
  • 带有接收器的 boost_log 示例无法编译

    我正在考虑将 boost log 用于一个项目 一开始我就遇到了以下问题 我在以下位置找到的升压日志示例 http www boost org doc libs 1 54 0 libs log example doc tutorial fi
  • pip 找不到满足要求的版本 django==2.2.1

    我刚刚将操作系统更改为 linux 并且想安装 django 但我无法安装最新版本的 django 我努力了 pip install django 但是它安装了 django 1 11 11 这不是我需要的 我还将我的 pip 升级到了 1
  • socket.io 自动断开套接字

    当我在电子中运行 socket io 时 我不断在开发者控制台中收到此错误 engine io client socket probe transport websocket failed because of error transpor
  • 如何像C99一样使用make和编译?

    我正在尝试使用 Makefile 编译 Linux 内核模块 obj m main o all make C lib modules shell uname r build M PWD modules clean make C lib mo
  • 什么是海湾合作委员会 4.1.3?

    根据 gcc 发布页面 http www gnu org software gcc releases html http www gnu org software gcc releases html 版本4 1 3不存在 不过 我在很多地方
  • 如何告诉 CMake 将构建文件放在哪里?

    我想告诉 CMake 将文件和文件夹输出到不同的文件夹而不是当前文件夹 我在下面讨论的是 CMake 生成的文件 文件 CMakeCache txt 目录 CMakeFiles 文件 生成文件 目录 bin 文件 cmake install
  • 分割 tar.bz2 文件并单独提取每个文件

    我可以将一个大的 tar bz2 文件分割成几个较小的文件并在 Ubuntu 中单独提取这些小 tar bz2 文件吗 Thanks 我认为这不容易实现 A tar bz2是单个流 它没有像这样的索引zip这将允许跳到存档中特定文件的开头
  • 如何在Linux中获取带有图标的活动应用程序

    我想找到一种方法获取活动应用程序的列表及其名称和图标 实际上 我正在使用此命令来获取所有活动进程 wmctrl lp 示例输出 0x03800002 0 3293 user notebook XdndCollectionWindowImp
  • 使用多个 NIC 广播 UDP 数据包

    我正在 Linux 中为相机控制器构建嵌入式系统 非实时 我在让网络做我想做的事情时遇到问题 该系统有 3 个 NIC 1 个 100base T 和 2 个千兆端口 我将较慢的连接到相机 这就是它支持的全部 而较快的连接是与其他机器的点对
  • C:运行系统命令并获取输出? [复制]

    这个问题在这里已经有答案了 我想在 Linux 中运行一个命令并获取其输出内容的返回文本 但我do not想要将此文本打印到屏幕上 有没有比制作临时文件更优雅的方法 你想要 popen http linux die net man 3 po
  • 终端从包含空格的变量传递参数

    在终端中如何将包含空格的字符串作为参数传递 它实际上跳过了空格后面的部分 只取第一个单词 word soccer ball shell exec casperjs test js word word 那么我怎样才能转义空白它只运行这个命令
  • 未知错误:SyntaxError:ng 命令上出现意外的标记“导出”

    我正在尝试学习 Angular我已按照此处的步骤操作 https angular io guide setup local https angular io guide setup local在 Ubuntu 18 04 5 LTS 上进行
  • 为什么 ls -l 中的“总计”加起来不等于列出的总文件大小? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 为什么是total在输出中ls l打印为64并不是26078列出的所有文件的总数是多少 ls l test ls total 64 rw
  • 未找到 DEADLINE 调度策略

    我想在 C 中实现 DEADLINE 调度策略 我知道该功能已实现Linux 3 14 10我正在使用 Ubuntu 14 04Linux 3 17 0 031700 lowlatency 201410060605 SMP PREEMPT这
  • 如何在 arago 项目构建中编写自己的食谱包

    我如何在 arago 项目构建中编写自己的食谱包 我知道它可以是 bitbake 文件 但我怎么写 不知道 我在互联网上搜索 但未能找到任何好的来源 有人可以给我提供链接或示例来开始吗 RegardsLinux 学习者 使用 Bitbake
  • Linux 从设备本身运行的脚本卸载设备

    我在路径中安装了一个 iso 映像 mnt iso 在这个 iso 中我有一个安装脚本 install sh 我从 iso 运行安装脚本 最后脚本询问用户是否要卸载 iso 本身 如果用户按 y 脚本将执行以下代码 cd umount mn

随机推荐

  • CVPR 2023

    论文题目 Accelerated Coordinate Encoding Learning to Relocalize in Minutes using RGB and Poses 在公众号 3D视觉工坊 后台回复 原论文 可获取对应论文p
  • 血压计算法

    1 1 动脉平均压的计算 动脉平均压 MAP 是血压波 P t 形在一个周期内的积分除以周期T 其定义如下 均压反映了动脉血压的数值和波形 从试波法原理的两条基本原则 振荡波包络线呈现出近似抛物线的形态 脉搏振荡波振幅最大对应的袖带压力为平
  • 109,有序链表转换为二叉搜索树

    给定一个单链表 其中的元素按升序排序 将其转换为高度平衡的二叉搜索树 本题中 一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 示例 给定的有序链表 10 3 0 5 9 一个可能的答案是 0 3 9 10
  • css 小记

    新的 CSS 伪类函数 is 和 where is 旧的写法 h1 gt b h2 gt b h3 gt b h4 gt b h5 gt b h6 gt b color hotpink 新的写法 伪类 is is h1 h2 h3 h4 h
  • RSA算法多种生成公私钥的方式

    前言 在实际项目开发中常常需要用到非对称性加密算法生成公私钥应用于加密与认证 服务器间ssh免密等 关于非对称性加密算法生成公私钥等笔者之前有发表过一篇有趣的文章 感兴趣的朋友可以去了解下 生成公私钥的方式有很多 本文以RSA算法为例来讨论
  • 基于Matlab的跨孔CT胖射线追踪算法(二)

    基于Matlab的跨孔CT胖射线追踪算法 二 CT技术是一种无损的工程物探检测技术 因其方法简单 分辨率高 理论上更可靠 结果更直观 被广泛的应用于各种工程 胖射线追踪是CT技术的一种正演算法 本文的代码和示意图 供学习借鉴 1 文章目录
  • Java——JavaDoc生成文档

    JavaDoc javadoc命令是用来生成自己的APi文档 参数信息 author 作者名 version 版本号 since 致命需要最早使用的jdk版本 param 参数名 return 返回值情况 throws 异常抛出情况 用一段
  • pyecharts折线图上symbol(小圆圈)颜色的修改方法

    本人刚接触pyecharts 尝试做k线与指标图 但遇到不少困难 虽然pyecharts虽在展现上令人舒畅 但使用起来并不能像echarts那么完善 比如k线的颜色目前就改不了 我是在尝试了各种方法后 才在GitHub上找到了作者的回答 此
  • 截图 识别指定位置文字

    def tu browser get screenshot as file 1 png img Image open 1 png bo 图片左边到元素左边的距离 图片上面到元素上边的距离 图片左边到元素最右边的距离 图片上面到元素最下边的距
  • Keras—embedding嵌入层的使用

    最近在工作中进行了NLP的内容 使用的还是Keras中embedding的词嵌入来做的 Keras中embedding层做一下介绍 中文文档地址 https keras io zh layers embeddings 参数如下 其中参数重点
  • Flask 物联网局部应用情景

    实践 Raspberry Pi 托管 Flask 网络服务器控制设备 云托管 Flask 和 SQLite 网络服务器使用Web API 处理 ESP8266 数据 Raspberry Pi 托管 Flask 网络服务器使用SQLite存储
  • ChatGPT有哪些作用?

    ChatGPT有哪些作用 介绍 在当今信息技术飞速发展的时代 自然语言处理和人工智能已经成为许多领域的关键技术 ChatGPT是一种先进的语言生成模型 通过人工智能技术为用户提供了许多有用的功能和应用 本文将探讨ChatGPT的作用及其在不
  • 【ASP.NET Core】MVC模型绑定:自定义InputFormatter读取CSV内容

    Python微信订餐小程序课程视频 https edu csdn net course detail 36074 Python实战量化交易理财系统 https edu csdn net course detail 35475 在上一篇文章中
  • 【浅学Java】Servlet详解

    Servlet详解 1 什么是Servlet 2 创建一个Servlet程序 1 创建项目 Maven 2 引入依赖 3 创建一些新目录 4 编写代码 5 打包 6 部署 7 验证程序 3 简化创建Servlet的步骤 1 安装plugin
  • .NET Desktop程序员:互联网大环境下软件生产力的创造者

    目录 引言 桌面软件如何适配今天的互联网 让 NET桌面软件工程拥有互联网基因 WebRuntime是什么 具体案例 让应用适配不同的应用场景 基于应用的Web页面 Cloud WinForm 强大的Web生产力 总结 引言 对每个 NET
  • 征服数据宇宙,新华三存储护卫队早有准备?

    999 往期 精 选
  • 【C++】STL—— unordered_map的介绍和使用、 unordered_map的构造函数和迭代器、 unordered_map的增删查改函数

    文章目录 1 unordered map的介绍 2 unordered map的使用 2 1unordered map的构造函数 2 2unordered map的迭代器 2 3unordered map的容量和访问函数 2 4unorde
  • 题目:请输入星期几的第一个字母来判断一下是星期几,如果第一个字母一样,则继续判断第二个字母。

    程序分析 用情况语句比较好 如果第一个字母一样 则判断用情况语句或if语句判断第二个字母 Monday Tuesday Wednesday Thursday Friday Saturday Sunday T 2 S 2 public cla
  • 计算机刚开始学什么时候,新手如何开始学电脑 新手学电脑从何入门

    虽然现在手机已经占据了互联网的半壁江山 但是生活中免不了需要接触电脑 用U盘拷贝份文件 用打印机打印份文档 在电脑上下载一首歌 电影 图片等 都离不开电脑 很多人觉得电脑跟自己无关 也许当你需要用的时候 才会觉得 书到用时方恨少 那么对于一
  • U-Boot 图形化配置及其原理

    目录 U Boot 图形化配置体验 如何使能dns 命令 menuconfig 图形化配置原理 make menuconfig 过程分析 Kconfig 语法简介 1 mainmenu 2 调用其他目录下的Kconfig 文件 3 menu