在sourceinsight 导入linux内核
想用sourceinsight 看linux源码下载下来的话,会发现导入起来特别麻烦,而且我们只用到特定平台的源码,很多信息是不需要的,所以就搜了下,看看有什么好办法。
一 下载对应版本的linux内核源码
这个没什么好说的,我用的是centos7.4版本,linux内核版本3.10 ,下载地址为:https://github.com/tinalinux/linux-3.10
二 编译
上传linux源码到编译目录上去,然后进入目录,执行命令:
cp /boot/config-3.10.0-1160.31.1.el7.x86_64 ./.config
如果配置不用变动就不用更改什么,如果需要更改执行命令:
make menuconfig
会进入一个字符界面,然后选择或取消相关选项即可。
然后编译下,由于内核比较大,资源准许的情况下建议多核心编译:
make -j8
即上面脚本采用8个线程同时编译。
编译后之后,执行make clean ,因为我们只需要源码,编译是因为有的源码需要生成,还有生成source insight的脚本需要。
三 脚本生成需要导入的文件
脚本:
#! /bin/bash
#Err Macro
SUCCESS=0
ERR_BUILD_BOARD=1
ERR_EXIST_DIR=2
ERR_NO_CFG=3
ERR_TAGFILE_NOT_FOUND=4
ERR_FILE_NOT_EXIST=5
ERR_VERSION_MISMATCH=6
ERR_PROGRAM_PARA=7
ERR_TOOLKIT=8
ERR_CHECK_CONFIG=9
ERR_NO_TARGET_RELEASE=10
ERR_FILE_ALREADY_EXIST=11
ERR_NOT_EXIST=12
ERR_CMD_NOT_FOUNT=13
# Color used in echo
## Text--forground
Echo_Black_Text=`tput setaf 0`
Echo_Red_Text=`tput setaf 1`
Echo_Green_Text=`tput setaf 2`
Echo_Yellow_Text=`tput setaf 3`
Echo_Blue_Text=`tput setaf 4`
Echo_Magenta_Text=`tput setaf 5`
Echo_Cyan_Text=`tput setaf 6`
Echo_White_Text=`tput setaf 7`
Echo_Color_Reset=`tput sgr0`
## background color
Echo_Black_BG=`tput setab 0`
Echo_Red_BG=`tput setab 1`
Echo_Green_BG=`tput setab 2`
Echo_Yellow_BG=`tput setab 3`
Echo_Blue_BG=`tput setab 4`
Echo_Magenta_BG=`tput setab 5`
Echo_Cyan_BG=`tput setab 6`
Echo_White_BG=`tput setab 7`
Echo_Color_Reset=`tput sgr0`
print_help()
{
echo "Usage: "
## $0 $1 $2
## dir_to_be_count result_dir
echo " ${Echo_Green_Text}`basename $0` <Directory to be count> <result output directory>${Echo_Color_Reset}"
echo " `basename $0` --help/-h"
echo
echo "For example:"
echo -e " \t `basename $0` kernel-ZZZ kernelResult"
echo -e " \t this would count the valid source code line number of kernel source in kernel-ZZZ, the result would output to kernelResult"
echo
echo -e " \t `basename $0` uboot-ZZZ ubootResult"
echo -e " \t this would count the valid source code line number of uboot source in uboot-ZZZ, the result would be in ubootResult"
}
if [ $1 = "-h" -o $1 = "--help" ]; then
print_help
exit 0
fi
DIR_TO_BE_COUNT=$1
cd "${DIR_TO_BE_COUNT}" >/dev/null
REALPATH_DIR_TO_BE_COUNT="${PWD}"
cd - >/dev/null
REALPATH_DIR_TO_BE_COUNT="${REALPATH_DIR_TO_BE_COUNT}""/"
RESULT_PRJ=$2
Gen_Tmp="Gen_Tmp"
if [ -d "${Gen_Tmp}" ] ; then
echo "${Gen_Tmp} already existed"
else
mkdir "${Gen_Tmp}"
fi
HeadFileList_All="${Gen_Tmp}"/"HF_All.txt"
HF_NoHost="${Gen_Tmp}"/"HF_NoHost.txt"
HF_NoHost_ND="${Gen_Tmp}"/"HF_NoHost_ND.txt"
HF_AbPath="${Gen_Tmp}"/"HF_AbosultePath.txt"
HF_AbsPath_ND="${Gen_Tmp}"/"HF_AbosultePath_ND.txt"
HF_RelPath="${Gen_Tmp}"/"HF_RelPath.txt"
HF_RelPath_ND="${Gen_Tmp}"/"HF_RelPath_ND.txt"
NotFound="${Gen_Tmp}"/"NotFound.txt"
NotFound_TT="${Gen_Tmp}"/"NotFound_Type2.txt"
Valid_HF="${Gen_Tmp}"/"Valid_HF.txt"
VALID_SRC="${Gen_Tmp}"/"Valid_SRC.txt"
NotFound_Verified="${Gen_Tmp}"/"NotFOund_Valid.txt"
HF_NoPath="${Gen_Tmp}"/"HF_NoPath.txt"
HF_NoPath_ND="${Gen_Tmp}"/"HF_NoPath_ND.txt"
##Source code type: UBOOT KERNEL UNKNOWN
SOURCE_CODE_TYPE=
echo -e "${Echo_Yellow_BG}"
echo -e "${Echo_Color_Reset}"
yes '-' | head -n$(tput cols) | tr -d '\n'
## Check the output directory whether is exist
if [ ! -d "${RESULT_PRJ}" ]; then
mkdir "${RESULT_PRJ}"
else
echo "${Echo_Red_Text}Direcotry $RESULT_PRJ already exist${Echo_Color_Reset}"
exit ${ERR_EXIST_DIR}
fi
## Check the source code directory whether is exist
if [ ! -d "${DIR_TO_BE_COUNT}" ]; then # Not found
echo "${Echo_Red_Text}Direcotry $DIR_TO_BE_COUNT NOT exist${Echo_Color_Reset}"
exit ${ERR_NOT_EXIST}
fi
U_BOOT_ID_FILE=u-boot
KERNEL_ID_FILE=vmlinux
DotConfig=".config"
## Check the source code type: u-boot or kernel
if [ ! -e "${DIR_TO_BE_COUNT}"/"${U_BOOT_ID_FILE}" -a -e "${DIR_TO_BE_COUNT}"/"${KERNEL_ID_FILE}" ]; then
#echo "${Echo_Green_Text} ${DIR_TO_BE_COUNT} source code type is: kernel${Echo_Color_Reset}"
echo "Source code type is: [${Echo_Green_Text}kernel${Echo_Color_Reset}]"
SOURCE_CODE_TYPE="KERNEL"
elif [ -e "${DIR_TO_BE_COUNT}"/"${U_BOOT_ID_FILE}" -a -e "${DIR_TO_BE_COUNT}"/"${U_BOOT_ID_FILE}" ]; then
echo "Source code type is: [${Echo_Green_Text}u-boot${Echo_Color_Reset}]"
SOURCE_CODE_TYPE="UBOOT"
else
echo "Source code type is: [${Echo_Red_Text}UNKNOWN${Echo_Color_Reset}]"
SOURCE_CODE_TYPE="UNKNOWN"
#exit $ERR_FILE_NOT_EXIST
fi
if [ -e "${DIR_TO_BE_COUNT}"/"${DotConfig}" -a "UBOOT" == "${SOURCE_CODE_TYPE}" ]; then
echo "U-boot: [${Echo_Green_Text}has .config${Echo_Color_Reset}]"
SOURCE_CODE_TYPE="UBOOT_WITH_DOTCONFIG"
elif [ ! -e "${DIR_TO_BE_COUNT}"/"${DotConfig}" -a "UBOOT" == "${SOURCE_CODE_TYPE}" ]; then
echo "U-boot: [${Echo_Green_Text}without .config${Echo_Color_Reset}]"
fi
if [ "${SOURCE_CODE_TYPE}" == "UBOOT_WITH_DOTCONFIG" -o "${SOURCE_CODE_TYPE}" == "KERNEL" ]; then
KERNEL_SRC_WORK_DIR=kernel_src_work_dir
KERNEL_HEADER_WORK_DIR=kernel_valid_header_files
KERNEL_VALID_HEADER_FILES=
# Get kernel version
VER=`head -n 3 ${DIR_TO_BE_COUNT}/Makefile | awk -F'=' '{print $2}'`
KERN_VERSION=`echo ${VER} | awk '{print $1}'`
KERN_PATCHLEVEL=`echo ${VER} | awk '{print $2}'`
KERN_SUBLEVEL=`echo ${VER} | awk '{print $3}'`
#echo VER=${VER}
#echo VERSION=[${KERN_VERSION}], KERN_PATCHLEVEL=[${KERN_PATCHLEVEL}], KERN_SUBLEVEL=[${KERN_SUBLEVEL}]
# the source file used to be compiled (.S .s .c)
KERNEL_VALID_SRC_FILES=
KERNEL_VALID_SRC_FILES=`find "${DIR_TO_BE_COUNT}" ! -path "./tools/*" ! -path "./examples/*" \
! -path \*/.built-in.o.cmd -name '.*.o.cmd' -print0 | xargs -0 egrep ":=[[:space:]]+[[:alnum:]]+" \
| grep -v '\-gcc' | grep -v '\-ld' | grep -v ' := gcc' | grep -v ' := g++' \
| awk -F':=' '{print $2}' | grep -v 'scripts' | grep -v 'tools'`
if [ -z "${KERNEL_VALID_SRC_FILES}" ] ; then
echo "${Echo_Red_Text}Old kernel found! kernel version=[${KERN_VERSION}.${KERN_PATCHLEVEL}.${KERN_SUBLEVEL}]${Echo_Color_Reset}"
KERNEL_VALID_SRC_FILES=`find "${DIR_TO_BE_COUNT}" ! -path "./tools/*" ! -path "./examples/*" \
! -path \*/.built-in.o.cmd -name '.*.o.cmd' -print0 | xargs -0 egrep ":=[[:space:]]+[[:alnum:]]+" \
| awk '{print $NF}' | sed '/^.*.o$/d' | sed '/--end-group/d'`
fi
#######################################################################
# .S .c .s source file list
#######################################################################
## copy the valid files
# file not found in dir_to_be_count
File_Not_Exist=
Index=0
for files in `echo "${KERNEL_VALID_SRC_FILES}" | sed -e 's/\ /\n/g'`; do
DIR_OF_FILES=`dirname "${files}"`
#echo "${KERNEL_VALID_SRC_FILES}" dirnames=${DIR_OF_FILES}
if [ ! -e "${DIR_TO_BE_COUNT}"/"${files}" ]; then
File_Not_Exist+="${DIR_TO_BE_COUNT}"/"${files}"
File_Not_Exist+=" "
#echo "File not found: ${Echo_Red_Text}"${DIR_TO_BE_COUNT}"/"${files}" ${Echo_Color_Reset}"
continue
fi
echo "${files}" >> "${VALID_SRC}"
((Index++))
echo -e -n "\rSource file[.c .S .s] Index:\t"
echo -e -n "[${Echo_Cyan_Text}${Index}${Echo_Color_Reset}]"
done
if [ -n "${File_Not_Exist}" ]; then
#echo "${Echo_Red_Text}Some files not found, please check:${Echo_Color_Reset}"
echo "${File_Not_Exist}" | sed -e 's/\ /\n/g'
fi
#######################################################################
# .h header file copy
#######################################################################
# file not found in dir_to_be_count
File_Not_Exist=
Index=0
# Find all the header files, include the host PCs, which is start with /usr
find "${DIR_TO_BE_COUNT}" -name .*.o.cmd -print0 | xargs -0 grep '\.h' | awk '{for(i=2;i<=NF;i++){printf "%s ", $i}; printf "\n"}' \
| grep -v ':=' | sed -e 's/\$.*include/include/g' -e 's/\.h.*$/\.h/g' > "${HeadFileList_All}"
# Exclude the hostPCs header file. remain the toolchain libc header, linux kernel headerfiles
grep -v '^\/usr' "${HeadFileList_All}" > "${HF_NoHost}"
awk '!seen[$0]++' "${HF_NoHost}" > "${HF_NoHost_ND}"
## Type 1: absolutely path
# Sort the header files with absolutely path. Contain the toolchain libc header files, linux kenrel header files
grep '^\/' "${HF_NoHost}" > "${HF_AbPath}"
awk '!seen[$0]++' "${HF_AbPath}" > "${HF_AbsPath_ND}"
## Type 2: relative path
# Sort the header files with relative path, only the linux kernel header files
grep -v '^\/' "${HF_NoHost}" > "${HF_RelPath}"
awk '!seen[$0]++' "${HF_RelPath}" > "${HF_RelPath_ND}"
## Handle the Type 2: relative path
File_Not_Exist=
KERNEL_VALID_HEADER_FILES=
KERNEL_VALID_HEADER_FILES=`cat "${HF_RelPath_ND}"`
echo; yes '-' | head -n$(tput cols) | tr -d '\n'
echo "Header file list in relative path mode"
for files in `echo "${KERNEL_VALID_HEADER_FILES}" | sed -e 's/\ /\n/g'`; do
DIR_OF_FILES=`dirname "${files}"`
if [ ! -e "${DIR_TO_BE_COUNT}"/"${files}" ]; then
File_Not_Exist+="${DIR_TO_BE_COUNT}"/"${files}"
File_Not_Exist+=" "
continue
fi
echo "${files}" >> "${Valid_HF}"
((Index++))
echo -e -n "\rHeader file[.h] Index:\t"
echo -e -n "\t[${Echo_Cyan_Text}${Index}${Echo_Color_Reset}]"
done
if [ -n "${File_Not_Exist}" ]; then
#echo "${Echo_Red_Text}Some files not found, please check:${Echo_Color_Reset}"
echo "${File_Not_Exist}" | sed -e 's/\ /\n/g' >> "${NotFound_TT}"
fi
## Handle the Type 1: absolutely path
File_Not_Exist=
DIR_OF_FILES=
KERNEL_VALID_HEADER_FILES=
KERNEL_VALID_HEADER_FILES=`cat "${HF_AbsPath_ND}"`
## For some dir is symbol link
cd "${DIR_TO_BE_COUNT}" && PATH_OF_CODE_DIR=`echo "${PWD}"` && cd - > /dev/null
#echo PATH_OF_CODE_DIR is "${PATH_OF_CODE_DIR}"
echo
yes '-' | head -n$(tput cols) | tr -d '\n'
echo "Header file list in absolutely path mode"
for files in `echo "${KERNEL_VALID_HEADER_FILES}" | sed -e 's/\ /\n/g'`; do
## SubType 1: header files in kernel code
if [ -n `echo "${files}" | grep "${PATH_OF_CODE_DIR}"` ]; then
# files --> DIR_OF_FILES
#/home/XXX/YYY/kernel-ZZZ/include/XXX.h --> /kernel-ZZZ/include/XXX.h
DIR_OF_FILES=`echo "${files}" | sed -r "s#${PATH_OF_CODE_DIR}##"`
#/kernel-ZZZ/include/XXX.h --> /kernel-ZZZ/include/
DIR_OF_FILES=`dirname "${DIR_OF_FILES}"`
#echo DIR_OF_FILES is "${DIR_OF_FILES}"
if [ ! -e "${files}" ]; then
File_Not_Exist+="${files}"
File_Not_Exist+=" "
#echo "File not found: ${Echo_Red_Text}"${DIR_TO_BE_COUNT}"/"${files}" ${Echo_Color_Reset}"
continue
fi
file_rel=`echo "${files}" | sed "s@^${REALPATH_DIR_TO_BE_COUNT}@@"`
#echo "${file_rel}"
echo "${file_rel}" >> "${Valid_HF}"
((Index++))
echo -e -n "\rHeader file[.h] Index:\t"
echo -e -n "\t[${Echo_Cyan_Text}${Index}${Echo_Color_Reset}]"
## Subtype 2: header file comes from the toolchain libc, we just skip it
else
continue
fi
done
if [ -n "${File_Not_Exist}" ]; then
echo "${Echo_Red_Text}Some files not found, please check:${Echo_Color_Reset}"
echo "${File_Not_Exist}" | sed -e 's/\ /\n/g' >> "${NotFound}"
fi
## See whether the file is existed
if [ -f "${NotFound_Verified}" ] ; then
echo "Starting verify type2" >> "${NotFound_Verified}"
for files in `cat "${NotFound_TT}"`; do
filename=`echo "${files}" | sed 's/^.*\///'`
#echo "${filename}"
Exist=`grep "${filename}" "${Valid_HF}"`
if [ -z "${Exist}" ] ; then
echo "${files}" >> "${NotFound_Verified}"
fi
done
echo "Done verify type2" >> "${NotFound_Verified}"
echo "Done verify type2"
fi
## See whether the file is existed
if [ -f "${NotFound}" ] ; then
for files in `cat "${NotFound}"`; do
filename=`echo "${files}" | sed 's/^.*\///'`
Exist=`grep "${filename}" "${Valid_HF}"`
if [ -z "${Exist}" ] ; then
echo "${files}" >> "${NotFound_Verified}"
fi
done
echo "Done verify type1"
fi
if [ -e "${VALID_SRC}" -a -e "${Valid_HF}" ] ; then
cat "${VALID_SRC}" "${Valid_HF}" > valid_filelist.txt
fi
sed "s@^@${REALPATH_DIR_TO_BE_COUNT}@" -i valid_filelist.txt
echo
for files in `cat valid_filelist.txt`; do
if [ ! -e "${files}" ] ; then
NotFoundFileName=`echo "${files}" | sed 's/^.*\///'`
sed 's@${files}@@' -i valid_filelist.txt
SearchMissFile=`find "${REALPATH_DIR_TO_BE_COUNT}" -name "${NotFoundFileName}"`
if [ -n "${SearchMissFile}" ] ; then
echo "${SearchMissFile}" >> valid_filelist.txt
else
## exclude the libc header files
if [ "stdarg.h" != "${NotFoundFileName}" ] ; then
echo "Not found file: ${files}"
fi
fi
fi
done
fi
if [ "${SOURCE_CODE_TYPE}" = "UBOOT" ]; then
PATH_OF_CODE_DIR=
UBOOT_VALID_HEADER_FILES=
UBOOT_SRC_WORK_DIR=uboot_src_work_dir
UBOOT_HEADER_WORK_DIR=uboot_valid_header_files
## For some dir is symbol link
cd "${DIR_TO_BE_COUNT}" && PATH_OF_CODE_DIR=`echo "${PWD}"` && cd - > /dev/null
# the source file used to be compiled (.S .s .c), exclude the tools and examples directories
UBOOT_VALID_SRC_FILES=
UBOOT_VALID_SRC_FILES=`cd "${DIR_TO_BE_COUNT}" && find -name .depend ! -path "./tools/*" ! -path "./examples/*" \
| xargs grep ':' | sed -e 's/.depend.*: //g' | sed -e 's/\ .*$//' && cd - >/dev/null`
#######################################################################
# .S .c .s source file
#######################################################################
# file not found in dir_to_be_count
File_Not_Exist=
Index=0
for files in `echo "${UBOOT_VALID_SRC_FILES}" | sed -e 's/\ /\n/g'`; do
DIR_OF_FILES=`dirname "${files}"`
if [ ! -e "${DIR_TO_BE_COUNT}"/"${files}" ]; then
File_Not_Exist+="${DIR_TO_BE_COUNT}"/"${files}"
File_Not_Exist+=" "
continue
fi
echo "${files}" >> "${VALID_SRC}"
((Index++))
echo -e -n "\rSource file[.c .S .s] Index: "
echo -e -n "\t[${Echo_Cyan_Text}${Index}${Echo_Color_Reset}]"
done
echo
## the depend is seperate to 2 line in .depend.XXX, eg:
# a.o: \
# c.c
# So we should remove the c.c
Src_In_Next_Line=`find "${DIR_TO_BE_COUNT}" -name .depend | xargs egrep ':[[:space:]]+\\#39; -A 1 -h | awk 'BEGIN{RS="--" } {print $1 $3}' | sed 's/o:.*\.//' | sed 's/spl//'`
for files in `echo "${Src_In_Next_Line}" | sed -e 's/\ /\n/g'`; do
if [ ! -e "${files}" ] ; then
echo "${files}" >> "${VALID_SRC}"
else
echo "Not found:${files}"
fi
done
## Handler the spl files, for these files the .c file path in .depend add a spl, lets remove it
for files in `echo "${File_Not_Exist}" | sed -e 's/\ /\n/g'`; do
if [ ! -e "${files}" ] ; then
#echo ccc
NotFound_Remove_SPL=`echo "${files}" | sed 's@spl@@'`
if [ -e "${NotFound_Remove_SPL}" ] ; then
echo "${NotFound_Remove_SPL}" >> "${VALID_SRC}"
File_Not_Exist=`echo "${File_Not_Exist}" | sed "s@${files}@@"`
fi
fi
done
if [ -n "${File_Not_Exist}" ]; then
echo
echo "${Echo_Red_Text}Check file status${Echo_Color_Reset}"
for files in `echo "${File_Not_Exist}" | sed -e 's/\ /\n/g'`; do
## for the line like these: /home/github/BBB/u-boot/./spl/arch/arm/cpu/armv7/\
End_With_Slash=`echo "${files: -1}"`
if [ -z "${End_With_Slash}" ] ; then
echo "${files}"
#echo "${File_Not_Exist}" | sed -e 's/\ /\n/g' #| tr -d '\n' #sed 's/^$//'
fi
done
fi
#######################################################################
# .h header file copy
#######################################################################
# file not found in dir_to_be_count
File_Not_Exist=
Index=0
# Find all the header files, include the host PCs, which is start with /usr
find "${DIR_TO_BE_COUNT}" -name .depend ! -path "./tools/*" ! -path "./examples/*" | xargs sed 's/^.*:\ .*\.[c|s|S]//' | tr -d '\\' | sed 's/\ /\n/g'\
> "${HeadFileList_All}"
# Remove the : line
sed -i '/:/d' "${HeadFileList_All}"
# Remove blank lines
sed '/^$/d' -i "${HeadFileList_All}"
# Exclude the hostPCs header file. remain the toolchain libc header, linux uboot headerfiles
grep -v '^\/usr' "${HeadFileList_All}" > "${HF_NoHost}"
awk '!seen[$0]++' "${HF_NoHost}" > "${HF_NoHost_ND}"
## Type 1: absolutely path
# Sort the header files with absolutely path. Contain the toolchain libc header files, linux kenrel header files
grep '^\/' "${HF_NoHost}" > "${HF_AbPath}"
awk '!seen[$0]++' "${HF_AbPath}" > "${HF_AbsPath_ND}"
## Type 2: no path file
# Sort the header files with no path file, only the linux uboot header files
grep -v '^\/' "${HF_NoHost}" > "${HF_NoPath}"
awk '!seen[$0]++' "${HF_NoPath}" > "${HF_NoPath_ND}"
## Handle the Type 2: No path file
File_Not_Exist=
PATH_OF_NOPATH_FILE=
UBOOT_VALID_HEADER_FILES=
UBOOT_VALID_HEADER_FILES=`cat "${HF_NoPath_ND}"`
for files in `echo "${UBOOT_VALID_HEADER_FILES}" | sed -e 's/\ /\n/g'`; do
#echo files is ${files}
cd "${DIR_TO_BE_COUNT}" && \
PATH_OF_NOPATH_FILE=`find -name .depend.* | xargs grep -w ${files} -nIR | \
sed "s@\.depend.*${files}@${files}@" | \
tr -d '\\' 2>/dev/null` \
&& cd - > /dev/null
#echo PATH_OF_NOPATH_FILE is $PATH_OF_NOPATH_FILE
PATH_OF_NOPATH_FILE=`echo ${PATH_OF_NOPATH_FILE} | awk -F' ' '{print $1}'`
#echo PATH_OF_NOPATH_FILE is $PATH_OF_NOPATH_FILE
DIR_OF_FILES=`dirname "${PATH_OF_NOPATH_FILE}"`
if [ ! -e ${DIR_TO_BE_COUNT}/${PATH_OF_NOPATH_FILE} ]; then
File_Not_Exist+=${DIR_TO_BE_COUNT}/${PATH_OF_NOPATH_FILE}
File_Not_Exist+=" "
#echo "${DIR_TO_BE_COUNT}/${PATH_OF_NOPATH_FILE} not found!"
continue
fi
echo "${files}" >> "${Valid_HF}"
((Index++))
echo -e -n "\rHeader file[.h] Index: "
echo -e -n "[${Echo_Cyan_Text}${Index}${Echo_Color_Reset}]"
done
#echo -e "${Echo_Green_Text}...Done${Echo_Color_Reset}"
#echo -e "\nType 2 item number: ${Index}"
if [ -n "${File_Not_Exist}" ]; then
#echo "${Echo_Red_Text}Some files not found, see file: "${NotFound_TT}"${Echo_Color_Reset}"
echo "${File_Not_Exist}" | sed -e 's/\ /\n/g' >> "${NotFound_TT}"
fi
## Handle the Type 1: absolutely path
File_Not_Exist=
DIR_OF_FILES=
UBOOT_VALID_HEADER_FILES=
UBOOT_VALID_HEADER_FILES=`cat "${HF_AbsPath_ND}"`
## For some dir is symbol link
cd "${DIR_TO_BE_COUNT}" && PATH_OF_CODE_DIR=`echo "${PWD}"` && cd - > /dev/null
#echo PATH_OF_CODE_DIR is "${PATH_OF_CODE_DIR}"
for files in `echo "${UBOOT_VALID_HEADER_FILES}" | sed -e 's/\ /\n/g'`; do
## SubType 1: header files in uboot code
if [ -n `echo "${files}" | grep "${PATH_OF_CODE_DIR}"` ]; then
# files --> DIR_OF_FILES
#/home/XXX/YYY/uboot-ZZZ/include/XXX.h --> /uboot-ZZZ/include/XXX.h
DIR_OF_FILES=`echo "${files}" | sed -r "s#${PATH_OF_CODE_DIR}##"`
#/uboot-ZZZ/include/XXX.h --> /uboot-ZZZ/include/
DIR_OF_FILES=`dirname "${DIR_OF_FILES}"`
#echo DIR_OF_FILES is "${DIR_OF_FILES}"
if [ ! -e "${files}" ]; then
File_Not_Exist+="${files}"
File_Not_Exist+=" "
#echo "File not found: ${Echo_Red_Text}"${DIR_TO_BE_COUNT}"/"${files}" ${Echo_Color_Reset}"
continue
fi
file_rel=`echo "${files}" | sed "s@^${REALPATH_DIR_TO_BE_COUNT}@@"`
echo "${file_rel}" >> "${Valid_HF}"
((Index++))
echo -e -n "\rType 1 header file[.h], item index: "
echo -e -n "[${Echo_Cyan_Text}${Index}${Echo_Color_Reset}]"
## Subtype 2: header file comes from the toolchain libc, we just skip it
else
continue
fi
done
#echo -e "${Echo_Green_Text}.\tDone${Echo_Color_Reset}"
if [ -n "${File_Not_Exist}" ]; then
echo "${Echo_Red_Text}Some files not found, please check:${Echo_Color_Reset}"
echo "${File_Not_Exist}" | sed -e 's/\ /\n/g' > "${NotFound}"
fi
fi
############################################################################
### Generate the filelist
############################################################################
sed "s@^${REALPATH_DIR_TO_BE_COUNT}@@" -i ${Valid_HF}
sed "s@^${REALPATH_DIR_TO_BE_COUNT}@@" -i ${VALID_SRC}
if [ -e "${VALID_SRC}" -a -e "${Valid_HF}" ] ; then
cat "${VALID_SRC}" "${Valid_HF}" > valid_filelist.txt
fi
sed "s@^@${REALPATH_DIR_TO_BE_COUNT}@" -i valid_filelist.txt
for files in `cat valid_filelist.txt`; do
if [ ! -e "${files}" ] ; then
NotFoundFileName=`echo "${files}" | sed 's/^.*\///'`
sed 's@${files}@@' -i valid_filelist.txt
SearchMissFile=`find "${REALPATH_DIR_TO_BE_COUNT}" -name "${NotFoundFileName}"`
if [ -n "${SearchMissFile}" ] ; then
echo "${SearchMissFile}" >> valid_filelist.txt
else
## Remove the not found files
#echo "Not found file: ${files}"
sed "s@${files}@@" -i valid_filelist.txt
sed '/^$/d' -i valid_filelist.txt
fi
fi
done
## ./ --> /, // --> /
sed "s@\./@/@" -i valid_filelist.txt
sed "s@//@/@" -i valid_filelist.txt
for files in `cat valid_filelist.txt`; do
if [ ! -e "${files}" ] ; then
sed "s@${files}@@" -i valid_filelist.txt
sed '/^$/d' -i valid_filelist.txt
fi
done
sed "s@^${REALPATH_DIR_TO_BE_COUNT}@@" valid_filelist.txt > valid_filelist_NoPath.txt
cp valid_filelist_NoPath.txt FileList_SourceInsight.txt
cp valid_filelist.txt FileList_understand.txt
#sed "s@^@${REALPATH_DIR_TO_BE_COUNT}@" -i valid_filelist.txt
cat "${Valid_HF}" | sed "s@^@${REALPATH_DIR_TO_BE_COUNT}@" | sed 's/^/<F N="/' | sed 's/$/"\/>/' | sed 's/^/\t\t\t/' > valid_hf_se.txt
cat "${VALID_SRC}" | sed "s@^@${REALPATH_DIR_TO_BE_COUNT}@" | sed 's/^/<F N="/' | sed 's/$/"\/>/'| sed 's/^/\t\t\t/' > valid_src_se.txt
sed "s@\./@/@" -i valid_hf_se.txt
sed "s@//@/@" -i valid_hf_se.txt
sed "s@\./@/@" -i valid_src_se.txt
sed "s@//@/@" -i valid_src_se.txt
cp misc/sample.vpj .
cp misc/sample.vpw .
## !!TODO!! Add the dts file
## Append to project file
sed '/<!--SRCFILES-->/r valid_src_se.txt' -i sample.vpj
sed '/<!--HEADFILES-->/r valid_hf_se.txt' -i sample.vpj
sed "s/PRJNAME/${RESULT_PRJ}/" -i sample.vpj
sed "s/PRJNAME/${RESULT_PRJ}/" -i sample.vpw
mkdir "${RESULT_PRJ}"/"${RESULT_PRJ}"
mv sample.vpj "${RESULT_PRJ}"/"${RESULT_PRJ}"/"${RESULT_PRJ}".vpj
mv sample.vpw "${RESULT_PRJ}"/"${RESULT_PRJ}"/"${RESULT_PRJ}".vpw
mv valid*.txt "${Gen_Tmp}"
mv FileList_understand.txt "${RESULT_PRJ}"
mv FileList_SourceInsight.txt "${RESULT_PRJ}"
rm ."${Gen_Tmp}" -rf 2>/dev/null && mv "${Gen_Tmp}" ."${Gen_Tmp}"
sync
if [ "${SOURCE_CODE_TYPE}" = "UNKNOWN" ]; then
echo UNKNOWN
fi
echo -e "${Echo_Yellow_BG}"
echo -e "${Echo_Color_Reset}"
yes '-' | head -n$(tput cols) | tr -d '\n'
exit 0
执行命令:
./gen.sh ./linux-3.10/ ./output
生成output目录以及相关文件。
生成的文件为:FileList_SourceInsight.txt是我们需要的
四. 导入source insight
新建工程,导入选择 ”Add from list"
注意工程文件的位置要放在源码主目录,FileList_SourceInsight.txt也要存在这个目录,等完毕后,close即可。
突破数字疆界:科学上网的完整技术与法律指南
在当今全球化的信息时代,互联网本应是无国界的知识海洋,然而现实中,不同国家和地区基于各自的法律、政治与文化考量,对网络内容实施了不同程度的审查与封锁。这种“数字围墙”的存在,催生了一个广泛讨论的话题——科学上网,即通过技术手段突破网络限制,访问被屏蔽的网站与服务。本文将深入探讨科学上网的核心概念、主流工具、选择策略、法律风险以及常见问题的解决方案,旨在为读者提供一份全面而实用的指南。
一、科学上网的本质与原理
科学上网,通俗而言,是一种绕过网络审查的技术行为。其核心机制在于通过特定的软件工具、网络协议或远程服务器,将用户的网络请求重新路由,使其看似来自其他地区,从而规避本地网络封锁。这一过程通常涉及数据加密、代理转发与IP地址伪装等技术手段。
从技术层面看,科学上网的实现依赖于“中间人”模式:用户设备与目标网站之间插入一个中转节点。当用户访问被封锁的网站时,请求先发送至该节点(通常位于境外),节点代为获取内容后,再加密传回给用户。如此一来,本地网络监管者只能看到用户与节点之间的加密流量,而无法得知真实访问目标。
理解这一原理至关重要,因为它直接关系到工具的选择与使用效果。例如,VPN通过建立加密隧道传输所有网络流量,而Shadowsocks则专注于代理特定应用的请求。不同的技术架构决定了它们在速度、稳定性和隐蔽性上的差异。
二、主流科学上网工具深度解析
1. VPN(虚拟私人网络)
VPN是最广为人知的科学上网工具。它通过在用户与服务器之间创建加密连接,将所有网络流量引导至服务器所在地区,从而隐藏用户的真实IP地址并绕过地理限制。VPN的优势在于其通用性:一旦连接,所有网络活动(包括浏览器、应用、系统更新)都会通过VPN通道,无需逐个配置。
市场上有众多VPN服务商,如NordVPN、ExpressVPN、Surfshark等,它们在全球部署了大量服务器,提供高速连接与严格的无日志政策。选择VPN时,应重点关注以下指标:服务器数量与分布、连接速度、加密协议(如OpenVPN、WireGuard)、隐私保护承诺以及设备兼容性。需要注意的是,部分VPN服务可能被深度包检测(DPI)技术识别并封锁,因此定期切换服务器或使用混淆功能是必要的。
2. Shadowsocks(SS)
Shadowsocks是一种轻量级的代理工具,最初由开发者clowwindy为突破中国的网络审查而设计。与VPN不同,Shadowsocks不加密所有流量,而是仅代理指定应用的请求。它采用SOCKS5代理协议,通过客户端与服务器之间的加密通道传输数据,具有较高的隐蔽性。
使用Shadowsocks通常需要购买第三方服务器账号。用户获得服务器地址、端口、密码和加密方式后,在客户端中配置即可连接。Shadowsocks的优势在于:流量特征与普通HTTPS相似,不易被识别;资源占用低,适合老旧设备;配置灵活,可自定义规则。但其缺点也很明显:需要一定的技术基础;仅支持TCP协议,对UDP应用(如游戏、语音通话)支持不佳;且缺乏统一的安全审计,部分服务商可能存在日志记录风险。
3. V2Ray
V2Ray是Shadowsocks的进阶版,由Project V社区开发,支持更多传输协议(如VMess、VLESS、Trojan等)和更复杂的路由规则。V2Ray的设计理念是“灵活与强大”,用户可以自定义流量分流策略,例如:国内网站直连、国外网站走代理、特定IP段跳过代理等。
V2Ray的安装与配置相对复杂,通常需要在Linux服务器上部署。其核心配置文件采用JSON格式,涉及inbound(入站)、outbound(出站)、routing(路由)等多个模块。对于新手而言,推荐使用一键安装脚本或图形化面板(如X-UI、面板)简化操作。V2Ray的优势在于:支持多种伪装方式(如WebSocket + TLS),可伪装成普通HTTPS流量,抗检测能力强;支持多用户管理;具备强大的路由功能。然而,其学习曲线陡峭,且对服务器性能有一定要求。
4. Trojan
Trojan是近年来兴起的新型代理工具,旨在解决VPN和Shadowsocks被识别的问题。其核心思路是伪装成HTTPS流量:客户端与服务器之间建立TLS加密连接,流量特征与普通网页访问完全一致,因此极难被深度包检测识别。Trojan的配置相对简单,但需要服务器拥有合法的域名和SSL证书。
Trojan的缺点在于:仅支持TLS加密,对服务器配置要求较高;缺乏多协议支持;社区生态不如V2Ray成熟。但对于追求极致隐蔽性的用户而言,Trojan是一个值得考虑的选择。
三、如何选择合适的科学上网工具
选择科学上网工具需综合考量以下因素:
1. 访问速度:若主要需求是观看流媒体视频、参与视频会议或下载大文件,应优先选择VPN服务商,它们通常在全球部署了优化线路,提供高速连接。Shadowsocks和V2Ray的速度取决于服务器质量,若使用廉价VPS,可能不如商业VPN稳定。
2. 隐私保护:对于重视隐私的用户,建议选择Shadowsocks或V2Ray,并自行搭建服务器。商业VPN服务商虽然宣称无日志,但部分可能存在数据留存或出售风险。自建服务器可以完全控制日志记录,但需承担维护成本。
3. 设备兼容性:VPN通常提供全平台客户端(Windows、macOS、Android、iOS、路由器),一键连接,适合多设备用户。Shadowsocks和V2Ray的客户端生态同样丰富,但配置稍显繁琐。若需在路由器上部署科学上网,建议使用OpenWrt系统配合V2Ray或Shadowsocks插件。
4. 抗封锁能力:在审查严格的地区,VPN的IP地址和协议特征可能被识别并封锁。此时,Shadowsocks的SOCKS5代理或V2Ray的WebSocket+TLS伪装更具优势。Trojan则因其HTTPS伪装特性,在抗检测方面表现最佳。
四、法律风险与合规建议
科学上网的法律地位因国家而异。在某些地区,如中国,未经批准的VPN服务被视为违法,个人使用可能面临警告、罚款甚至行政拘留。而在其他国家,如新加坡、阿联酋,同样存在针对VPN的严格监管。因此,在采取行动前,务必了解所在国家或地区的具体法律法规。
降低法律风险的建议包括:避免使用免费VPN,因其可能收集用户数据或植入恶意代码;购买境外VPS时选择隐私友好的服务商(如DigitalOcean、Linode、Vultr),并使用加密货币支付;仅将科学上网用于合法目的(如学术研究、新闻阅读、远程办公),避免参与非法活动;定期清理使用痕迹,避免留下可被追溯的证据。
五、常见问题与解决方案
1. 如何在中国稳定使用VPN?
- 选择优质服务商:优先支持混淆协议的VPN(如OpenVPN over TCP 443),或使用Shadowsocks/V2Ray等工具。
- 定期切换节点:避免长时间使用同一IP,可设置客户端自动切换服务器。
- 使用CDN中转:将代理服务器置于CDN之后,利用Cloudflare等CDN的全球节点隐藏真实服务器IP。
- 启用多路复用:通过同一端口传输多个连接,降低被检测的概率。
2. 如何搭建自己的科学上网服务器?
- 购买VPS:推荐DigitalOcean、Linode、Vultr等,选择海外节点(如日本、新加坡、美国西海岸)。
- 安装工具:使用一键脚本(如V2Ray一键安装脚本、Trojan一键脚本)快速部署。
- 配置域名与SSL:若使用Trojan或V2Ray的WebSocket+TLS模式,需绑定域名并申请Let's Encrypt免费证书。
- 测试连接:使用客户端连接服务器,确保延迟与速度符合预期。
3. 如何提高科学上网速度?
- 选择地理位置近的服务器:例如,访问美国网站时选择西海岸节点,访问欧洲网站时选择法兰克福节点。
- 避免高峰期:网络拥堵时段(如晚上8-11点)速度可能下降,可尝试错峰使用。
- 优化协议与加密:使用轻量级加密算法(如chacha20-ietf-poly1305),避免使用AES-256-GCM等重型加密。
- 启用BBR加速:在服务器端开启BBR拥塞控制算法,可显著提升TCP传输速度。
4. 科学上网是否绝对安全?
科学上网的安全性取决于工具、服务商与用户行为。使用高加密协议(如TLS 1.3、WireGuard)并选择不记录日志的服务商,可以大幅降低数据泄露风险。然而,没有任何系统是绝对安全的。用户应避免在科学上网环境下输入敏感信息(如银行密码、身份证号),并定期更新客户端与服务器软件以修复安全漏洞。
5. VPN连接失败如何解决?
- 检查本地网络:确保设备已连接互联网,可尝试访问国内网站验证。
- 更换服务器节点:部分节点可能因维护或封锁而失效,切换至其他节点。
- 更新客户端:老版本客户端可能存在兼容性问题,升级至最新版。
- 关闭防火墙或杀毒软件:部分安全软件可能干扰VPN连接,临时关闭后重试。
- 修改DNS设置:将DNS改为8.8.8.8或1.1.1.1,避免DNS污染。
六、结语:技术中立与责任意识
科学上网是一把双刃剑。它赋予了用户突破信息壁垒的能力,让知识、文化与思想的自由流动成为可能;但同时也可能被滥用于传播违法内容、侵犯隐私或破坏网络安全。作为技术使用者,我们应当秉持“技术中立”的原则,将科学上网工具用于正当目的,如获取学术资源、了解国际新闻、与海外亲友联系等。
在数字时代,信息获取的自由与合规之间的平衡需要每个人共同维护。选择适合自己的工具,了解其原理与风险,遵守当地法律法规,方能在享受互联网便利的同时,避免不必要的麻烦。希望本文能为你提供清晰的指引,助你在数字疆界中自由而安全地探索。
版权声明:
作者: FreeClashNode
链接: https://www.freeclashnode.com/news/article-1721.htm
来源: www.freeclashnode.com
文章版权归作者所有,未经允许请勿转载。
热门文章
- 8月27日免费节点分享|22.6M/S,Shadowrocket节点/Clash节点/Singbox节点/V2ray节点|免费上网梯子每天更新
- 8月29日免费节点分享|18.5M/S,Singbox节点/Clash节点/V2ray节点/SSR节点|免费上网梯子每天更新
- 9月3日免费节点分享|20.7M/S,Singbox节点/V2ray节点/SSR节点/Clash节点|免费上网梯子每天更新
- 8月30日免费节点分享|20.8M/S,Shadowrocket节点/V2ray节点/Singbox节点/Clash节点|免费上网梯子每天更新
- 9月2日免费节点分享|19.4M/S,Shadowrocket节点/Clash节点/V2ray节点/Singbox节点|免费上网梯子每天更新
- 8月18日免费节点分享|18.7M/S,V2ray节点/Singbox节点/Clash节点/SSR节点|免费上网梯子每天更新
- 8月20日免费节点分享|18.2M/S,V2ray节点/Clash节点/Singbox节点/Shadowrocket节点|免费上网梯子每天更新
- 8月17日免费节点分享|23M/S,Shadowrocket节点/Clash节点/V2ray节点/Singbox节点|免费上网梯子每天更新
- 8月21日免费节点分享|19.2M/S,SSR节点/V2ray节点/Clash节点/Singbox节点|免费上网梯子每天更新
- 8月24日免费节点分享|22.5M/S,Singbox节点/Clash节点/SSR节点/V2ray节点|免费上网梯子每天更新
最新文章
- 全面解析Quantumult X兑换码:获取途径、使用技巧与常见问题指南
- 9月15日免费节点分享|19.6M/S,V2ray节点/SSR节点/Singbox节点/Clash节点|免费上网梯子每天更新
- 跨越边界的声音:一份用 Clash 解锁网易云音乐的深度指南与思考
- 9月14日免费节点分享|20.5M/S,SSR节点/V2ray节点/Singbox节点/Clash节点|免费上网梯子每天更新
- 智能电视上的网络利器:电视端Clash全方位使用指南
- 9月13日免费节点分享|21.6M/S,V2ray节点/Shadowrocket节点/Clash节点/Singbox节点|免费上网梯子每天更新
- 全面解析PAC科学上网:原理、优势与实战配置指南
- 9月12日免费节点分享|22.6M/S,Singbox节点/V2ray节点/Clash节点/Shadowrocket节点|免费上网梯子每天更新
- 告别卡顿与封锁:流量大的Clash机场深度测评与终极使用指南
- 9月11日免费节点分享|22M/S,Singbox节点/Clash节点/Shadowrocket节点/V2ray节点|免费上网梯子每天更新
- 解锁短视频新世界:Clash代理工具与TikTok跨境访问的终极实操手册
- 9月10日免费节点分享|21.4M/S,Shadowrocket节点/Clash节点/V2ray节点/Singbox节点|免费上网梯子每天更新
- 掌控网络流量:Clash规则外路由的深度解析与实战配置指南
- 9月9日免费节点分享|20M/S,Clash节点/V2ray节点/Shadowrocket节点/Singbox节点|免费上网梯子每天更新
- 从入门到精通:美国网件路由器科学上网终极配置指南
- 9月8日免费节点分享|22.6M/S,Singbox节点/Clash节点/Shadowrocket节点/V2ray节点|免费上网梯子每天更新
- 9月7日免费节点分享|21M/S,V2ray节点/Singbox节点/SSR节点/Clash节点|免费上网梯子每天更新
- Clash Mini技能全攻略:从入门到精通的战术指南
- 9月6日免费节点分享|19.2M/S,Singbox节点/Shadowrocket节点/Clash节点/V2ray节点|免费上网梯子每天更新
- 全面掌握 v2rayng 机场地址:从原理到实战的完整指南
- 9月5日免费节点分享|20.7M/S,SSR节点/Clash节点/V2ray节点/Singbox节点|免费上网梯子每天更新
- 突破网络枷锁:V2ray全方位安装配置指南与深度解析
- 9月4日免费节点分享|18.2M/S,Singbox节点/SSR节点/V2ray节点/Clash节点|免费上网梯子每天更新
- 9月3日免费节点分享|20.7M/S,Singbox节点/V2ray节点/SSR节点/Clash节点|免费上网梯子每天更新
- 同一服务器上共存V2Ray与宝塔面板:实用指南与全方位解析
- 9月2日免费节点分享|19.4M/S,Shadowrocket节点/Clash节点/V2ray节点/Singbox节点|免费上网梯子每天更新
- 数字边界突围战:手机科学上网方案全解析与深度抉择
- 9月1日免费节点分享|22.1M/S,Shadowrocket节点/Clash节点/Singbox节点/V2ray节点|免费上网梯子每天更新
- 用小米路由器Mini打造家庭科学上网环境:详解配置方法与实践指南
- 8月31日免费节点分享|19.6M/S,Shadowrocket节点/Clash节点/V2ray节点/Singbox节点|免费上网梯子每天更新
- 深度解析:SSR与V2Ray的速度鸿沟与性能优化之道
- 8月30日免费节点分享|20.8M/S,Shadowrocket节点/V2ray节点/Singbox节点/Clash节点|免费上网梯子每天更新
- 深入解析 v2ray URL地址:从原理到实践的全方位指南
- 8月29日免费节点分享|18.5M/S,Singbox节点/Clash节点/V2ray节点/SSR节点|免费上网梯子每天更新
- 解锁网络边界:全面掌握v2ray免费订阅节点的获取与使用之道
- 8月28日免费节点分享|22.1M/S,Singbox节点/SSR节点/Clash节点/V2ray节点|免费上网梯子每天更新
- 从萌新到高手:Clash Mini 苹果版全维度体验指南与胜负心法
- 8月27日免费节点分享|22.6M/S,Shadowrocket节点/Clash节点/Singbox节点/V2ray节点|免费上网梯子每天更新
- 8月27日免费节点分享|19.5M/S,Shadowrocket节点/Singbox节点/V2ray节点/Clash节点|免费上网梯子每天更新
- 解锁全球影视盛宴:Shadowrocket观看美剧的终极指南
- 8月26日免费节点分享|22.6M/S,Singbox节点/Clash节点/Shadowrocket节点/V2ray节点|免费上网梯子每天更新
- 全面掌握Vmess:从下载到配置的完整指南
- 8月25日免费节点分享|22.1M/S,V2ray节点/SSR节点/Singbox节点/Clash节点|免费上网梯子每天更新
- 极速与隐私的完美结合:AC68U路由器深度整合V2Ray实战指南
- 8月24日免费节点分享|22.5M/S,Singbox节点/Clash节点/SSR节点/V2ray节点|免费上网梯子每天更新
- 冲突的艺术:深度解析《Clash of Clans》三大核心模式与战略抉择
- 8月23日免费节点分享|20.9M/S,V2ray节点/SSR节点/Singbox节点/Clash节点|免费上网梯子每天更新
- 翻墙新纪元:掌握科学上网的安全之道与实用指南
- 8月22日免费节点分享|20.3M/S,V2ray节点/Singbox节点/SSR节点/Clash节点|免费上网梯子每天更新
- Clash付费全攻略:从购买到续订的完整指南与实用技巧
归档
- 2026-09 28
- 2026-08 63
- 2026-07 61
- 2026-06 55
- 2026-05 56
- 2026-04 51
- 2026-03 60
- 2026-02 52
- 2026-01 56
- 2025-12 59
- 2025-11 55
- 2025-10 56
- 2025-09 55
- 2025-08 49
- 2025-07 31
- 2025-06 30
- 2025-05 31
- 2025-04 30
- 2025-03 388
- 2025-02 360
- 2025-01 403
- 2024-12 403
- 2024-11 390
- 2024-10 403
- 2024-09 388
- 2024-08 402
- 2024-07 427
- 2024-06 442
- 2024-05 181
- 2024-04 33
- 2024-03 31
- 2024-02 29
- 2024-01 51
- 2023-12 52
- 2023-11 32
- 2023-10 32
- 2023-09 3