以time/gettimeofday系统调用为例分析ARM64 Linux 5.4.34

以time/gettimeofday系统调用为例分析ARM64 Linux 5.4.34

准备工作

安装编译工具链

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

sudo apt install gcc-aarch64-linux-gnu

sudo apt install libncurses5-dev  build-essential git bison flex libssl-dev

制作根文件系统

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

编译busybox

类似 lab3

cd ~/linux_lab/lab4

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

extract 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

结果如下

$ ls
bin  dev  etc  lib  linuxrc  sbin  usr
etc

在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 目录,查找字符设备和块设备,并在 /devmknod
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内核源码可以用之前的。

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

cd ~/linux_lab/lab4/linux-5.4.34

make defconfig ARCH=arm64

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

code .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

sudo mknod root/dev/console c 5 1
执行编译

指定 targetImage 增加编译速度, 这样会只编译 kernel, 不会编译 modules。

make ARCH
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在FreeRTOS系统中,由于FreeRTOS是一个嵌入式实时操作系统,它并不直接支持Linux的gettimeofday函数。但是,你可以通过以下步骤在FreeRTOS中使用类似的功能: 1. 首先,在FreeRTOS中创建一个新的任务或者添加到现有任务中。该任务将负责获取时间信息。 2. 在任务中包含头文件 `<sys/time.h>`,这样可以访问到gettimeofday函数的声明。 3. 在任务中调用gettimeofday函数来获取时间信息。 下面是一个示例代码来演示如何在FreeRTOS中使用类似于gettimeofday函数的功能: ```c #include <sys/time.h> void getTimeOfDayTask(void *pvParameters) { struct timeval tv; while (1) { // 获取时间信息 gettimeofday(&tv, NULL); // 在这里处理时间信息,例如输出到串口或者执行其他操作 // ... // 休眠一段时间,例如100ms vTaskDelay(pdMS_TO_TICKS(100)); } } int main() { // 创建一个任务来获取时间信息 xTaskCreate(getTimeOfDayTask, "getTimeOfDayTask", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY + 1, NULL); // 启动FreeRTOS调度器 vTaskStartScheduler(); // 如果一切正常,永远不会执行到这里 return 0; } ``` 在这个示例中,我们创建了一个名为`getTimeOfDayTask`的任务来获取时间信息。在任务中,我们使用`gettimeofday`函数来获取时间信息,并在任务中处理这些信息。任务使用`vTaskDelay`函数来休眠一段时间,以模拟定期获取时间信息的功能。 请注意,由于FreeRTOS是一个实时操作系统,任务的优先级和调度可能会影响时间信息的获取精度。在实际应用中,请根据需要进行适当的配置和调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值