linux嵌入式编程高手历程系列6-定制uboot和文件系统_dhcpc menuconfig-程序员宅基地

技术标签: linux嵌入式编程高手历程  脚本  linux  makefile  编程  cmd  嵌入式  

一uboot

1。uboot增加自己的命令

原理:
每个命令都有一个命令结构体
struct cmd_tbl_s {
char*name;  /* Command Name*/
intmaxargs; /* maximum number of arguments*/
intrepeatable; /* autorepeat allowed?*/
int       (*cmd)(struct cmd_tbl_s *, int, int, char *[]);                                /* Implementation function*/
char*usage;/* Usage message(short)*/
char*help;/* Help  message(long)*/
};
去定义它。Cmd为要调用的命令函数!name为该命令名字符串。

在u-boot里面有这样的宏
#define Struct_Section  __attribute__ ((unused,section (".u_boot_cmd")))

#define U_BOOT_CMD(name,maxargs,rep,cmd,usage,help) /
cmd_tbl_t __u_boot_cmd_##name Struct_Section = {#name, maxargs, rep, cmd, usage, help}

宏U_BOOT_CMD(name,maxargs,rep,cmd,usage,help)就是将
cmd_tbl_s{
name,
maxargs,
rep,
cmd,
usage,
help
}这样的一个命令结构体放入内存.u_boot_cmd这个区域,.u_boot_cmd这个域在board/smdk2410/u-boot.lds中定义!在U-boot中的shell中,根据用户输入的命令,就会在.u_boot_cmd这个内存区域中查找,当.u_boot_cmd中某一个cmd_tbl_s命令结构体的cmd_tbl_s.name和输入的命令字符串相符时,就调用该命令
结构体的cmd_tbl_s.cmd( ….)函数!


怎样添加命令函参数!
下面以添加USB下载命令为例!

a
在include/configs/smdk2410.h中的CONFIG_COMMDNDS中增加一项:
CFG_CMD_USBLOAD,

/***********************************************************
* Command definition
***********************************************************/
#define CONFIG_COMMANDS /
(CONFIG_CMD_DFL | /
CFG_CMD_CACHE | /
CFG_CMD_NET | /
CFG_CMD_ENV | /
CFG_CMD_FLASH | /
CFG_CMD_PING | /
CFG_CMD_NAND | /
/*CFG_CMD_EEPROM |*/ /
/*CFG_CMD_I2C |*/ /
/*CFG_CMD_USB |*/ /
CFG_CMD_REGINFO  | /
CFG_CMD_DATE | /
CFG_CMD_USBLOAD |/
CFG_CMD_ELF)

b
在include/cmd_confdefs.h中加入命令标志位

#define CFG_CMD_USBLOAD0x00000055ULL (可以是其它值,不冲突就好)

c
在common/下面加入usbload.c
框架如下

#If(CONFIG_COMMANDS & CFG_CMD_USBLOAD)

Int usb_load(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[ ] )
{
    ………………….

}

U_BOOT_CMD{
Usbload,
2,
1,
          usb_load,
         “usb load img file”,
         “This is a test”
};
#endif

d
在common/Makefile 添加要编译的目标文件
e
重新编译u-boot,就OK啦!

参考:http://www.cublog.cn/u/17660/showart.php?id=279308

2。uboot增加对gpio,mii phy寄存器的设置

 

二。文件系统

dhcpc和httpd在busybox的menuconfig中可以选择安装。但是,我们的busybox工具包是方案直接提供的,目前没有时间重头定制。因此选用了源代码交叉编译来得到。

1。busybox

下载busybox1.10.0

make menuconfig //选择需要安装的部件

make ARCH=mips CROSS_COMPILE=mips-linux-  //交叉编译

make install

会出现一个_install目录,拷贝相应文件到文件系统中即可。

编译新的busybox,必须在Makefile中指定ARCH=arm,如果只是在编译的时候指定
make CROSS_COMPILE=arm-linux- ARCH=arm
那么make install的时候会重新编译,得到的busybox是i386架构的,从而导致cp生成的cmd到rootfs处时,系统启动时候会提示: request_module: runaway loop modprobe binfmt-464

2。dhcpc

从busybox网站下载dhcpc包,http://udhcp.busybox.net/

交叉编译.拷贝至/sbin/

拷贝example下面的simple.script 至文件系统的/usr/share/udhcpc/,更改文件名字为default.script

 如此系统启动的时候将自动运行dhcp来获取ip地址

 3。boa。

1)下载Boa源码

下载地址: http://www.boa.org/, 或者http://sourceforge.net/:

boa-0.94.13.tar.gz,解压:# tar zxvf boa-0.94.13.tar.gz

2)生成Makefile文件

# cd boa-0.94.13

# src/configure

3)修改Makefile文件,编译

# cd boa-0.94.13/src

修改Makefile文件:修改 CC=gcc 为CC=/usr/local/arm/2.95.3/bin/arm-linux-gcc

             修改 CPP=gcc -E为CPP=/usr/local/arm/2.95.3/bin/arm-linux-gcc –E

make

在编译时有可能会提示查不到“yacc等等的软件,. 请安装bison(yacc的GNU版本)和flex

# mips-linux-strip boa

 4)boa的配置

进入制作的根文件夹

# mkdir /etc/boa

# cp / boa-0.94.13/boa.conf  /etc/boa/

修改boa.conf:

1、        Group的修改:修改 Group nogroup 为Group 0

由于在/etc/group文件中没有nogroup组,所以设成0。另外在/etc/passwd中有nobody用户,所以User nobody不用修改。

2、scriptAlias的修改:修改 scriptAlias /cgi-bin/   /usr/lib/cgi-bin/

为 scriptAlias /cgi-bin/   /var/www/cgi-bin/

3、ServerName的设置:修改 #ServerName http://www.your.org.here/

为 ServerName http://www.your.org.here/

注意:该项默认为未打开,执行Boa会异常退出,提示“gethostbyname::No such file or directory”,所以必须打开。其它默认设置即可。

5)boa的执行

进入制作的根文件夹

# mkdir /var/log

# mkdir /var/log/boa(创建日志文件目录)

# mkdir /var/www (创建HTML文档的主目录)

可以将主机 /usr/share/doc/HTML/目录下的index.html文件和img目录复制到/var/www目录下,将主机/etc目录下的mime.types文件放置到制作的根文件夹的/etc下

最后将boa-0.94.13下的boa可执行文件拷贝到bin下面。

 参考:http://www.linuxidc.com/Linux/2007-09/7697.htm

 4.thttpd

http://www.acme.com/software/thttpd/ 下载thttpd

./configure

vi Makefile
CC= mips-linux-gcc

make ARCH=mips CROSS_COMPILE=mips-linux-

配置

拷贝thttpd二进制可执行文件到根文件系统/root/目录中
修改thttpd配置文件

vi thttpd.conf

# This section overrides defaults
dir=/www  #指明WebServer存放网页的根目录路径
chroot
user=root #以root身份运行thttpd
logfile=/var/log/thttpd.log #日志文件路径
pidfile=/var/run/thttpd.pid #pid文件路径
port=8080


拷贝thttpd.conf配置文件到根文件系统的/etc/目录,

执行:/root/thttpd -C /et/thttpd.conf

 参考: http://blog.csdn.net/zhulingchen/archive/2007/02/02/1501134.aspx

5.busybox自带的httpd

使用了busybox自带的httpd之后,boa以及thttpd都被我扫进了历史的垃圾堆

参考:http://pank.org/blog/2003/08/busybox-10-httpd.html

基本用法: httpd -h /documentroot -c /etc/httpd.conf

一句话,搭建httpd太方便了

如果网页需要认证,在/etc/httpd.conf里加入:
/:admin:adminpass

 三 busybox

1。向 BusyBox 中添加新命令

向 BusyBox 添加一个新命令非常简单,这是因为它具有良好定义的体系结构。第一个步骤是为新命令的源代码选择一个位置。我们要根据命令的类型(网络,shell 等)来选择位置,并与其他命令保持一致。这一点非常重要,因为这个新命令最终会在 menuconfig 的配置菜单中出现(在下面的例子中,是 Miscellaneous Utilities 菜单)。

对于这个例子来说,我将这个新命令称为 newcmd,并将它放到了 ./miscutils 目录中。这个新命令的源代码如清单 13 所示。

清单 1. 集成到 BusyBox 中的新命令的源代码

 

      
      #include "busybox.h"
int newcmd_main( int argc, char *argv[] )
{
  int i;
  printf("newcmd called:/n");
  for (i = 0 ; i < argc ; i++) {
    printf("arg[%d] = %s/n", i, argv[i]);
  }
  return 0;
}

接下来,我们要将这个新命令的源代码添加到所选子目录中的 Makefile.in 中。在本例中,我更新了 ./miscutils/Makefile.in 文件。请按照字母顺序来添加新命令,以便维持与现有命令的一致性:

清单 2. 将命令添加到 Makefile.in 中

 

      
      MISCUTILS-$(CONFIG_MT)          += mt.o
MISCUTILS-$(CONFIG_NEWCMD)   += newcmd.o
MISCUTILS-$(CONFIG_RUNLEVEL)    += runlevel.o

接下来再次更新 ./miscutils 目录中的配置文件,以便让新命令在配置过程中是可见的。这个文件名为 Config.in,新命令是按照字母顺序添加的:

清单 3. 将命令添加到 Config.in 中

 

      
      config CONFIG_NEWCMD
	bool "newcmd"
	default n
	help
	  newcmd is a new test command

这个结构定义了一个新配置项(通过 config 关键字)以及一个配置选项(CONFIG_NEWCMD)。新命令可以启用,也可以禁用,因此我们对配置的菜单属性使用了 bool (Boolean)值。这个命令默认是禁用的(n 表示 No),我们可以最后放上一个简短的 Help 描述。在源代码树的 ./scripts/config/Kconfig-language.txt 文件中,我们可以看到配置语法的完整文法。

接下来需要更新 ./include/applets.h 文件,使其包含这个新命令。将下面这行内容添加到这个文件中,记住要按照字母顺序。维护这个次序非常重要,否则我们的命令就会找不到。

清单 4. 将命令添加到 applets.h 中

 

      
      USE_NEWCMD(APPLET(newcmd, newcmd_main, _BB_DIR_USER_BIN, _BB_SUID_NEVER))

这定义了命令名(newcmd),它在 Busybox 源代码中的函数名(newcmd_main),应该在哪里会为这个新命令创建链接(在这种情况中,它在 /usr/bin 目录中),最后这个命令是否有权设置用户 id(在本例中是 no)。

倒数第二个步骤是向 ./include/usage.h 文件中添加详细的帮助信息。正如您可以从这个文件的例子中看到的一样,使用信息可能非常详细。在本例中,我只添加了一点信息,这样就可以编译这个新命令了:

清单 5. 向 usage.h 添加帮助信息

 

      
      #define newcmd_trivial_usage	"None"
#define newcmd_full_usage	"None"

最后一个步骤是启用新命令(通过 make menuconfig,然后在 Miscellaneous Utilities 菜单中启用这个选项)然后使用 make 来编译 BusyBox。

使用新的 BusyBox,我们可以对这个新命令进行测试,如清单 18 所示。

清单 6. 测试新命令

 

      
      $ ./busybox newcmd arg1
newcmd called:
arg[0] = newcmd
arg[1] = arg1
$ ./busybox newcmd --help
BusyBox v1.1.1 (2006.04.12-13:47+0000) multi-call binary

Usage: newcmd None

None

就是这样!BusyBox 开发人员开发了一个优秀但非常容易扩展的工具。

参考:http://www.xxlinux.com/linux/article/development/embed/20060918/4364.html

2。完善文件系统
参考一个正常的Linux系统就会发现,busybox建立的文件系统还缺少很多文件。下面三行命令建立了常见UNIX系统中包含的一些目录,虽然它们不全是必需的,但建立它们更符合标准一些。这些命令都是在新文件系统的根目录中执行的,第三条命令的执行还必须要有root权限。mkdir mnt root var tmp proc boot etc lib
mkdir /var/{lock,log,mail,run,spool}
chown 0:0R *如果busybox采用了动态链接的方式编译,还需要把busybox所需要的动态库:libcrypt.so.1、libc.so.6、ldlinux.so.2放到lib目录中。最好按照标准的方式建立相应的文件和链接,可以参考下面的列表:-rwxrwxrwx 192519ld-2.3.2.so
lrwxrwxrwx 111ld-linux.so.2 -> ld-2.3.2.so
-rwxrwxrwx 1 1190032libc-2.3.2.so
lrwxrwxrwx 113libc.so.6 -> libc-2.3.2.so
-rwxr-xr-x 118348libcrypt-2.3.2.so
lrwxrwxrwx 117libcrypt.so.1 -> libcrypt-2.3.2.so3.2编写 etc文件夹下的文件
etc文件夹是许多系统配置文件保存的地方。这些文件非常重要,如果配置错误,就可能影响系统的启动。busybox源代码example/bootfloopy/etc目录中的文件算是一个简单的例子,可以把其中的文件拷贝过来作为基础。(在example/bootfloopy目录中的一些脚本和文档也很值得阅读)
首先inittab文件是系统启动后所访问的第一个脚本文件,后续启动的文件都由它指定。这个文件的格式和普通微机Linux上的inittab是有区别的,其具体含义可以参考busybox的文档。下面是一个比较简单的例子:::sysinit:/etc/init.d/rcS
tty0::respawn:/sbin/getty 38400 tty0
tty2::askfirst:/bin/sh
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount ar
::shutdown:/bin/mount / o remount,ro其中第一行指定了系统的启动脚本为/etc/init.d/rcS;第二行指定在第一个虚拟终端打开一个登录会话;第三行指定在第三个虚拟终端打开一个无须登录验证的shell;第四行指定了当按下ctrl+alt+del组合键时的执行命令;最后两行指定了关机时执行的操作。
fstab文件定义了文件系统的各个“挂接点”,需要与实际的系统相配合。一个简单的fstab文件如下:proc/procprocdefaults00
/dev/hda1/ext2rw,noauto01
devpts/dev/ptsdevptsdefaults00其中第三行是为UNIX PTYs准备的,telnetd要用到。
profile文件是终端登录之后首先运行的脚本,这里可以不去管它。我们比较关心的是系统在无人登录的情况下有哪些程序要执行。从inittab文件可以看出系统启动之后要运行/etc/init.d/rcS脚本,需要启动的程序和需要进行的设置都可以写在这里面。一个可能的rcS文件如下:#! /bin/sh
echo e 'Starting System'
ifconfig lo 127.0.0.1
ifconfig eth0 192.168.0.100
hostname F /etc/hostname
/bin/mount / o remount,rw
/bin/mount /proc
/bin/mount /dev/pts
/usr/sbin/telnetd
dmesg > /var/log/dmesg为了满足终端登录用户验证的要求,etc目录下还需要有passwd、group和shadow (在编译busybox时如果不选择shadow功能将不需要这个文件)。这些文件至少要包含 root用户的定义,如下所示:passwd:
root:x:0:0:root:/root:/bin/sh
group:
root:x:0:
shadow:
root::12179:0:99999:7:::其中,如果shadow (对于不支持shadow的系统则是passwd )文件的第一个冒号和第二个冒号之间没有内容,表示这个用户登录不需要密码。如果需要设定密码或者增加新的登录用户,就可以参考开发主机上的相应文件,或者在目标系统启动之后用passwd命令和adduser命令完成。
最后还可以给目标机起一个名字,在/etc目录下建立文件hostname,将起好的名字写到里面。前面介绍的启动脚本rcS,通过hostname命令把文件的内容设置为机器名。
文件系统的安装随着应用环境的不同差别比较大。在嵌入式环境中,一般只要通过特殊的打包工具将文件系统打包,并烧录到非易失性存储器中就可以了。例如,对于JFFS2类型的文件系统就可以用mkfs.jffs2命令生成文件系统的映像。
文件系统安装之后重新启动目标设备,应该就可以使用新建立的文件系统了。如果系统启动失败,则可以通过内核消息查找错误的原因。如果错误信息提示不能正确挂载文件系统,问题可能出在启动引导装载程序(bootloader)上。文件系统比较容易出问题的是用户的验证和动态链接库的加载。最简单的检测办法是把busybox编译为静态链接并设置内核参数init=/bin/sh来躲开对用户登录的验证。
3。linux的启动

Linux有自己一套完整的启动体系,抓住了linux启动的脉络,linux的启动过程将不再神秘。我们可以按需要来手动添加和删除我们需要的应用服务。

本文中假设inittab中设置的init tree为:

/etc/rc.d/rc0.d

/etc/rc.d/rc1.d

/etc/rc.d/rc2.d

/etc/rc.d/rc3.d

/etc/rc.d/rc4.d

/etc/rc.d/rc5.d

/etc/rc.d/rc6.d

/etc/rc.d/init.d

1). 关于linux的启动

init是所有进程之父

init读取/etc/inittab,执行rc.sysinit脚本

(注意文件名是不一定的,有些unix甚至会将语句直接写在inittab中)

rc.sysinit脚本作了很多工作:

init $PATH

config network

start swap function

set hostname

check root file system, repair if needed

check root space

....

rc.sysinit根据inittab执行rc?.d脚本

linux是多用户系统,getty是多用户与单用户的分水岭

在getty之前运行的是系统脚本

2). 关于rc.d

所有启动脚本放置在 /etc/rc.d/init.d下

rc?.d中放置的是init.d中脚本的链接,命名格式是:

S{number}{name}

K{number}{name}

S开始的文件向脚本传递start参数

K开始的文件向脚本传递stop参数

number决定执行的顺序

3). 启动脚本示例

这是一个用来启动httpd的 /etc/rc.d/init.d/apache 脚本:

     
     CODE:

#!/bin/bash

source /etc/sysconfig/rc
source $rc_functions

case "$1" in
    start)
          echo "Starting Apache daemon..."
          /usr/local/apache2/bin/apachectl -k start
          evaluate_retval
          ;;

    stop)
          echo "Stopping Apache daemon..."
          /usr/local/apache2/bin/apachectl -k stop
          evaluate_retval
          ;;

    restart)
          echo "Restarting Apache daemon..."
          /usr/local/apache2/bin/apachectl -k restart
          evaluate_retval
          ;;

    status)
          statusproc /usr/local/apache2/bin/httpd
          ;;
          
    *)
          echo "Usage: $0 {start|stop|restart|status}"
          exit 1
          ;;
esac
[Copy to clipboard]
可以看出他接受start,stop,restart,status参数

然后可以这样建立rc?.d的链接:

     
     CODE:

cd /etc/rc.d/init.d &&
ln -sf ../init.d/apache ../rc0.d/K28apache &&
ln -sf ../init.d/apache ../rc1.d/K28apache &&
ln -sf ../init.d/apache ../rc2.d/K28apache &&
ln -sf ../init.d/apache ../rc3.d/S32apache &&
ln -sf ../init.d/apache ../rc4.d/S32apache &&
ln -sf ../init.d/apache ../rc5.d/S32apache &&
ln -sf ../init.d/apache ../rc6.d/K28apache
[Copy to clipboard]
4). 关于rc.local

经常使用的 rc.local 则完全是习惯问题,不是标准。

各个发行版有不同的实现方法,可以这样实现:

     
     CODE:

touch /etc/rc.d/rc.local
chmod +x /etc/rc.d/rc.local
ln -sf /etc/rc.d/rc.local /etc/rc.d/rc1.d/S999rc.local &&
ln -sf /etc/rc.d/rc.local /etc/rc.d/rc2.d/S999rc.local &&
ln -sf /etc/rc.d/rc.local /etc/rc.d/rc3.d/S999rc.local &&
ln -sf /etc/rc.d/rc.local /etc/rc.d/rc4.d/S999rc.local &&
ln -sf /etc/rc.d/rc.local /etc/rc.d/rc5.d/S999rc.local &&
ln -sf /etc/rc.d/rc.local /etc/rc.d/rc6.d/S999rc.local
[Copy to clipboard]
5). 关于bash启动脚本

/etc/profile

/etc/bashrc

~/.bash_profile

~/.bashrc

是bash的启动脚本

一般用来设置单用户的启动环境,也可以实现开机单用户的程序,但要明确他们都是属于bash范畴而不是系统范畴。

他们的具体作用介绍如下:

/bin/bash这个命令解释程序(后面简称shell)使用了一系列启动文件来建立一个运行环境:

/etc/profile

/etc/bashrc

~/.bash_profile

~/.bashrc

~/.bash_logout

每一个文件都有特殊的功用并对登陆和交互环境有不同的影响。

/etc/profile 和 ~/.bash_profile 是在启动一个交互登陆shell的时候被调用。

/etc/bashrc 和 ~/.bashrc 是在一个交互的非登陆shell启动的时候被调用。

~/.bash_logout 在用户注销登陆的时候被读取

一个交互的登陆shell会在 /bin/login 成功登陆之后运行。一个交互的非登陆shell是通过命令行来运行的,如[prompt]$/bin/bash。一般一个非交互的shell出现在运行shell脚本的时候。之所以叫非交互的shell,是因为它不在命令行上等待输入而只是执行脚本程序。

6). 关于开机程序的自动启动

系统脚本可以放置在/etc/rc.d/init.d中并建立/etc/rc.d/rc?.d链接,也可以直接放置在/etc/rc.d/rc.local中。

init.d脚本包含完整的start,stop,status,reload等参数,是标准做法,推荐使用。

为特定用户使用的程序(如有的用户需要使用中文输入法而有的不需要)放置在~/中的bash启动脚本中。

参考:http://www.51cto.com/art/200707/52340.htm

 四。利用BusyBox做一个简单的根文件系统

1、下载BusyBox源代码包 http://busybox.net/
2、找个地方解压缩包,例如tar -xjvf busybox-1.00.tar.bz2
3、进入busybox的文件夹,使用make menuconfig进入设置

4、在build options中有一些选项要注意
Build BusyBox as a static binary (no shared libs):如果选择了这个选项,那么BusyBox将被静态编译,也就是不需要动态链接库的支持就能运行,但是这样会使编译后文件的体积增大。
Do you want to build BusyBox with a Cross Compiler:如果你的busybox将要运行机器与编译主机的体系结构不同,比如s3c2410是ARM,与我们的X86主机芯片系统结构不一样,那么这个一定要选上,并且在 Cross Compiler prefix中写上交叉编译器的名字,比如ARM用arm-linux-

5、在Installation Options中 BusyBox installation prefix就是在编译完后运行make install 时,busybox将被安装的地址。

6、其它的选项按照默认选项就行,当然自己也可以看看有没有需要,把其它一些命令加入到编译选项中来
7、完成后保存,然后运行make
8、编译没有问题后运行make install这样编译好的busybox就会自动安装到BusyBox installation prefix中,一般是三个文件夹bin sbin usr和一个文件linuxrc。这样busybox的编译就完成了
9、准备一个空文件夹将BusyBox installation prefix中的东西拷过来,另外再建几个linux需要的文件夹
lib
dev
etc
home
proc
root
tmp
var
mnt
10、在etc文件夹下建一个目录init.d,并且在其中建立一个空文件rcS,在rcS中加上以下内容
#! /bin/sh

PATH=/sbin:/bin:/usr/sbin:/usr/bin
runlevel=S
prevlevel=N
umask 022
export PATH runlevel prevlevel

#
#       Trap CTRL-C &c only in this shell so we can interrupt subprocesses.
#
trap ":" INT QUIT TSTP

/bin/mount -t proc none /proc
11、如果你的busybox是静态编译的,那么一个简单的能使用的根文件系统就这样完成了,但是这个文件系统中没有glibc的动态链接库,除了busybox以外的软件,如果对glibc有依赖,但是又没有静态编译的的话就无法运行。但如果所有的软件都用静态编译的话,那这个文件系统将很大。所以一般推荐软件不要使用静态编译,而使用一个库。
12、如果你不是用静态编译的,那么你需要编译好的glibc的动态链接库。在一般的交叉编译器中都带有已经编译好的库,直接拷过来就行了。

出现Warning: unable to open an initial console.提示,可以在rmadisk中建立
建立console和null试试,不一定非要去修改内核中的devfs去动态创建 
cd /dev
mknod -m 660 console c 5 1
mknod -m 660 null c 1 3

 

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/highlo/article/details/2113730

智能推荐

c语言中main函数是程序的入口,C语言中的main函数为什么被称作程序入口-程序员宅基地

文章浏览阅读2k次。在系统把使用权交给我们的这个过程,就是系统安排我们程序运行的过程,也就是准备进入我们程序的入口函数main或者WinMain的过程。操作系统时刻都在运行中,除非你关机断电了。而负责管理各个程序运行的部分就是系统的调度程序。它一直和交通警察一样的,管理进程的运作。当你双击的exe程序时,系统会检测到你的鼠标的动作,从而进行处理。如果发现你双击的是某个exe,系统发现你想要执行一个程序,便会安排让你的..._man函数是程序的入口

高清修复太感人!百部高清修复版港片上线,AI增强老剧画质_百部经典港片将被4k修复-程序员宅基地

文章浏览阅读1.7k次。在很早之前就说过这个话题,现如今AI修复技术的发展,可以帮助我们修复视频画质,无需专业技术人员,人人都可以利用AI视频修复工具进行模糊视频的修复,无论是老剧、或是很多年前摄影技术还不发达时拍摄的一些纪录片、结婚影像等都是可以修复清晰的。以上就是修复模糊视频画质清晰度的方法了,是不是很简单,利用牛学长AI修复技术只需要简单3步就可以完成视频画质的修复。2、选择AI模型,不同的模型有着不同的修复效果,根据视频场景选择合适的模型,达到更好的修复效果。3、修复完成,就可以导出视频,我们也可以来看看效果吧!_百部经典港片将被4k修复

论文免费ai生成(ai论文模板)-程序员宅基地

文章浏览阅读510次,点赞5次,收藏7次。AIPaperPass是AI原创论文写作平台,免费千字大纲,5分钟生成3万字初稿,提供答辩汇报ppt、开题报告、任务书等,40篇真实中英文知网参考文献,重复率超过10%包退费。AIPaperPass操作流程步骤:第一步、选择专业方向及拟定论文题目,第二步、AI智能生成论文大纲,第三步、下载论文文件。AIPaperPass是AI原创论文写作平台,免费千字大纲,5分钟生成3万字初稿,提供答辩汇报ppt、开题报告、任务书等,40篇真实中英文知网参考文献,重复率超过10%包退费。☻如何使得我的论文结构更完整?

移动开发测试工具——Bugtags的集成-程序员宅基地

文章浏览阅读134次。移动开发测试工具——Bugtags官网:https://bugtags.com/注册开发者账号 注册账号并激活邮箱,都会就不多做介绍了。创建应用 创建完账号以后会提示添加应用,点击添加 添加应用 创建成功集成官方集成文档(需要登录):https://bugtags.com/console/apps/..._bugtags官网

将PHP CodeSniffer与WordPress结合使用:安装和使用WordPress规则-程序员宅基地

文章浏览阅读251次。如果您只是加入本系列,我们一直在讨论代码气味,如何重构它们的话题,以及可用来帮助我们自动完成随之而来的一些单调性的工具,尤其是在PHP编程中。 如果您还没有阅读本系列的前两篇文章,我建议您这样做,因为它们涵盖了我们在继续本文其余部分之前已经具备的一些先决条件。 这些文章是: 将PHP CodeSniffer与WordPress结合使用:了解代码气味 将PHP CodeSnif..._"/vendor/bin/phpcs\" --version"

互联网各大厂的中台建设怎么样了?腾讯/百度/头条/滴滴/小米...-程序员宅基地

文章浏览阅读559次。点击蓝色字体“肉眼品世界”,关注公众号深度价值体系传递文|技术领导力社区中台组编辑| Emma01腾讯:中台战略,All in产业互联网自去年CSIG成立以来,腾讯通..._小米 中台建设 瓶颈

随便推点

oracle填坑之PLSQL中文显示为问号-程序员宅基地

文章浏览阅读200次。刚入坑oracle就遇到个坑。坑描述:系统:Windows7oracle:同时安装,11g和12c(安装顺序,先装的12c然后装的11g)坑:开始安装的12c用SQL Developer使用本地数据库一切正常,公司服务器上的oracle是11g版本,PLSQL是公司用的绿色版(公司全用的oracle_11g)好像也只适用11g,结果PLSQL连不上公司服务器的数据库。于是就又装了一..._plsql中文显示提示?

linux ping策略打开_linux ping策略打开_如何在Linux服务器禁止和开启ping包 互联网技术圈 互联网技术圈......-程序员宅基地

文章浏览阅读81次。临时允许ping命令可使用命令:echo 0 >/proc/sys/net/ipv4/icmp_ignore_all :0,代表允许;1,代表禁止1,查看当前设置:[root@k4622v /root]# more /proc/sys/net/ipv4/icmp_echo_ignore_all0科技看到为0,为此我们可以ping一下试试2,使用ping命令测试C:\Users\adminis..._linux开通ping策略

IDC许可证是什么,如何办理IDC增值电信业务经营许可证年报_idc业务年报申报-程序员宅基地

文章浏览阅读291次。IDC许可证有地网和全网之分,地网在公司所在地通信管理局申请,全网在中华人民共和国工业和信息化部申请。一、申请企业要满足四项基本条件(涉及到地网,因各地通信管理局会根据本地具体业务发展情况制定特色要求,下列关于地网的要求仅供参考,个别省份未必适用):1、注册资金全网1000万元(实缴认缴均可),地网100万元(实缴认缴均可);2、申请公司至少要有三名员工并且可以提供近一个月的社保证明(需申请主体自行缴纳,劳务派遣不可);3、申请公司股东逐级追溯不得包含外资成分,注意是逐级追溯,也就是说你股东的_idc业务年报申报

pta6-1 快速排序_给一个无序表,使用快速排序算法对它进行排序。 函数接口定义: int partition(sqli-程序员宅基地

文章浏览阅读4.3k次,点赞4次,收藏12次。6-1 快速排序 (15分)给一个无序表,使用快速排序算法对它进行排序。函数接口定义:int Partition(SqList &L,int low,int high); void QuickSort(SqList &L, int low, int high);其中L是待排序表,low和high是排序的区间。裁判测试程序样例:#include <iostre..._给一个无序表,使用快速排序算法对它进行排序。 函数接口定义: int partition(sqli

IDEA git操作技巧大全,持续更新中_idea上的git操作-程序员宅基地

文章浏览阅读4.5k次,点赞81次,收藏240次。IDEA git操作大全,cherry pick、revert、squash等等,持续更新中......_idea上的git操作

sublime text3 python找不到文件路径_Sublime text 3 集成python 3 环境配置-程序员宅基地

文章浏览阅读322次。介质版本:Python 3.6Sublime Text 3包括:sublime字体配置。常用插件:Package Control、SublimeCodeIntel、SublimeREPL、SublimeTmpl、ColorSublime、Anaconda、SublimeLinter1、sublime基本配置。配置python路径:击New Build System后,会生成一个空配置文件,在这个配..._sublime text 新建的配置文件找不到

推荐文章

热门文章

相关标签