Lab4-以time/gettimeofday系统调用为例分析ARM64

本文章的准备工作参考VSCode+GDB+Qemu调试ARM64 linux内核 - 知乎

首先安装编译工具链

由于Ubuntu是X86架构,为了编译arm64的文件,需要安装交叉编译工具链。

sudo apt-get install gcc-aarch64-linux-gnu
sudo apt-get install libncurses5-dev  build-essential git bison flex libssl-dev

制作根文件系统

linux的启动需要配合根文件系统,这里我们利用busybox来制作一个简单的根文件系统(类似lab3).

编译busybox

wget  https://busybox.net/downloads/busybox-1.33.1.tar.bz2
tar -xjf busybox-1.33.1.tar.bz2
cd busybox-1.33.1

打开静态库编译选项

make menuconfig
Settings --->
 [*] Build static binary (no shared libs) 

 指定编译工具

export ARCH=arm64
export CROSS_COMPILE=aarch64-linux-gnu-

编译

make
make install

编译完成,在busybox目录下生成_install目录。

定制文件系统

为了init进程能正常启动, 需要再额外进行一些配置。

根目录添加etc、dev和lib目录

cd _install

mkdir etc dev lib

在etc分别创建文件:profile、inittab、fstab、init.d/rcS

其中:

1.busybox 作为linuxrc启动后, 会读取/etc/profile, 这里面设置了一些环境变量和shell的属性;

2.根据/etc/fstab提供的挂载信息, 进行文件系统的挂载;

3.busybox 会从 /etc/inittab中读取sysinit并执行, 这里sysinit指向了/etc/init.d/rcS;

4./etc/init.d/rcS 中 ,mdev -s 这条命令很重要, 它会扫描/sys目录,查找字符设备和块设备,并在/dev下mknod。

cd etc
code profile

#!/bin/sh
export HOSTNAME=imingz
export USER=root
export HOME=/home
export PS1="[$USER@$HOSTNAME \W]\# "
PATH=/bin:/sbin:/usr/bin:/usr/sbin
LD_LIBRARY_PATH=/lib:/usr/lib:$LD_LIBRARY_PATH
export PATH LD_LIBRARY_PATH
code inittab

::sysinit:/etc/init.d/rcS
::respawn:-/bin/sh
::askfirst:-/bin/sh
::ctrlaltdel:/bin/umount -a -r
code fstab

#device  mount-point    type     options   dump   fsck order
proc /proc proc defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
sysfs /sys sysfs defaults 0 0
tmpfs /dev tmpfs defaults 0 0
debugfs /sys/kernel/debug debugfs defaults 0 0
kmod_mount /mnt 9p trans=virtio 0 0
mkdir -p init.d
code init.d/rcS

mkdir -p /sys
mkdir -p /tmp
mkdir -p /proc
mkdir -p /mnt
/bin/mount -a
mkdir -p /dev/pts
mount -t devpts devpts /dev/pts
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s

dev目录:

这一步很重要, 没有console这个文件, 用户态的输出没法打印到串口上。

sudo mknod console c 5 1

lib目录:拷贝lib库,支持动态编译的应用程序运行

cp /usr/aarch64-linux-gnu/lib/*.so*  -a .

编译内核

配置内核

linux内核源码可以使用以往lab的。

根据arch/arm64/configs/defconfig 文件生成.config

make defconfig ARCH=arm64

将下面的配置加入.config文件中

CONFIG_DEBUG_INFO=y 
CONFIG_INITRAMFS_SOURCE="./root"
CONFIG_INITRAMFS_ROOT_UID=0
CONFIG_INITRAMFS_ROOT_GID=0

CONFIG_DEBUG_INFO是为了方便调试

CONFIG_INITRAMFS_SOURCE是指定kernel ramdisk的位置,这样指定之后ramdisk会直接被编译到kernel 镜像中。

我们将之前制作好的根文件系统cp到root目录下:

cp -r ../busybox-1.33.1/_install root

执行编译

make ARCH=arm64 Image -j8  CROSS_COMPILE=aarch64-linux-gnu-
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
gettimeofday函数和time函数都可以用于获取当前时间,但它们有一些区别。 1. gettimeofday函数: gettimeofday函数是一个系统调用,用于获取当前时间的秒数和微秒数。它的原型如下: ```c int gettimeofday(struct timeval *tv, struct timezone *tz); ``` 其中,tv是一个指向timeval结构体的指针,用于存储获取到的时间信息。tz是一个指向timezone结构体的指针,用于存储时区信息。但是在实际使用中,通常将tz设置为NULL即可。 2. time函数: time函数是一个库函数,用于获取当前时间的秒数。它的原型如下: ```c time_t time(time_t *t); ``` 其中,t是一个指向time_t类型的指针,用于存储获取到的时间信息。但是在实际使用中,通常将t设置为NULL即可。 区别: 1. 返回值类型不同: - gettimeofday函数返回0表示成功,返回-1表示失败。 - time函数返回当前时间的秒数。 2. 精度不同: - gettimeofday函数可以获取到微秒级别的时间信息。 - time函数只能获取到秒级别的时间信息。 3. 使用方式不同: - gettimeofday函数需要传入一个指向timeval结构体的指针,用于存储获取到的时间信息。 - time函数可以直接返回当前时间的秒数。 范:根据提供的引用内容,可以得出以下结论: gettimeofday函数和time函数都可以用于获取当前时间,但是gettimeofday函数可以获取到微秒级别的时间信息,而time函数只能获取到秒级别的时间信息。此外,gettimeofday函数是一个系统调用,而time函数是一个库函数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值