热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

关于内核编译

字体大小:大中小博文linux设备驱动归纳总结(一):内核的相关基础概念(2012-07-1916:42)标签:转载分类&#
字体大小:大 中 小博文
linux设备驱动归纳总结(一):内核的相关基础概念 (2012-07-19 16:42)
标签:  转载  分类: linux内核与驱动

原文地址:linux设备驱动归纳总结(一):内核的相关基础概念 作者:diytvgy


linux设备驱动归纳总结(一):内核的相关基础概念

 

xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx


.linux设备驱动的作用

内核:用于管理软硬件资源,并提供运行环境。如分配4G虚拟空间等。

linux设备驱动:是连接硬件和内核之间的桥梁。

 

linux系统按个人理解可按下划分:

 

应用层:包括POSIX接口,LIBC,图形库等,用于给用户提供访问内核的接口。属于用户态,ARM运行在用户模式(usr)或者系统模式(sys)下。

内核层:应用程序调用相关接口后,会通过系统调用,执行SWI指令切换ARM的工作模式到超级用户(svc)模式下,根据用户函数的要求执行相应的操作。

硬件层:硬件设备,当用户需要操作硬件时,内核会根据驱动接口操作硬件设备

 

图结构如下:

 

 

举一个相对比较邪恶的类比:

在深圳的酒店经常会在门缝看到一些卡片,上面说可以通过打电话送货上门提供某中服务。


xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx


.内核代码树介绍

 

linux-2.6.29

|-arch : 包含和硬件体系结构相关的代码

|-block : 硬盘调度算法,不是驱动

|-firmware : 固件,如BOIS

|-Documentation: 标准官方文档

|-dirver : linux设备驱动

|-fs : 内核所支持的文件体系

|-include :头文件。linux/module.h linux/init.h 常用库。

|-init :库文件代码,C库函数在内核中的实现。

init/main.c ->start_kernel->内核执行第一条代码

|-ipc : 进程件通信

|-mm :内存管理

|-kernel : 内核核心部分,包括进程调度等

|-net :网络协议

|-sound : 所有音频相关

|

 

其中,跟设备驱动有关并且经常查阅的文件夹有:

init

include : linux, asm-arm

drivers:

arch:

 

xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx


.内核补丁:

补丁一般都是基于某个版本内核生成的,用于升级旧内核。

打补丁需要注意:

1.对应版本的补丁只能用于对应版本的内核。

2.如果在已打补丁的内核再打补丁,需要先卸载原来补丁。

打补丁的方法:

1.制作补丁:

diff -Nur linux-2.6.30/ linux-2.6.30.1/ > linux-2.6.30.1.patch

//N为新加的文件全部修改

//linux-2.6.30 旧版本

//linux-2.6.30.1 新版本

//目标补丁

2.打补丁:

cd linux-2.6.30 //!!注意在原文件夹的目录中打补丁

patch -p1 <../linux-2.6.30.1.patch //-p1是忽略一级目录

3.恢复&#xff1a;

cd linux-2.6.30 //&#xff01;&#xff01;注意在原文件夹的目录中打补丁

patch -R <../linux-2.6.30.1.patch //撤销补丁


xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx


.内核中的Makefile&#xff1a;

对于内核&#xff0c;Makefile分为5类&#xff1a;

Documentation/kbuild/makefiles.txt描述如下&#xff1a;

50 The Makefiles have five parts:

51

52 Makefile Makefile&#xff0c;控制内核的编译

53 .config 内核配置文件&#xff0c;配置内核时生成&#xff0c;如make menuconfig

54 arch/$(ARCH)/Makefile 对应体系结构的Makefile

55 scripts/Makefile.* Makefile共用的规则

56 kbuild Makefiles 各子目录下的Makefile&#xff0c;被上层的Makefile调用。

 

简单来说&#xff0c;编译内核会执行以下两步骤&#xff0c;它们分别干了以下的事情。

1一般的&#xff0c;我们会拷贝一个对应体系结构的配置文件到主目录下并改名为 .config&#xff0c;这样就在make menuconfig生成的图形配置中已经有了一些默认的配置&#xff0c;减少用户的劳动量。不过这一步不做也没关系的。

2.make menuconfig

2.1、由总Makefile决定编译的体系结构(ARCH). 编译工具(CROSS_COMPILE)&#xff0c;并知道需要进去哪些内核根下的哪些目录进行编译。

2.2、由arch/$(ARCH)/Makefile,决定arch/$(ARCH)下还有的哪些目录和文件需要编译。

2.3、知道了需要编译的目录后&#xff0c;递归的进入哪些目录下&#xff0c;读取每一个Kconfig的信息&#xff0c;生成了图形配置的界面。

2.4、通过我们在图形配置界面中选项为[*][M]或者[]

2.5、保存并退出配置&#xff0c;会根据配置生成一份新的配置文件.config&#xff0c;并在同时生成include/config/auto.conf&#xff08;这是.config的去注释版&#xff09;。文件里面保存着CONFIG_XXXX等变量应该取y还是取m

3.make

3.1、根据Makefile包含的目录和配置文件的要求&#xff0c;进去个子目录进行编译&#xff0c;最后会在各子目录下生成一个.o或者.a文件&#xff0c;然后总Makefile指定的连接脚本 arch/$(ARCH)/kernel/vmlinux.lds生成vmlinux&#xff0c;并通过压缩编程bzImage&#xff0c;或者按要求在对应的子目录下编译成模块。。

 

但是&#xff0c;具体是怎么生成配置文件的呢&#xff1f;

注&#xff1a;我使用的内核是2.6.29

1.在总Makefile中&#xff0c;根据以下语句进入需要编译的目录

470 # Objects we will link into vmlinux / subdirs we need to visit

471 init-y :&#61; init/

472 drivers-y :&#61; drivers/ sound/ firmware/

473 net-y :&#61; net/

474 libs-y :&#61; lib/

475 core-y :&#61; usr/

476 endif # KBUILD_EXTMOD

639 core-y &#43;&#61; kernel/ mm/ fs/ ipc/ security/ crypto/ block/

上面说明了&#xff0c;根目录下的initdriversoundfirmwarenetlibusr等目录&#xff0c;在编译时都会进去读取目录下的Makefile并进行编译。

 

2.在总Makefile中包含的目录还是不够的&#xff0c;内核还需要根据对应的CPU体系架构&#xff0c;

决定还需要将哪些子目录将要编译进内核。在总Makefile中有一个语句&#xff1a;

529 include $(srctree)/arch/$(SRCARCH)/Makefile //在这里&#xff0c;我定义SRCARCH &#61; arm

可以看出&#xff0c;在总Makefile中进去读取相应体系结构的Makefile->arch/$(SRCARCH)/Makefile

 

arch/$(SRCARCH)/Makefile中指定arch/$(SRCARCH)路径下的哪些子目录需要被编译。

arch/arm/Makefile 下&#xff1a;

95 head-y :&#61; arch/arm/kernel/head$(MMUEXT).o arch/arm/kernel/init_task.o

187 # If we have a machine-specific directory, then include it in the build.

188 core-y &#43;&#61; arch/arm/kernel/ arch/arm/mm/ arch/arm/common/

189 core-y &#43;&#61; $(machdirs) $(platdirs)

190 core-$(CONFIG_FPE_NWFPE) &#43;&#61; arch/arm/nwfpe/

191 core-$(CONFIG_FPE_FASTFPE) &#43;&#61; $(FASTFPE_OBJ)

192 core-$(CONFIG_VFP) &#43;&#61; arch/arm/vfp/

193

194 drivers-$(CONFIG_OPROFILE) &#43;&#61; arch/arm/oprofile/

195

196 libs-y :&#61; arch/arm/lib/ $(libs-y)

上面看到&#xff0c;指定需要进入arch/arm/kernel/arch/arm/mm/arch/arm/common/ 等目录编译&#xff0c;至于core-ycore-$(CONFIG_FPE_NWFPE)这些是什么东西呢&#xff1f;


其中&#xff0c;y表示编译成模块&#xff0c;m表示编译进内核(上面没有&#xff0c;因为默认情况下ARM全部编译进内核)&#xff0c;但$(CONFIG_OPROFILE)又是什么呢&#xff1f;这些是根据用户在make menuconfig中设置后&#xff0c;生成的值赋给了CONFIG_OPROFILE


3.make menuconfig后的配置信息是怎么来的&#xff1f;

这是由各子目录下的Kconfig提供选项功用户选择并配置。

arch/arm/Kconfig。所有的配置都是根据arch/$(ARCH)/Kconfig文件通过Kconfig的语法source读取各个包含的子目录Kconfig来生成一个配置界面。每个Makefile目录下都有一个对应的Kconfig文件&#xff0c;用于生成配置界面来给用户决定内核如何配置&#xff0c;配置后会确定一个。 CONFIG_XXX的的值&#xff08;如上面的CONFIG_OPROFILE&#xff09;&#xff0c;来决定编译进内核&#xff0c;还是编译成模块或者不编译。

如在arch/arm/Kconfig下&#xff1a;

595 source "arch/arm/mach-clps711x/Kconfig"

596

597 source "arch/arm/mach-ep93xx/Kconfig"

598

599 source "arch/arm/mach-footbridge/Kconfig"

600

601 source "arch/arm/mach-integrator/Kconfig"

602

603 source "arch/arm/mach-iop32x/Kconfig"

604

605 source "arch/arm/mach-iop33x/Kconfig"

这些就是用来指定&#xff0c;需要读取以下目录下的Kconfig文件来生成一个使用make menuconfig时的配置界面。

至于子目录下的Kconfig是怎么样的&#xff0c;待会介绍。

总结Kconfig的作用&#xff1a;

3.1.make menuconfig下可以配置选项;

3.2..config中确定CONFIG_XXX的的值。


4.只是读取以上的两个Makefile还是不够了&#xff0c;内核还会把包含的子目录一层一层的读取它里面的MakefileKconfig


上面啰啰嗦嗦地讲了这么久&#xff0c;无非就是想说&#xff0c;内核的编译并不是一个Makefile搞定的&#xff0c;需要通过根目录下的总Makefile来包含一下子Makefile&#xff08;不管是根目录下的子目录还是/arch/arm中的子目录&#xff09;。而Kconfig&#xff0c;为用户提供一个交互界面来选择如何配置并生成配置选项。


xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx


五、子目录下的MakefileKconfig


上面我一直介绍的都是两个比较大的Makefile——Makefilearch/$(ARCH)/Makefile。接下来看一下实例。


一、makefile中&#xff0c;y表示编译进内核&#xff0c;m表示编译成模块&#xff0c;不写代表不编译。所以&#xff0c;配置最简单的方法就是&#xff0c;直接修改子目录的Makefile

先看看arch/arm/Makefile&#xff1a;

/*arch/arm/mach-s3c2440/Makefile */

12 obj-$(CONFIG_CPU_S3C2440) &#43;&#61; s3c2440.o dsc.o

13 obj-$(CONFIG_CPU_S3C2440) &#43;&#61; irq.o

14 obj-$(CONFIG_CPU_S3C2440) &#43;&#61; clock.o //配置2440的时钟进入模块

15 obj-$(CONFIG_S3C2440_DMA) &#43;&#61; dma.o

如果我要取消s3c2440的时钟(当然这是必须要开的&#xff0c;只是举例)。可以直接修改arch/arm/mach-s3c2440/Makefile obj-$( CONFIG_CPU_S3C2440) &#43;&#61; clock.o改为

obj- &#43;&#61; clock.o

如果你想编译成模块也可以修改成&#xff1a;

obj-m &#43;&#61; clock.o

在这里 CONFIG_CPU_S3C2440的值默认是y&#xff0c;所以内核是要将时钟编译进内核的。也许有人会问&#xff0c;那我直接修改 CONFIG_CPU_S3C2440的值为m不就可以将时钟编译成模块了&#xff0c;何必修改Makefile这么麻烦呢&#xff1f;的确是这样&#xff0c;只要我们通过在”make menuconfig”的界面中配置后就能够改变 CONFIG_CPU_S3C2440的值。接下来看看如何实现。


二、在一般的编译内核时&#xff0c;我们都是通过”make menuconfig”进入图形界面面配置的&#xff0c; 接下来我实现一下如何将一个选项加入到图形配置界面中。

看看具体实现的步骤&#xff1a;

以下的执行环境是在PC机上&#xff0c;我使用的内核是linux-2.6.29&#xff1a;

2.1.进入内核目录

cd linux-2.6.29

2.2. driver目录下模拟一个名为test1驱动的文件夹

mkdir driver/test1

2.3. 在目录下随便些一个C文件&#xff0c;只要不报错。

vim test1.c

我的test1.c如下&#xff1a;

1 void foo()

2 {

3   ;

4 }

2.4vim Makefile //在目录下编写一个简单的Makefile

Makefile文件编写如下&#xff1a;

obj-$(CONFIG_TEST1) &#43;&#61; test1.o

CONFIG_TEST1是决定test1是否编译进内核或者编译成模块的。这就是通过同一目录下的Kconfig来在配置界面中生成选项&#xff0c;由用户在make menuconfig中选择。

2.5所以还要同一目录下写一个Kconfig&#xff1a;

vim Kconfig

Kconfig修改如下&#xff1a;

menu "test1 driver here" //这是在图形配置显示的

config TEST1

bool "xiaobai test1 driver" //这同样也是在图形配置显示的

help

This is test1 //这个也是在图形配置显示的。

说白了&#xff0c;就是在图形配置的driver下多了一个配置选项&#xff0c;用户配置后将 CONFIG_TEST1的值存放在.config中&#xff0c;Makefile通过读取.config的去注释版include/config/auto.conf读取到CONFIG_TEST的值&#xff0c;再进行编译。


但是&#xff0c;以上几步还不能达到目的&#xff0c;因为虽然在总Makefile中已经包含了目录driver,但是driver目录的Makefile中并没有包含test目录。因此需要在driver/Makefile中添加&#xff1a;

103 obj-$(CONFIG_PPC_PS3) &#43;&#61; ps3/

104 obj-$(CONFIG_OF) &#43;&#61; of/

105 obj-$(CONFIG_SSB) &#43;&#61; ssb/

106 obj-$(CONFIG_VIRTIO) &#43;&#61; virtio/

107 obj-$(CONFIG_STAGING) &#43;&#61; staging/

108 obj-y &#43;&#61; platform/

109 obj-$(CONFIG_TEST1) &#43;&#61; test1/ //这是我添加的

虽然Makefile中已经包含了&#xff0c;但这样还是不行。因为当需要配置ARM时&#xff0c; ARM结构下的Kconfig并没有包含testKconfig这样的话就不会出现在图形配置界面中&#xff0c;因此在arch/arm/Kconfig中添加&#xff1a;

1230 menu "Device Drivers" //要在Device Drivers这个选项里面添加

1231

1232 source "drivers/base/Kconfig"

1233

1234 source "drivers/connector/Kconfig"

。。。。。。。。

1330 source "drivers/test/Kconfig" //这是我添加的

1331

1332 endmenu

 

大功告成&#xff01;

这样&#xff0c;make menuconfig界面写的Driver Devices下就多了一个 "test1 friver here"的目录&#xff0c;里面有一个配置选项"xiaobai test1 driver"

 

 

Kconfig文件的语法在documentation/kbuild/kconfig-language.txt文件中有详细的讲解&#xff0c;上面我只是简单实现了一下&#xff0c;都是皮毛。


xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx


.内核和模块的编译

 

编译内核很简单&#xff0c;只需要配置完毕后执行make命令&#xff0c;将指定的文件编译进内核

bzImage或者编译成模块。

make &#61; make bzImage &#43; make modules

因此如果值编译内核&#xff0c;即只编译配置文件中-y选项&#xff0c;可以直接用命令

make bzImage

如果值编译模块&#xff0c;即只编译配置文件中的-m选项&#xff0c;可以之直接使用命令

make modules

模块可以编译当然也可以清除&#xff0c;使用命令

make modules clean

如果只想单独编译一个模块&#xff0c;可以使用命令

make M&#61;drivers/test/ modules //只单独编译drivers/test中的.ko

make M&#61;drivers/test/ modules clean //清除

上面的是在内核目录下的操作&#xff0c;但当我写驱动时&#xff0c;我并不可能在内核目录下编

写&#xff0c;但我编译时却要依赖内核中的规则和Makefile&#xff0c;所以就有了以下的方法&#xff0c;

同时这也是一般的编写驱动时Makefile的格式。

指定内核Makefile并单独编译

make -C /root/linux-2.6.29 M&#61;&#96;pwd&#96; module

make -C /root/linux-2.6.29 M&#61;&#96;pwd&#96; module clean

//-C 指定内核Makefile的路径&#xff0c;可以使用相对路径。

//-M 指定要编译的文件的路径&#xff0c;同样课使用相对路径。

编译生成的模块可以指定存放的目录

make -C /root/linux-2.6.29 M&#61;&#96;pwd&#96; modules_install INSTALL_MOD_PATH&#61;/nfsroot


xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx


七、总结


说了这么久估计都说糊涂了&#xff0c;其实我只是想表达一下内核编译时大体上究竟是怎么样的一个过程。

我以编译S3C2440的内核为例再说一遍&#xff1a;

1一般我们会想将一份S3C2440的默认配置拷贝到内核跟目录下并改名为.config

2.make menuconfig

2.1、由总Makefile决定编译的体系结构(ARCH). 编译工具(CROSS_COMPILE)&#xff0c;并知道需要进去哪些内核根下的哪些目录进行编译。

2.2、由arch/$(ARCH)/Makefile,决定arch/$(ARCH)下还有的哪些目录和文件需要编译。

2.3、知道了需要编译的目录后&#xff0c;递归的进入哪些目录下&#xff0c;读取每一个Kconfig的信息&#xff0c;生成了图形配置的界面。

2.4、通过我们在图形配置界面中选项为[*][M]或者[]

2.5、保存并退出配置&#xff0c;会根据配置生成一份新的配置文件.config&#xff0c;并在同时生成include/config/auto.conf&#xff08;这是.config的去注释版&#xff09;。文件里面保存着CONFIG_XXXX等变量应该取y还是取m

3.make

3.1、根据Makefile包含的目录和配置文件的要求&#xff0c;进去个子目录进行编译&#xff0c;最后会在各子目录下生成一个.o或者.a文件&#xff0c;然后总Makefile指定的连接脚本 arch/$(ARCH)/kernel/vmlinux.lds生成vmlinux&#xff0c;并通过压缩编程bzImage&#xff0c;或者按要求在对应的子目录下编译成模块

xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

源代码&#xff1a; 1st_kernel.rar   


转:https://www.cnblogs.com/superlcc/archive/2012/08/07/2626582.html



推荐阅读
  • Nginx使用AWStats日志分析的步骤及注意事项
    本文介绍了在Centos7操作系统上使用Nginx和AWStats进行日志分析的步骤和注意事项。通过AWStats可以统计网站的访问量、IP地址、操作系统、浏览器等信息,并提供精确到每月、每日、每小时的数据。在部署AWStats之前需要确认服务器上已经安装了Perl环境,并进行DNS解析。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • Webpack5内置处理图片资源的配置方法
    本文介绍了在Webpack5中处理图片资源的配置方法。在Webpack4中,我们需要使用file-loader和url-loader来处理图片资源,但是在Webpack5中,这两个Loader的功能已经被内置到Webpack中,我们只需要简单配置即可实现图片资源的处理。本文还介绍了一些常用的配置方法,如匹配不同类型的图片文件、设置输出路径等。通过本文的学习,读者可以快速掌握Webpack5处理图片资源的方法。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • Ubuntu 9.04中安装谷歌Chromium浏览器及使用体验[图文]
    nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
  • imx6ull开发板驱动MT7601U无线网卡的方法和步骤详解
    本文详细介绍了在imx6ull开发板上驱动MT7601U无线网卡的方法和步骤。首先介绍了开发环境和硬件平台,然后说明了MT7601U驱动已经集成在linux内核的linux-4.x.x/drivers/net/wireless/mediatek/mt7601u文件中。接着介绍了移植mt7601u驱动的过程,包括编译内核和配置设备驱动。最后,列举了关键词和相关信息供读者参考。 ... [详细]
  • Linux环境变量函数getenv、putenv、setenv和unsetenv详解
    本文详细解释了Linux中的环境变量函数getenv、putenv、setenv和unsetenv的用法和功能。通过使用这些函数,可以获取、设置和删除环境变量的值。同时给出了相应的函数原型、参数说明和返回值。通过示例代码演示了如何使用getenv函数获取环境变量的值,并打印出来。 ... [详细]
  • 预备知识可参考我整理的博客Windows编程之线程:https:www.cnblogs.comZhuSenlinp16662075.htmlWindows编程之线程同步:https ... [详细]
  • 本文介绍了在CentOS上安装Python2.7.2的详细步骤,包括下载、解压、编译和安装等操作。同时提供了一些注意事项,以及测试安装是否成功的方法。 ... [详细]
  • VueCLI多页分目录打包的步骤记录
    本文介绍了使用VueCLI进行多页分目录打包的步骤,包括页面目录结构、安装依赖、获取Vue CLI需要的多页对象等内容。同时还提供了自定义不同模块页面标题的方法。 ... [详细]
  • 本文介绍了在CentOS 6.4系统中更新源地址的方法,包括备份现有源文件、下载163源、修改文件名、更新列表和系统,并提供了相应的命令。 ... [详细]
author-avatar
Stupid锋_891
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有