<Linux开发>系统移植 -之- linux内核移植过程详细记录(第二部分完结)

2023-11-13

<Linux开发>系统移植 -之- linux内核移植过程详细记录(第二部分完结)

前面,第一部分讲解了,NXP官方原厂的Linux直接编译下载到开发板的操作过程,及测试效果。以及过程中设计使用的一些辅助工具。从第一部分,可以熟悉整个Linux编译到下载运行的流程,方便接下来的移植操作。

uboot移植可参考一下:

<Linux开发> -之-系统移植 uboot移植过程详细记录(第一部分)
<Linux开发> -之-系统移植 uboot移植过程详细记录(第二部分)
<Linux开发> -之-系统移植 uboot移植过程详细记录(第三部分)(uboot移植完结)

Linux内核及设备树移植可参考一下:
<Linux开发>系统移植 -之- linux内核移植过程详细记录(第一部分)

本次为Linux系统移植中Linux移植的第二部分,主要讲解NXP原厂Linux移植到正点原子Linux开发板的过程,并记录。操作流程均参考正点原子官方Linux开发手册,如有讲解不详细、错误、遗漏之处,可联系作者修改补充,也可参考正点原子官方资料。
联系方式QQ:759521350

注:作者采用的是正点原子的IMX6ULL-EMMC版本的Linux开发板。

接下来讲解主要过程记录。

一、在Linux源码内添加使用的开发板型号
1、添加开发板默认配置文件
(1)将之前第一部分解压后的文件夹,复制一份,并重命名为“linux-imx-onefu”
命令:

cp linux-imx-rel_imx_4.1.15_2.1.0_ga_onefu/ linux-imx-onefu -rf

在这里插入图片描述
(2)添加所用开发板的默认配置文件
将arch/arm/configs目录下的imx_v7_mfg_defconfig重新复制一份,命名为imx_onefu_emmc_defconfig,命令如下:

cd arch/arm/configs/
cp imx_v7_mfg_defconfig  imx_onefu_emmc_defconfig

在这里插入图片描述
后续开发中,imx_onefu_emmc_defconfig就做为正点原子Linux-emmc开发板的配置文件。

(3)添加所用开发板的设备树文件
添加开发板的设备树文件,进入目录arch/arm/boot/dts中,复制一份imx6ull-14x14-evk.dts,然后将其重命名为imx6ull-onefu-emmc.dts,命令如下:

cd arch/arm/boot/dts/
cp imx6ull-14x14-evk.dts imx6ull-onefu-emmc.dts

在这里插入图片描述
.dts是设备树源码文件,编译Linux的时候会将其编译为.dtb文件。

二、移植文件修改
1、设备树文件修改
使用VScode打开,找到路径下“arch/arm/boot/dts/Makefile”,这个文件,在找到“dtb-$(CONFIG_SOC_IMX6ULL)”配置项。添加一下内容:

imx6ull-onefu-emmc.dtb \

如下图示,此句就是前面添加的“imx6ull-onefu-emmc.dts”设备树文件,编译后生成.dtb的设备树文件,将.dtb设备树文件下载到Linux开发板使用。
注意:要有斜杠…
在这里插入图片描述

2、修改脚本文件
测试NXP原厂Linux时写的脚本“imx6ull_onefu_emmc.sh”如下:
在这里插入图片描述
移植到开发板后,修改后如下:
在这里插入图片描述

3、主频修改
根据正点原子官方文档介绍,正点原子I.MX6U-ALPHA开发板所使用的I.MX6ULL芯片主频都是792MHz的,也就是NXP官方宣传的800MHz版本。
接下来就修改CPU的工作频率。
打开 “arch/arm/configs/imx_onefu_emmc_defconfig”,找到下面几句:

CONFIG_CPU_FREQ_GOV_POWERSAVE=y //使能powersave策略
CONFIG_CPU_FREQ_GOV_USERSPACE=y //使能userspace策略
CONFIG_CPU_FREQ_GOV_ONDEMAND=y  //配置ondemand为默认调频策略。
CONFIG_CPU_FREQ_GOV_CONSERVATIVE=y//直接上最高频率,然后看CPU负荷慢慢降低

在这里插入图片描述
查看是否存在“ CONFIG_CPU_FREQ_GOV_ONDEMAND=y”,如果没有,则添加,否则不做修改。

根据具体打开的文件查看配置,**正点原子官方指导手册此处和上图不一样,**所以需要按照上述添加对应语句。但是本次操作查看,配置已经存在“ CONFIG_CPU_FREQ_GOV_ONDEMAND=y”,所以无需更改。
正点原子手册截图如下:
在这里插入图片描述

4、使能8线EMMC驱动
Linux内核驱动里面EMMC默认是4线模式的,4线模式肯定没有8线模式的速度快,由于正点原子的Linux开发板上EMMC采用的是8线模式,所以我们需要将EMMC的驱动修改为8线模式。修改方法很简单,直接修改设备树即可,打开文件imx6ull-onefu-emmc.dts,找到如下所示内容:

&usdhc2 {
	pinctrl-names = "default";
	pinctrl-0 = <&pinctrl_usdhc2>;
	non-removable;
	status = "okay";
};

在这里插入图片描述
修改后如下:

&usdhc2 {
	pinctrl-names = "default", "state_100mhz", "state_200mhz";
	pinctrl-0 = <&pinctrl_usdhc2_8bit>; 
	pinctrl-1 = <&pinctrl_usdhc2_8bit_100mhz>;
	pinctrl-2 = <&pinctrl_usdhc2_8bit_200mhz>;
	bus-width = <8>;
	non-removable;
	status = "okay";
};

在这里插入图片描述
5、修改网络驱动
Linux驱动开发的时候要用到网络调试驱动,所以必须要把网络驱动调试好。在讲解uboot移植的时候就已经说过了,正点原子开发板的网络和NXP官方的网络硬件上不同,网络PHY芯片由KSZ8081换为了LAN8720A,两个网络PHY芯片的复位IO也不同。所以Linux内核自带的网络驱动是驱动不起来I.MX6U-ALPHA开发板上的网络的,需要做修改。

(1)修改LAN8720的复位以及网络时钟引脚驱动
打开“arch/arm/boot/dts/imx6ull-onefu-emmc.dts”

a.删除NXP原厂旧的网络引脚配置
删除下面截图红色标框部分:
在这里插入图片描述
在这里插入图片描述
b.添加正点原子Linux开发板网络引脚
在imx6ull-onefu-emmc.dts里面找到名为“iomuxc_snvs”的节点(就是直接搜索),然后在此节点下添加网络复位引脚信息,添加完成以后的“iomuxc_snvs”的节点内容如下:

&iomuxc_snvs {
	pinctrl-names = "default_snvs";
        pinctrl-0 = <&pinctrl_hog_2>;
        imx6ul-evk {
		省略..........................
		/*enet1 reset water*/ 
		pinctrl_enet1_reset: enet1resetgrp {
				fsl,pins = <
				/* used for enet1 reset */ 
				MX6ULL_PAD_SNVS_TAMPER7__GPIO5_IO07 0x10B0
				>;
		}; 
		/*enet2 reset water*/ 
		pinctrl_enet2_reset: enet2resetgrp {
				fsl,pins = <
				/* used for enet12 reset */ 
				MX6ULL_PAD_SNVS_TAMPER8__GPIO5_IO08 0x10B0	
				>;
		}; 

修改一下ENET1和ENET2的网络时钟引脚配置,继续在imx6ull-onefu-emmc.dts中找到,修改后如下所示代码:
在这里插入图片描述
(2)修改fec1和fec2节点的pinctrl-0属性
在imx6ull-alientek-emmc.dts文件中找到名为“fec1”和“fec2”的这两个节点,修改其中的“pinctrl-0”属性值,修改后如下:
在这里插入图片描述
(3)修改LAN8720A的PHY地址
ENET1的LAN8720A地址为0x0,ENET2的LAN8720A地址为0x1;在imx6ull-alientek-emmc.dts中找到节点fec1和fec2,修改后如下所示:

&fec1 {
	pinctrl-names = "default";
	pinctrl-0 = <&pinctrl_enet1
				&pinctrl_enet1_reset>;
	phy-mode = "rmii";
	phy-handle = <&ethphy0>;
	phy-reset-gpios = <&gpio5 7 GPIO_ACTIVE_LOW>;
	phy-reset-duration = <200>;
	status = "okay";
};

&fec2 {
	pinctrl-names = "default";
	pinctrl-0 = <&pinctrl_enet2
				&pinctrl_enet2_reset>;
	phy-mode = "rmii";
	phy-handle = <&ethphy1>;
	phy-reset-gpios = <&gpio5 8 GPIO_ACTIVE_LOW>;
	phy-reset-duration = <200>;
	status = "okay";

	mdio {
		#address-cells = <1>;
		#size-cells = <0>;

		ethphy0: ethernet-phy@0 {
			compatible = "ethernet-phy-ieee802.3-c22";
			smsc,disable-energy-detect;
			reg = <0>;
		};

		ethphy1: ethernet-phy@1 {
			compatible = "ethernet-phy-ieee802.3-c22";
			smsc,disable-energy-detect; 
			reg = <1>;
		};
	};
};

在这里插入图片描述
第177和178行,添加了ENET1网络复位引脚所使用的IO为GPIO5_IO07,低电平有效。复位低电平信号持续时间为200ms。
第188和189行,ENET2网络复位引脚所使用的IO为GPIO5_IO08,同样低电平有效,持续时间同样为200ms。
第198和204行,“smsc,disable-energy-detect”表明PHY芯片是SMSC公司的,这样Linux内核就会找到SMSC公司的PHY芯片驱动来驱动LAN8720A。
第196行,注意“ethernet-phy@”后面的数字是PHY的地址,ENET1的PHY地址为0,所以“@”后面是0(默认为2)。
第199行,reg的值也表示PHY地址,ENET1的PHY地址为0,所以reg=0。
第202行,ENET2的PHY地址为1,因此“@”后面为1。
第205行,因为ENET2的PHY地址为1,所以reg=1。
至此,LAN8720A的PHY地址就改好了,保存一下imx6ull-alientek-emmc.dts文件。然后使用“make dtbs”命令重新编译一下设备树。
(4)修改fec_main.c文件
要在I.MX6ULL上使用LAN8720A,需要修改一下Linux内核源码,打开drivers/net/ethernet/freescale/fec_main.c,找到函数fec_probe,在fec_probe中加入如下代码:

/* 设置MX6UL_PAD_ENET1_TX_CLK和MX6UL_PAD_ENET2_TX_CLK 
 * 这两个IO的复用寄存器的SION位为1。 
 */
	void __iomem *IMX6U_ENET1_TX_CLK;	//定义映射后的地址指针
	void __iomem *IMX6U_ENET2_TX_CLK;	//定义映射后的地址指针

	IMX6U_ENET1_TX_CLK = ioremap(0X020E00DC, 4);	//映射地址
	writel(0X14, IMX6U_ENET1_TX_CLK);				//写寄存器数据

	IMX6U_ENET2_TX_CLK = ioremap(0X020E00FC, 4);	//映射地址
	writel(0X14, IMX6U_ENET2_TX_CLK);				//写寄存器数据

在这里插入图片描述
第3455~3462就是新加入的代码,如果要在I.MX6ULL上使用LAN8720A就需要设置ENET1和ENET2的TX_CLK引脚复位寄存器的SION位为1。

6、配置Linux内核,使能LAN8720驱动
输入命令“make menuconfig”,打开图形化配置界面,选择使能LAN8720A的驱动,路径如下:

-> Device Drivers
 -> Network device support 
  -> PHY Device support and infrastructure 
   -> Drivers for SMSC PHYs

在这里插入图片描述
选中“Drivers for SMSC PHYs”后,按“y”,按下后,选项的前面中括号内会出现*,LAN8720A是SMSC公司出品的,因此勾选这个以后就会编译LAN8720驱动,配置好以后,通过键盘上的“→”,移动到“Save”,然后按下回车键,在弹出的对话框输入“arch/arm/configs/imx_onefu_emmc_defconfig ”,然后选择“OK”。退出配置界面,然后重新编译一下Linux内核。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

7、修改smsc.c文件
需要找到LAN8720A的驱动文件,LAN8720A的驱动文件是drivers/net/phy/smsc.c,在此文件中有个叫做smsc_phy_reset的函数,看名字都知道这是SMSC PHY的复位函数,因此,LAN8720A肯定也会使用到这个复位函数,修改此函数的内容,修改以后的smsc_phy_reset函数内容如下所示:

static int smsc_phy_reset(struct phy_device *phydev)
{
	int err, phy_reset;
	int msec = 1;
	struct device_node *np;
	int timeout = 50000;
	if(phydev->addr == 0) /* FEC1 */ {
		np = of_find_node_by_path("/soc/aips-bus@02100000/ethernet@ 02188000");	/*查找设备节点*/
		if(np == NULL) {
			return -EINVAL;
		}
	}

	if(phydev->addr == 1) /* FEC2 */ {
		np = of_find_node_by_path("/soc/aips-bus@02000000/ethernet@ 020b4000"); /*查找设备节点*/
		if(np == NULL) {
			return -EINVAL;
		}
	}

	err = of_property_read_u32(np, "phy-reset-duration", &msec);		/*读取只有一个整形值的属性*/
	/* A sane reset duration should not be longer than 1s */
	if (!err && msec > 1000)
		msec = 1;
	phy_reset = of_get_named_gpio(np, "phy-reset-gpios", 0);
	if (!gpio_is_valid(phy_reset))
		return; 
	gpio_direction_output(phy_reset, 0);		/*设置GPIO的输出方向-0:输出*/
	gpio_set_value(phy_reset, 0);				/*设置GPIO的为0*/
	msleep(msec); 								/*延时1ms*/
	gpio_set_value(phy_reset, 1);				/*设置GPIO的为1*/

	int rc = phy_read(phydev, MII_LAN83C185_SPECIAL_MODES);
	if (rc < 0)
		return rc;

	/* If the SMSC PHY is in power down mode, then set it
	 * in all capable mode before using it.
	 */
	if ((rc & MII_LAN83C185_MODE_MASK) == MII_LAN83C185_MODE_POWERDOWN) {
		int timeout = 50000;

		/* set "all capable" mode and reset the phy */
		rc |= MII_LAN83C185_MODE_ALL;
		phy_write(phydev, MII_LAN83C185_SPECIAL_MODES, rc);
		phy_write(phydev, MII_BMCR, BMCR_RESET);

		/* wait end of reset (max 500 ms) */
		do {
			udelay(10);
			if (timeout-- == 0)
				return -1;
			rc = phy_read(phydev, MII_BMCR);
		} while (rc & BMCR_RESET);
	}
	return 0;
}

在这里插入图片描述
第7~12行,获取FEC1网卡对应的设备节点。
第14~19行,获取FEC2网卡对应的设备节点。
第21行,从设备树中获取“phy-reset-duration”属性信息,也就是复位时间。
第25行,从设备树中获取“phy-reset-gpios”属性信息,也就是复位IO。
第29~32行,设置PHY的复位IO,复位LAN8720A。
第41~48行,以前的smsc_phy_reset函数会判断LAN8720是否处于Powerdown模式,只有处于Powerdown模式的时候才会软复位LAN8720。这里我们将软复位代码移出来,这样每次调用smsc_phy_reset函数LAN8720A都会被软复位。
最后我们还需要在drivers/net/phy/smsc.c文件中添加两个头文件,因为修改后的smsc_phy_reset函数用到了gpio_direction_output和gpio_set_value这两个函数,需要添加的头文件如下所示:

#include <linux/of_gpio.h> 
#include <linux/io.h> 

以上就是在NXP官方提供的Linux的基础上移植修改,移植符合正点原子的Linux开发板上的使用,移植修改后,接下来就是编译测试。

三、网络驱动测试
修改好设备树和Linux内核以后重新编译一下,得到新的zImage镜像文件和imx6ull-onefu-emmc.dtb设备树文件,使用网线将I.MX6U-ALPHA开发板的两个网口与路由器或者电脑连接起来,最后使用新的文件启动Linux内核。启动以后使用“ifconfig”命令查看一下当前活动的网卡有哪些,结果如下图所示:
将新得到的zImage 和imx6ull-onefu-emmc.dtb设备树文件放到tftp服务器设置的文件夹内,命令:

cd /home/water/linux/tftpboot    				//进入到tftp文件夹
cp /home/water/water/kernel/linux-imx-onefu/arch/arm/boot/zImage .  //复制镜像
cp /home/water/water/kernel/linux-imx-onefu/arch/arm/boot/dts/imx6ull-onefu-emmc.dtb  .   //复制设备树

在这里插入图片描述
启动开发板进入boot,并下载zImage 和imx6ull-onefu-emmc.dtb设备树文件
输入命令:

tftp 80800000 zImage
tftp 83000000 imx6ull-onefu-emmc.dtb
bootz 80800000 - 83000000

在这里插入图片描述

首先确保根文件系统已存在。。。。

使用“ifconfig”命令查看网卡。
在这里插入图片描述
如果没有活动的网卡,可使用如下命令查看存在的网卡:

ifconfig -a

然后使用如下命令启动网卡:

ifconfig eth0 up    //eth0表示启动的网卡名称
ifconfig eth1 up 

使用如下命令设置网卡的IP地址:

ifconfig eth0 192.168.1.145 
ifconfig eth1 192.168.1.146 

使用"ping"命令ping一下ubuntu主机,命令如下:

ping 192.168.144

在这里插入图片描述
可以看出,ping成功,说明网络驱动修改成功!我们在后面的构建根文件系统和Linux驱动开发中就可以使用网络调试代码啦。

关于Linux内核的移植就讲解到这里,简单总结一下移植步骤:
①、在Linux内核中查找可以参考的板子,一般都是半导体厂商自己做的开发板。
②、编译出参考板子对应的zImage和.dtb文件。
③、使用参考板子的zImage文件和.dtb文件在我们所使用的板子上启动Linux内核,看能否启动。
④、如果能启动的话就万事大吉,如果不能启动那就悲剧了,需要调试Linux内核。不过一般都会参考半导体官方的开发板设计自己的硬件,所以大部分情况下都会启动起来。启动Linux内核用到的外设不多,一般就DRAM(Uboot都初始化好的)和串口。作为终端使用的串口一般都会参考半导体厂商的Demo板。
⑤、修改相应的驱动,像NAND Flash、EMMC、SD卡等驱动官方的Linux内核都是已经提供好了,基本不会出问题。重点是网络驱动,因为Linux驱动开发一般都要通过网络调试代码,所以一定要确保网络驱动工作正常。如果是处理器内部MAC+外部PHY这种网络方案的话,一般网络驱动都很好处理,因为在Linux内核中是有外部PHY通用驱动的。只要设置好复位引脚、PHY地址信息基本上都可以驱动起来。
⑥、Linux内核启动以后需要根文件系统,如果没有根文件系统的话肯定会崩溃,所以确定Linux内核移植成功以后就要开始根文件系统的构建。

以上内容均参考正点原子linux开发板配套资料,如有不足,遗漏,错误之处,可联系作者,进一步改善。
如若获取更详细的资料可到正点原子官方网址下载。

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

<Linux开发>系统移植 -之- linux内核移植过程详细记录(第二部分完结) 的相关文章

  • 在内核代码中查找函数的最佳方法[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我开始浏览内核代码 遇到的一件事是如何跟踪函数调用 结构定义等 有没有一种好的方法可以快速跳转到函数定义并退出 我尝试过 Source N
  • 执行命令而不将其保留在历史记录中[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 在进行软件开发时 经常需要在命令行命令中包含机密信息 典型示例是将项目部署到服务器的凭据设置为环境变量 当我不想将某些命令存储在命令历史记
  • 在 C 中使用单个消息队列是否可以实现双向通信

    我希望服务器向客户端发送一些消息 并让客户端确认它 我被分配了这个任务 我可以在 C linux 中使用单个消息队列来完成它还是我需要创建两个 谢谢 是的 可以使用 sysV 消息队列来做到这一点 从您之前的问题来看 您正在使用该队列 您可
  • 如何为 Linux 桌面条目文件指定带有相对路径的图标?

    对于我的一个 Linux 应用程序 我有应用程序二进制文件 一个 launcher sh 脚本 针对 LD LIBRARY PATH 和一个 desktop 文件 所有这些都位于同一文件夹中 我想使用图标的相对路径而不是绝对路径 我试过了
  • 在 .gitconfig 中隐藏 GitHub 令牌

    我想将所有点文件存储在 GitHub 上 包括 gitconfig 这需要我将 GitHub 令牌隐藏在 gitconfig 中 为此 我有一个 gitconfig hidden token 文件 这是我打算编辑并放在隐藏令牌的 git 下
  • 如何使用 Cloud Init 挂载未格式化的 EBS 卷

    Context 我正在使用https wiki jenkins io display JENKINS Amazon EC2 Plugin https wiki jenkins io display JENKINS Amazon EC2 Pl
  • 在 Linux 上以编程方式设置 DNS 名称服务器

    我希望能够通过我的 C C 程序为 Linux 上的 DNS 名称服务器添加 IP 地址 我在一个带有只读 etc resolv conf 的嵌入式平台上 这意味着我不能简单地将 nameserver xxx xxx xxx xxx 行添加
  • 如何在linux中以编程方式获取dir的大小?

    我想通过 C 程序获取 linux 中特定目录的确切大小 我尝试使用 statfs path struct statfs 但它没有给出确切的大小 我也尝试过 stat 但它返回任何目录的大小为 4096 请建议我如何获取 dir 的确切大小
  • 无需超级用户即可在 Linux 中打开 RAW 套接字

    我必须编写一个在 Linux 上运行的 ping 函数 语言是 C 所以 C 也可以 在网上搜索并查看源代码ping命令 事实证明我应该创建一个原始套接字 icmp sock socket AF INET SOCK RAW IPPROTO
  • 如何根据标签将单个 XML 文件拆分为多个

    我有一个带有标签的 XML 文件 我想像这样分割文件
  • 使用 MAX_ORDER / 包含 mmzone.h

    根据https www kernel org doc Documentation networking packet mmap txt https www kernel org doc Documentation networking pa
  • 使用 shell 脚本将行附加到 /etc/hosts 文件

    我有一个新的 Ubuntu 12 04 VPS 我正在尝试编写一个安装脚本来完成整个 LAMP 安装 我遇到问题的地方是在 etc hosts文件 我当前的主机文件如下所示 127 0 0 1 localhost Venus The fol
  • 在 Mono 上运行 .Net MVC5 应用程序

    我正在 Windows 上的 Visual Studio 2013 中开发 Net 4 5 1 MVC5 应用程序 现在我想知道 是否可以在Linux Ubuntu 12 04 上运行这个应用程序 可以使用OWIN吗 Owin 可以自托管运
  • 内核的panic()函数是否完全冻结所有其他进程?

    我想确认内核的panic 功能和其他类似kernel halt and machine halt 一旦触发 保证机器完全冻结 那么 所有的内核和用户进程都被冻结了吗 是panic 可以被调度程序中断吗 中断处理程序仍然可以执行吗 用例 如果
  • 在生产服务器上使用 Subversion 使文件生效的最佳方法是什么?

    目前我已经设置了 subversion 这样当我在 Eclipse PDT 中进行更改时 我可以提交更改 它们将保存在 home administrator 中项目文件 该文件具有 subversion 推荐的 branches tags
  • Linux 为一组进程保留一个处理器(动态)

    有没有办法将处理器排除在正常调度之外 也就是说 使用sched setaffinity我可以指示线程应该在哪个处理器上运行 但我正在寻找相反的情况 也就是说 我想从正常调度中排除给定的处理器 以便只有已明确调度的进程才能在那里运行 我还知道
  • linux下如何从文本文件中获取值

    我有一些文本格式的文件 xxx conf 我在这个文件中有一些文本 disablelog 1 当我使用 grep r disablelog oscam conf 输出是 disablelog 1 但我只需要值1 请问你有什么想法吗 一种方法
  • Apache 访问 Linux 中的 NTFS 链接文件夹

    在 Debian jessie 中使用 Apache2 PHP 当我想在 Apache 的文档文件夹 var www 中创建一个新的小节时 我只需创建一个指向我的 php 文件所在的外部文件夹的链接 然后只需更改该文件夹的所有者和权限文件夹
  • x86-64 AMD 上 CALL 指令的操作数生成

    以下是示例程序 objdump 的输出 080483b4
  • 使用自定义堆的类似 malloc 的函数

    如果我希望使用自定义预分配堆构造类似 malloc 的功能 那么 C 中最好的方法是什么 我的具体问题是 我有一个可映射 类似内存 的设备 已将其放入我的地址空间中 但我需要获得一种更灵活的方式来使用该内存来存储将随着时间的推移分配和释放的

随机推荐

  • 内网穿透,外网进行访问本地。

    前言 内网穿透 就是可以本地进行搭建环境 外网进行访问地址 首先我们这边使用natapp进行内网穿透 https natapp cn 1 首先在本站注册账号 点击注册 2 登录后 点击左边 购买隧道 免费 付费均可 3 根据需要选择隧道协议
  • 关于用指针交换两个数

    关于用指针交换两个数 西邮Linux 兴趣小组又到了纳新季 作为一个老学长 面试学弟学妹们的时候 必然要然他们感受到小组的关怀 受尽折磨 这一届孩子还是挺强的 但是一到指针上就栽了坑 在加上我们小组的陈年老题swap屡试不爽 所以在这里总结
  • 机械电子工程中的计算机思维,人工智能技术在机械电子工程领域的应用

    鲁芸 朱慧 摘 要 目前 科学技术的不断发展 人工智能的发展也是一个快速发展的趋势 已被广泛应用于各个领域 机电工程的发展也将呈现出新的发展趋势 传统机械工程随着信息技术的融合 它逐渐向智能化方向发展 机电一体化工程与人工智能技术的融合主要
  • 紧急更新下降难度,《王者荣耀》绝悟 AI 难倒一片玩家

    By 超神经 内容概要 在 5 月 1 日 5 月 4 日期间 玩家通过 王者荣耀 最新版本客户端进入游戏 即可与绝悟 AI 对战 一时间哀鸿遍野 普通玩家 游戏主播 职业选手 纷纷表示被绝悟 AI 虐到体无完肤 关键词 王者荣耀 游戏AI
  • 《实时碰撞检测算法技术》读书笔记(七):分离轴测试

    分离轴测试基于凸体 给定两凸体集A和B 若两集合不存在交集 则必定存在一个轴使得两凸体投影无重叠 若找不到该轴 则两凸体集相交 对于对称几何体如线段 AABB OBB 球体等 其包含中心C且为投影轴上投影区间的中心位置 只需计算其投影区间的
  • Windows 下快速删除大量文件的办法

    本来觉得这么一件小事 没必要写个博客 不过搜了好多地方 竟然没有找到很好的解决方法 所以只好不走寻常路了 今天遇到这么一个问题 在学习用卷积神经网络进行特征和提取的时候 准备实验其中一个Demo 主要是进行猫狗图片识别 于是下载了一个包含猫
  • 前几篇的简要总结

    列表的内置方法 1 插入新元素 list1 append 100 将括号内的字符插入到列表末端 无论输入什么数据类型 都会转换成字符串 list1 insert 0 hello insert可以插入到列表的任意位置 所以要在括号内额外添加索
  • unef螺纹_收藏!英制螺纹详细说明

    一 严格地说 UN UNR UNC UNF UNS以及UNEF是螺纹系列的规定代号 而不是某些英文词组的缩写 统一螺纹 Unified Screw Threads 由英国 United Kingdom 加拿大 Canada 和美国 Unit
  • [HashMap源码学习之路]---数组扩容后元素的前后变化

    HashMap数组扩容后元素的前后变化 前一段时间看了HashMap 的扩容方法 觉得写的太好了 对我很有帮助 现以我理解的来写一下 主要说两方面 扩容后元素的位置 扩容后元素如何分布的 1 resize方法的源码 HashMap 中扩容方
  • ESP32的液晶中文显示

    上一篇简单说明了ESP32进行SSD1306的液晶显示 然后希望显示字符 使用前一篇的SSD1306是一个入门 但是不能显示中文 因此本篇主要演示显示中文 在arduino中有一个u8g2库 当时用UNO时使用过该库 但是用在ESP32上
  • 全国职业技能大赛云计算--高职组赛题卷①(私有云)

    全国职业技能大赛云计算 高职组赛题卷 私有云 第一场次题目 OpenStack平台部署与运维 任务1 基础运维任务 5分 任务2 OpenStack搭建任务 15分 任务3 OpenStack云平台运维 15分 任务4 OpenStack云
  • IDEA的下载、安装及配置

    IDEA的下载 安装及配置 IDEA简介 IDEA下载 安装 准备工作 IDEA工具下载 IDEA工具安装 IDEA工具启动 IDEA配置 IDEA基本配置 Appearance 显示 主题配置 关闭Intellij IDEA自动更新 Ke
  • 简易JDBC连接数据库

    简易JDBC连接数据库 1 导入jar包 首先在项目中创建lib文件包 在lib文件包中粘贴MySQL的jar包 将lib包添加为库 2 注册驱动 在类中注册驱动 Class forName com mysql jdbc Driver 提示
  • (Redis) 跳跃表(skiplist)实现原理

    跳跃表简介 跳跃表 skiplist 是一种随机化的数据 由 William Pugh 在论文 Skip lists a probabilistic alternative to balanced trees 中提出 跳跃表以有序的方式在层
  • PHP curl 获取返回的内容和头部信息示例

    请求示例 function curl res string url string data array header is post false is post false url 请求地址 token token 头部 header Co
  • WPA渗透-pyrit:GPU加速_Hash-table

    WPA渗透 pyrit GPU加速 Hash table 1 pyrit工具介绍 pyrit是一款开源且完全免费的软件 任何人都可以检查 复制或修改它 它在各种平台上编译和执行 包括FreeBSD MacOS X和Linux作为操作系统以及
  • 大学生数学竞赛习题精讲_陈兆斗

    大学生数学竞赛习题精讲 陈兆斗 链接 https pan baidu com s 1ctyZqmD 6VFgILBM0DiTcg 提取码 i76s 复制这段内容后打开百度网盘手机App 操作更方便哦
  • mysql用事务实现更新数据

    前言 在手动批量更新正式环境数据库时 建议使用事物进行更新 避免更错数据 造成不必要的麻烦 现表中有三条数据 使用事物批量将name字段为mgx phone字段为17837107346 所有数据中的address字段更新成河北唐山 开始事物
  • moco接口框架介绍

    moco接口框架介绍 Moco 是一个搭建模拟服务器的工具 其支持 API 和独立运行两种方式 前者通常是在 junit testng等测试框架中使用 后者则是通过运行一个 jar 包开启服务 在maven中央仓库中 moco有三个版本 分
  • <Linux开发>系统移植 -之- linux内核移植过程详细记录(第二部分完结)

    Linux开发 系统移植 之 linux内核移植过程详细记录 第二部分完结 前面 第一部分讲解了 NXP官方原厂的Linux直接编译下载到开发板的操作过程 及测试效果 以及过程中设计使用的一些辅助工具 从第一部分 可以熟悉整个Linux编译