ARM 设备的的内核中没有编进去 NFS,所以打算采用 ko 的方式加载进内核。 编译内核源程序,产生 Makefile。 make menuconfig 配置内核: [*] Network File Systems ---> <M> NFS client support [*] NFS client support for NFS version 3 把 NFS client support 选做模块(M)。 make modules 生成 nfs.ko、sunrpc.ko、lockd.ko 拷贝到 /lib/modules/$(uname -r) 执行 depmod 执行 modprobe nfs [ 207.024183] RPC: Registered named UNIX socket transport module. [ 207.030461] RPC: Registered udp transport module. [ 207.035397] RPC: Registered tcp transport module. [ 207.040317] RPC: Registered tcp NFSv4.1 backchannel transport module...
阡陌 发布的文章
阡陌创建一个 Linux 内核模块实例
源代码: #include <linux/init.h> //包含模块初始化、清除函数 #include <linux/module.h> //包含许多符号和函数的定义,模块的定义 #include <linux/kernel.h> static int __init hello_init(void) { printk(KERN_ALERT "Hello World!\n"); //内核中的打印只有printk,而且分打印级别 return 0; } static void __exit hello_exit(void) { printk(KERN_ALERT "Goodbye, see you again!\n"); } module_init(hello_init); //函数声明,把代码段放到init段;module_init是该程序的入口函数 //当系统启动init程序的时候,执行module_init()里的函数 module_exit(hello_exit); //当系统启动exit程序的时候,执行module_exi()里的函数 //没有module声明的函数(普通函数)会放到代码段(文本段) MODULE_AUTHOR("Matt <matt@mculoop.com>"); //声明作者 MODULE_DESCRIPTION("Linux Kernel Hello World Module (C) 2018"); //模块描述 MODULE_LICENSE("GPL"); //声明LICENSE Makefile: # To build modules outside of the kernel tree, we run "make" # in the kernel source tree; the Makefile these then includes this # Makefile once again. # This conditional selects whether we are being included from the # kernel Makefile or not. # called from kernel build system: just declare what our modules are obj-m := helloworld.o # Assume the source tree is where the running kernel was built # You should set KERNELDIR in the environment if it's elsewhere KERNELDIR ?= /home/matt/test/kernel/linux-3.2.0-psp04.06.00.11 # The current directory is passed to sub-makes as argument PWD := $(shell pwd) all: modules modules: $(MAKE) -C $(KERNELDIR) M=$(PWD) modules clean: rm -rf *.o *~ core .depend *.symvers .*.cmd *.ko *.mod.c .tmp_versions $(TARGET) 编译: 编译前应当确保已经编译过内核,因为要使用内核的Makefile。 mak...
解决错误 modinfo can't open '...modules.dep' No such file or directory
在 ARM 开发板上查看模块信息提示题中的错误: modinfo: can't open '/lib/modules/3.2.0/modules.dep': No such file or directory 解决办法是: 1、创建文件夹:/lib/modules/$(uname -r) 2、cp xx.ko /lib/modules/3.2.0/ 3、depmod 4、mv /lib/modules/3.2.0/modules.dep.bb /lib/modules/3.2.0/modules.dep 5、modinfo xx.ko 这下就正常了 又发现: 其它模块不用重复这样做 为什么其它模块不需要这样做的?是不是只要有 modules.dep 这么一个文件名的文件存在于这里就可以来了? 再次发现: 在这里创建一个空文件就行了! touch modules.dep 那么,在 /lib/modules/3.2.0/ 中没有 ko 文件的时候,直接执行 depmod 命令是不是也可以产生空文件?答案是:是的,不过产生的是 modules.dep.bb 。为什么不直接产生 modules.dep 呢?还不清楚。有一点是可以肯定的,modinfo 使用前提是存在 modules.dep,空的就行,模块信息是从 ko 文件中获取的,跟 modules.dep 没关系。不过,为什么非要存在 modules.dep 文件呢?这也还不清楚。 我在 Ubuntu 18.04 中做了测试,内核版本是 4.15.0-36,执行 depmod 没有 modules.dep.bb 产生,直接产生 modules.dep,并且文件的内容格式与 3.2.0 中的也不一...
Linux 查看 flash 分区命令
/proc/mtd 可以显示出所有挂载和未挂载的分区,但不显示文件系统类型。 cat /proc/mtd mtd0: 00080000 00020000 "MLO" mtd1: 00200000 00020000 "U-Boot" mtd2: 00580000 00020000 "Kernel" mtd3: 00800000 00020000 "File System" mtd4: 07000000 00020000 "app" df 可以查看已经挂载的分区和文件系统类型。 df -a Filesystem 1K-blocks Used Available Use% Mounted on ubi0:rootfs 4584 4576 8 100% / devtmpfs 127488 0 127488 0% /dev ramfs 0 0 0 0% /var ramfs 0 0 0 0% /tmp proc 0 0 0 0% /proc sysfs 0 0 0 0% /sys devpts 0 0 0 0% /dev/pts tmpfs 127592 0 127592 0% /dev/shm ubi1_0 89796 32 89764 0% /app fdisk 可以显示出所有挂载和未挂载的分区,但不显示文件系统类型。 fdisk -l Disk /dev/mtdblock0: 0 MB, 524288 bytes 255 heads, 63 sectors/track, 0 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Disk /dev/mtdblock0 doesn't contain a valid partition table Disk /dev/mtdblock1: 2 MB, 2097152 bytes 255 heads, 63 sectors/track, 0 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Disk /dev/mtdblock1 doesn't contain a valid partition table Disk /dev/mtdblock2: 5 MB, 5767168 bytes 255 heads, 63 sectors/track, 0 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Disk /dev/mtdblock2 doesn't contain a valid partition table Disk /dev/mtdblock3: 8 MB, 8388608 bytes 255 heads, 63 sectors/track, 1 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Disk /dev/mtdblock3 doesn't contain a valid partition table Disk /dev/mtdblock4: 117 MB, 117440512 bytes 255 heads, 63 sectors/track, 14 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Disk /dev/mtdblock4 doesn't contain a valid partition tabl...
JDK 安装与配置
JDK (Java Development Kit) 是 Java 语言的软件开发工具包(SDK)。 SE (JavaSE,Standard Edition,标准版),是我们通常用的一个版本,从 JDK 5.0 开始,改名为 Java SE。 JDK 包含的基本组件包括: javac – 编译器,将源程序转成字节码 jar – 打包工具,将相关的类文件打包成一个文件 javadoc – 文档生成器,从源码注释中提取文档 jdb – debugger,查错工具 java – 运行编译后的java程序(.class后缀的) appletviewer:小程序浏览器,一种执行HTML文件上的Java小程序的Java浏览器。 Javah:产生可以调用Java过程的C过程,或建立能被Java程序调用的C过程的头文件。 Javap:Java反汇编器,显示编译类文件中的可访问功能和数据,同时显示字节代码含义。 Jconsole: Java进行系统调试和监控的工具 1、下载并安装 JDK https://www.oracle.com/technetwork/java/javase/downloads/index.html Java SE 8 与 JDK1.8 是等效的。 2、配置环境变量 对于 Java 程序开发而言,主要会使用 JDK 的两个命令:javac.exe、java.exe。要想直接执行,需要配置路径。 单击“计算机-属性-高级系统设置”,单击“环境变量”。在“系统变量”栏下单击“新建”,创建新的系统环境变量。 (1) 新建 JAVA_HOME,变量值:C:\Program Files\Java\jdk1.8.0_191(即JDK的安装路径) (2) 编辑 Path,在原变量值的最后面加上:;%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin (3) 新建 classpath, 变量值:.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\tools.jar 说明:jdk 需要配置三个环境变量; 1.5 之后可以不再设置 classpath,但建议保留 classpath 设置。 重启使环境变量生效。 3、测试 打开 CMD 执行 javac -version javac 1.8.0_1...
Ubuntu 14.04 升级到 16.04
1、查看当前版本 lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 14.04.5 LTS Release: 14.04 Codename: trusty 2、执行更新命令 apt-get update && apt-get dist-upgrade 3、重启系统 reboot 4、升级系统 将源改为 16.04 的源 do-release-upgrade 5、验证升级完成 lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 16.04.5 LTS Release: 16.04 Codename: xenia...
TortoiseSVN 在 show log 时候出现 want to go offline 问题的解决
现象: 同事使用 TortoiseSVN 在 show log 时候出现 want to go offline 的异常,不能查看日志,操作系统为 Win7。 查找与解决问题: 1、清除同事电脑上的各种缓存都没有效果; 2、在我的 Win10 系统上用相同账户登录没有任何异常;(客户端存在版本差异) 3、升级同事的 TortoiseSVN 到最新的版本(1.10.0),问题依旧; 4、修改服务器上库中的 svnserve.conf 文件,设置 anon-access = none,重启 VisualSVN(3.8.1) 后同事的电脑恢复正常。 后注:后来发现似乎与 svnserve.conf 的修改无关,如果先在根目录 show log,然后在中文子目录 show log 是可以正常查看日志的。 5、再将 anon-access = 改为 read 或恢复为注释状态,重启服务器后同事的电脑上仍然正常。 后注:所以,与 svnserve.conf 应该没有关系的。 通过以上现象分析,该问题似乎与客户的操作系统、服务器上库的默认配置都有关系。根本原因仍未查明。 后来发现在自己的电脑上也不能 show log 了,再进一步仔细观察,发现在中文目录上 show log 会失败。 切换了几个 VisualSVN Server 版本没有作用,同时与操作系统 Win2012、Win10 也不相关。 最终发现 TortoiseSVN 版本从 1.9.5 开始,后续版本都存在同样的问...
mstsc 远程桌面连接 Windows Server 时报函数不受支持错误的解决方法
远程桌面连接时提示:“发生身份验证错误,要求的函数不受支持”(Win7) 或者“远程桌面发生身份验证错误,要求的函数不受支持”(Win10)。 这可能是由于 CredSSP 加密 Oracle 修正。 解决方法: Win + R 运行 gpedit.msc 本地计算机策略 > 计算机配置 > 管理模板 > 系统 > 凭据分配 > 加密 Oracle 修正,配置为已启用,保护级别选择易受攻击。 Win10 家庭版没有 gpedit,需要修改注册表。 路径:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System\CredSSP\Parameters 在 System 下面手动建两级项:CredSSP、Parameters 在 Parameters 下建一个 DWORD 值,AllowEncryptionOracle 值为...