从 https://gitee.com/openeuler/kernel/tree/openEuler-20.03-LTS-SP3/ 中下载内核源代码备用。 遇到的问题:
remote: Enumerating objects: 6378412, done.
remote: Counting objects: 100% (1396043/1396043), done.
remote: Compressing objects: 100% (30901/30901), done.
error: 1817 bytes of body are still expected.1.02 GiB | 2.32 MiB/s
fetch-pack: unexpected disconnect while reading sideband packet
fatal: early EOF
fatal: fetch-pack: invalid index-pack output
解决方法:git 限制深度,逐渐增加。
执行 git checkout FETCH_HEAD 时:
error: invalid path 'drivers/gpu/drm/nouveau/nvkm/subdev/i2c/aux.c'
error: invalid path 'drivers/gpu/drm/nouveau/nvkm/subdev/i2c/aux.h'
error: invalid path 'include/soc/arc/aux.h
经查,发现 Windows 无法建立以 aux 等“设备名”为文件名的文件。
通过 git config core.protectNTFS false
,可以 checkout 了,但似乎是忽略了那几个文件,此外还有几个文件因为 Windows NTFS 大小写不敏感的问题无法创建:
Switched to branch 'openEuler-20.03-LTS-SP3'
D drivers/gpu/drm/nouveau/nvkm/subdev/i2c/aux.c
D drivers/gpu/drm/nouveau/nvkm/subdev/i2c/aux.h
D include/soc/arc/aux.h
M include/uapi/linux/netfilter/xt_CONNMARK.h
M include/uapi/linux/netfilter/xt_DSCP.h
M include/uapi/linux/netfilter/xt_MARK.h
M include/uapi/linux/netfilter/xt_RATEEST.h
M include/uapi/linux/netfilter/xt_TCPMSS.h
M include/uapi/linux/netfilter_ipv4/ipt_ECN.h
M include/uapi/linux/netfilter_ipv4/ipt_TTL.h
M include/uapi/linux/netfilter_ipv6/ip6t_HL.h
M net/netfilter/xt_DSCP.c
M net/netfilter/xt_HL.c
M net/netfilter/xt_RATEEST.c
M net/netfilter/xt_TCPMSS.c
M tools/memory-model/litmus-tests/Z6.0+pooncelock+poonceLock+pombonce.litmus
在 5 月 5 日和张远航导师进行了沟通,张老师表示 Linux 内核源代码不能像我一样放在 Windows 下,那样无法编译的。最终,我把 .git 移到 CentOS 中,成功 checkout。
5 月 5 日是劳动节假期,但工程师仍然为我们耐心指导。这次主要是源码阅读环境的配置:
似乎 CentOS Server with GUI 自带 Samba。
sudo smbpasswd -a 用户名
为 Samba 设定用户名和密码。
修改防火墙:参考文章,此篇不确定是否必要
sudo firewall-cmd --permanent --add-service=samba
sudo firewall-cmd --reload
sudo setsebool -P samba_enable_home_dirs on # 不加这句,没权限访问
ifconfig
中查看网卡的 IP 地址,Windows 资源管理器下使用 \\IP 地址
后即可输入密码访问。
得知要在 Linux 下编译,我选择在 CentOS 中安装 VS Code,官网即有详细说明,不赘述。也可在 Windows 下利用其他源码阅读工具。
include/linux/timekeeping32.h
/*
* These interfaces are all based on the old timespec type
* and should get replaced with the timespec64 based versions
* over time so we can remove the file here.
*/
static inline void do_gettimeofday(struct timeval *tv)
{
struct timespec64 now;
ktime_get_real_ts64(&now);
tv->tv_sec = now.tv_sec;
tv->tv_usec = now.tv_nsec/1000;
}
timeval
结构体很简单,只有 tv_sec
和 tv_usec
两个成员(其实都是 long,Linux x64 下 long 为 8 位),分布对应秒和微秒,不过这样是达不到纳秒精度的。要注意微秒是一秒内的微秒,不是累计的;秒数是从 1970 年 1 月 1 日 00:00:00 开始累计的。
看起来这函数会逐渐被替换,Documentation/core-api/timekeeping.rst 中也提到,其直接替代就是 ktime_get_real_ts64
。
Makefile 编写参考上星期的记录。
#include <linux/module.h>
#include <linux/init.h>
#include <linux/time.h>
MODULE_LICENSE("GPL");
MODULE_AUTHOR("QunChuWoLao");
static int __init start_module(void)
{
struct timeval tv; // ISO C90 不允许混合使用声明和代码,声明要放函数前面
printk(KERN_ALERT "Module init.\n");
printk(KERN_ALERT "%zu\n", sizeof(tv));
do_gettimeofday(&tv);
printk(KERN_ALERT "%ld\n", tv.tv_sec);
printk(KERN_ALERT "%ld\n", tv.tv_usec);
return 0;
}
static void __exit exit_module(void)
{
printk(KERN_ALERT "Module exit.\n");
}
module_init(start_module);
module_exit(exit_module);