Skip to content

Latest commit

 

History

History
121 lines (101 loc) · 4.46 KB

File metadata and controls

121 lines (101 loc) · 4.46 KB

第 2 周

同步源码

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 日是劳动节假期,但工程师仍然为我们耐心指导。这次主要是源码阅读环境的配置:

Samba

似乎 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 地址后即可输入密码访问。

IDE

得知要在 Linux 下编译,我选择在 CentOS 中安装 VS Code,官网即有详细说明,不赘述。也可在 Windows 下利用其他源码阅读工具。

内核函数之 do_gettimeofday

源码

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_sectv_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);