- 博客(49)
- 收藏
- 关注
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 Linux内核页表管理-那些鲜为人知的秘密
1.开场白环境:处理器架构:arm64内核源码:linux-5.11ubuntu版本:20.04.1代码阅读工具:vim+ctags+cscope通用操作系统,通常都会开启mmu来支持虚拟内存管理,而页表管理是在虚拟内存管理中尤为重要,本文主要以回答几个页表管理中关键性问题来解析Linux内核页表管理,看一看页表管理中那些鲜为人知的秘密。2.页表的作用是什么?1)地址转换将虚拟地址转换为物理地址2)权限管理管理cpu对物理页的访问,如读写执行权限3)隔离地址空间隔离各个进程的地址空
2021-08-02 23:32:31
448
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 深入理解Linux内核之内核抢占
1.开场白环境:处理器架构:arm64内核源码:linux-5.11ubuntu版本:20.04.1代码阅读工具:vim+ctags+cscope我们或许经常听说过内核抢占,可是我们是否真正理解它呢?内核抢占和抢占式内核究竟有什么关系呢?抢占计数器究竟干什么用?… 本文我们就来好好讨论下,关于内核抢占的一些技术细节,力求让大家理解内核抢占。注:本文主要关注CFS调度类。2.内核抢占和抢占式内核我们经常使用uname -a命令能看到“PREEMPT”的字样,没错,我们使用的是抢占式内核。#
2021-08-02 23:00:31
410
原创 Linux内核进程创建-fork背后隐藏的技术细节(下)
上一篇文章我们讲到fork的时候内存管理相关的内容,时间大概隔了快一周了,发布下篇文章,写文章确实费时费力,需要仔细推敲,原创不易,希望大家多多支持吧。本文讲解fork的时候进程管理相关的内容,主要讲解fork的时候进程如何组装调用相关的基础设施组件,以及如何加入运行队列的,调度执行的时候究竟会发生什么。注:这里只讲解cfs调度类,主要关注用户任务3.fork的进程管理3.1 进程相关基础设施构建我们移步到如下调用路径(当前处于sched_fork函数中):kernel_clone //ker
2021-08-02 23:46:54
1096
原创 Linux内核进程创建-fork背后隐藏的技术细节(上)
1.开场白环境:处理器架构:arm64内核源码:linux-5.11ubuntu版本:20.04.1代码阅读工具:vim+ctags+cscope今天正式开通微信公众号-Linux内核远航者,终于以后可以发布Linux内核相关的技术文章,既兴奋又有一份责任感,做技术是个不归路,面对现实的毒打,充满了太多的无奈,也希望能不忘初心,为了纪念公众号的诞生,想了很久决定写一篇进程创建的文章,fork对于Linux开发者已经耳熟能详,但是我们是否真正理解fork的实现机理,当然fork的实现中涉及到了太多
2021-08-02 23:41:42
537
原创 深入理解Linux内核之内核线程(下)
虽然讲解完了内核线程的创建过程,但是似乎又少点什么,那么下面我们来看两个细节:内核线程执行处理函数和内核线程上下文切换细节:7.内核线程执行处理函数细节内核线程执行到处理函数要从fork说起:7.1 fork准备调度上下文kernel_thread //kernel/fork.c->struct kernel_clone_args args = {.stack = (unsigned long)fn, //借用线程栈指针 指向内核线程执行函数.stack_s
2021-08-02 23:26:08
349
原创 深入理解Linux内核之内核线程(上)
1.开场白环境:处理器架构:arm64内核源码:linux-5.11ubuntu版本:20.04.1代码阅读工具:vim+ctags+cscope在linux系统中, 我们接触最多的莫过于用户空间的任务,像用户线程或用户进程,因为他们太活跃了,也太耀眼了以至于我们感受不到内核线程的存在,但是内核线程却在背后默默地付出着,如内存回收,脏页回写,处理大量的软中断等,如果没有内核线程那么linux世界是那么的可怕!本文力求与完整介绍完内核线程的整个生命周期,如内核线程的创建、调度等等,当然本文还是主要
2021-08-02 23:16:31
447
原创 深入理解Linux内核之主调度器(下)
4.进程上下文切换前面选择了一个合适进程作为下一个进程,接下来做重要的上下文切换动作,来保存上一个进程的“上下文”恢复下一个进程的“上下文”,主要包括进程地址空间切换和处理器状态切换。注:这里的上下文实际上是指进程运行时最小寄存器的集合。如果切换的next进程不是同一个进程,才进行切换:__schedule i f (likely(prev != next)) { ... context_switch //进程上下文切换 }4.1 进程地
2021-08-02 22:50:19
230
原创 深入理解Linux内核之主调度器(上)
1.开场白环境:处理器架构:arm64内核源码:linux-5.11ubuntu版本:20.04.1代码阅读工具:vim+ctags+cscope本文步进到Linux内核进程管理的核心部分,打开调度器的黑匣子,来看看Linux内核如何调度进程的。实际上,进程调度器主要做两件事:选择下一个进程,然后进行上下文切换。而何时调用主调度器调度进程那是调度时机所关注的问题,而调度时机在之前的内核抢占文章已经做了详细讲解,在此不在赘述,而本文关注的调度时机是真正调用主调度器的时机。本文分析的内核源代码主
2021-08-02 22:46:57
335
原创 深入理解Linux内核之进程睡眠(下)
4.用户态睡眠以sleep为例来说明任务在用户态是如何睡眠的。首先我们通过strace工具来看下其调用的系统调用:$ strace sleep 1...close(3) = 0clock_nanosleep(CLOCK_REALTIME, 0, {tv_sec=1, tv_nsec=0}, NULL) = 0close(1) = 0...可以发现sleep主要调
2021-08-02 22:40:43
1198
1
原创 深入理解Linux内核之进程睡眠(上)
1开场白环境:处理器架构:arm64内核源码:linux-5.10.50ubuntu版本:20.04.1代码阅读工具:vim+ctags+cscope无论是任务处于用户态还是内核态,经常会因为等待某些事件而睡眠(可能是等待IO读写完成,也可能等待其他内核路径释放一把锁等)。本文来探讨一下,任务处于睡眠中有哪些状态?睡眠对于任务来说究竟意味着什么?内核是如何管理睡眠的任务的?我们会结合内核源代码来分析任务的睡眠,力求全方位角度来剖析。注:由于篇幅问题,文章分为上下两篇,且这里不区分进程和任务,
2021-08-02 22:33:33
588
原创 QEMU体验最新Linux-5.9.2内核
对于Linux爱好者,你是否也有这样的困扰,为了学习Linux而去购买昂贵的开发版,这大可不必,QEMU模拟器几乎可以满足你的需求,足够你去学习Linux,它能够模拟出x86, arm,riscv等各种处理器架构,本文将向你呈现的不是QEMU/虚拟化的原理解读,而是如何搭建一个用于学习linux的QEMU环境,当然对于Linux内核的学习这已经足够了。注意:本文基于最新的linux-5.9.2内核源代码,使用arm64的处理器架构,在ubuntu18.04系统上。本文主要的内容如下:1.交叉编译工具链
2020-11-02 09:27:53
1067
原创 uboot修正设备树(fixup)
说明:源码来自opensource的最新uboot,以sdhc的设备树节点被uboot修改为例说明。调用过程;do_bootm(cmd/bootm.c)//通用命令->do_bootm_subcommand(cmd/bootm.c)->do_bootm_states(common/bootm.c)->bootm_os_get_boot_func() (common/bo...
2018-11-24 15:36:35
2898
原创 使用git从opensource下载最新的uboot和linuxne内核
本文分成两部分讲解,分别是下载最新的uboot和linux内核(使用git工具)。一、下载uboot1.克隆远程uboot git仓库。git clone git://git.denx.de/u-boot.git下载的uboot的默认分支为master,即是我们查看源码的主分支2.拉取更新本地仓库当我们将远程的uboot仓库下载的本地后,一段时间后有可能opensource的仓库的源...
2018-11-24 14:34:36
567
原创 arm处理器快速上下文切换
概述: FCSE(Fast Context Switch Extension,快速上下文切换)位于CPU和MMU之间,如果两个进程使用了同样的虚拟地址空间,则对CPU而言,两个进程使用了同样的虚拟地址空间。快速上下文切换机构对各进程的虚拟地址进行变换,这样系统中除了CPU之外的部分看到的是经过快速上下文切换机构变换的虚拟地址。快速上下文切换机构将各进程的虚拟空间变换成不同的虚拟空间,这样在进行进程
2018-03-23 10:50:11
905
原创 使用telnet登录linux系统
我知道使用串口可以调试arm linux开发板,但是串口很不方便而且不能远程访问,且串口不能打开多个调试串口,那么这个linux系统不能被多个用户共享,也不符合linux的多用户的设计,所以下面介绍telnet连接开发板的方式,采用这种方式能够实现网络多用户同时连接开发板的情况,极大的方便了我们的开发和调试。 说道tenlet,那么什么是telnet呢?其实他就是一个网路的应用层协议,协议是TC...
2018-03-07 19:47:26
8773
原创 arm linux开发板自动配置IP地址
配置内核:[*] Networking support ---> Networking options ---> <*> Packet socket <*> Unix domain sockets [*] TCP/IP networking [*] IP: kernel ...
2018-03-07 18:56:54
4069
原创 交叉编译工具链arm-linux-gcc的安装
由于嵌入式设备的系统资源不如PC那样的富裕,所以在嵌入式设备上提供编译环境非常困难,所以一般在开发主机上进行编辑、编译链接等,然后在目标机上运行,这个过程就叫做交叉编译。编译器是运行在宿主机上(通常都是x86架构的PC机),而编译出来的代码使运行在目标机上的(向我们的arm架构)。 下面讲解交叉编译工具链的安装(这里仅仅讲解安装过程,编译工具链是一个很复杂的过程,网上教程也铺天盖地)。 1.解...
2018-03-07 18:29:25
4832
原创 开源源码下载地址
一。嵌入式系统搭建 0. 交叉编译工具链 如果要自己编译工具链,从以下链接下载源码 crosstools-ng 下载地址 http://ymorin.is-a-geek.org/download/crosstool-ng/ 同时对每一个版本都有相应的补丁我们尽量把这些补丁打上,这些补丁的下载地址是 http://ymorin.is-a-geek.org/download/crossto...
2018-03-07 08:42:29
406
原创 制作ext4文件系统
本文适配fs4412开发板,使用的内核为linux4.9.9。 1.源码下载 从以下地址可以下载到最新的格式化工具: http://down1.chinaunix.net/distfiles/e2fsprogs-1.42.5.tar.gz 2.解压tar xvf e2fsprogs-1.42.5.tar.xz 3.配置 gun的开源软件的配置方式都类似下面的配置方式: 形如:....
2018-03-06 16:26:44
1186
原创 制作ramdisk文件系统
本文适配fs4412开发板,使用的内核为linux4.9.9。 在前面我们使用busybox1.28.1做好了根文件系统,并通过nfs挂载成功。 现在我们制作ramdisk文件系统,啥叫ramdisk呢?ramdisk是将一部分固定大小的内存当做分区来使用(例如8M),他并不是一个实际的文件系统,他是一种将实际的文件系统放在内存的机制,并且可以作为根文件系统来使用。将一些经常被访问不会被更改的...
2018-03-06 15:11:36
2356
原创 最新busybox-1.28.1制作根文件系统
本文适配fs4412开发板,使用的内核为linux4.9.9。 1.源码下载 Busybox的官方源码下载路径为: http://busybox.net/downloads/ 可以下载最新的busybox-1.28.1 2.解压源码tar xvf busybox-1.28.1.tar.bz23.进入源码目录cd busybox-1.28.14.配置busybox ...
2018-03-05 19:50:36
6107
2
原创 Linux4.9.9内核USB移植(适配fs4412平台)
本文适配fs4412开发板,使用的内核为linux4.9.9。修改设备树文件vi arch/arm/boot/dts/exynos4412-liebao.dts添加如下内容:usbphy: usbphy@125B0000 {#address-cells = <1>;#size-cells = <1>;compatible = "samsu...
2018-03-04 21:34:47
1533
原创 移植最新的linux4.9.9内核(适配fs4412平台)
移植最新的linux4.9内核适配fs4412(samsung exynos4412平台验证通过)1.源码下载 官网下载最新的linux4.9.9内核: http://www.kernel.org/pub/linux/kernel/ 第三个数字是修订版本号2.解压tar xvf linux-4.9.9.tar.xz解压也需要时间,需要耐心等待,注意不要打断解压过程。 ...
2018-03-04 15:22:41
5728
1
原创 Linux字符设备驱动模型--字符设备的注册
当我们编写字符设备驱动程序的时候,在进行字符设备对象cdev的分配、初始化,设备号的注册这些初始化阶段之后,就可以将它加入到系统中,这样才能使用这个字符设备。将一个字符设备加入到系统中调用的函数时cdev_add,内核源码如下:int cdev_add(struct cdev *p, dev_t dev, unsigned count){ p->dev = dev; p->coun
2017-12-29 15:51:52
479
2
原创 Linux设备号的构成和分配内核机制
我们知道“Linux下一切皆文件”(当然由于历史原因,网络设备除外,它是通过socket进行操作的),我们操作设备都要通过文件进行操作也就是所所谓的操作设备文件节点,但是在Linux内核中是使用设备号来唯一的识别和管理设备,就相当于公民的省份证号码一样(其实吧,计算机还是喜欢数字的像标识进程使用进程的PID,管理用户使用UID,管理磁盘上的文件使用的inode号,管理网络中的计算机使用IP地址等等)
2017-12-29 14:59:17
2169
1
原创 字符设备cdev的分配和初始化
我们知道注册字符设备首先要有已经分配并初始化好的的cdev,那么就需要内核提供的接口cdev_alloc和cdev_init。下面我们来看看着两个接口是如何实现的: 设备驱动程序中可以使用两种方式来产生struct cdev对象。一种是静态定义的方式,一种是在程序执行期间通过动态分配方式产生: 1.静态定义 static struct cdev chr_dev; 2.动态分配 static
2017-12-29 10:43:25
652
原创 字符设备的内核抽象
Linux内核中处处体现面向对象的设计思想,为了统一形形色色的设备,Linux系统将设备分为三类:字符设备、块设备、网络设备。并将其分别抽象为struct cdev,struct block_device,struct net_devce三个对象,具体的设备都可以包含着三种对象从而继承和三种对象属性和操作,并通过各自的对象添加到相应的驱动模型中,从而进行统一的管理和操作。 顾名思义,字符设备驱动程
2017-12-29 10:03:44
277
原创 浅谈ext2文件系统
我们知道文件系统是组织和管理磁盘上的文件,并向用户提供操作接口(open、read、write等),Unix中的每个对象几乎都可以当做文件来看待。内核在没有结构的硬件上构造结构化的文件系统,而文件抽象在整个系统中广泛使用。Linux支持多种文件系统,如ext2,ext3,vfat等,ext2是符合Linux标准的文件系统。 我们知道,一个磁盘可以划分成多个分区,每个分区必须先用格式化工具(例如某种
2017-12-27 15:38:12
375
原创 内核中inode结构体
在介绍inode结构体之前先做一个链接文件的实验: 1.创建一个普通的文件test.txt,并写入内容查看,如下 2.创建test.txt的硬链接文件,并测试如下: 3.创建test.txt的软连接文件并测试,如下: 4.ls命令查看文件相关信息,如下: 根据现象可以发现,test.txt文件的硬链接文件test_hardlink的inode号和原文件一样,而它的软链接文件
2017-12-27 15:16:10
7763
原创 Mysql数据库的操作(C编程)
Mysql数据库是一种开源的关系型数据库系统(RDBMS),使用常用的数据库管理语言-结构性查询语言(SQL)进行数据库管理. Mysql数据库因为其速度 可靠性和适应性而备受关注.大多数人都认为再不需要事物话的处理情况下,Mysql是管理内容最好的选择. 当然在嵌入式系统中,Mysql数据库也得到了广泛应用. 以下我们将通过具体的C语言代码,详细说明Mysql数据库的操作:
2017-07-16 09:57:48
1213
原创 无法通过ssh登录ubuntu及网络连接问题的解决
经常我们在使用ubuntu的时候经常是把ubuntu安装在pc的虚拟机上然后运行虚拟机上的ubuntu的linux主机.可是有时候ubuntu运行的时候很占系统资源,这时候我们可以通过ssh软件登录ubuntu,然后让其在后台运行.可是有时候我们发现,ssh登录不上ubuntu,通过共享网络也连接不上ubuntu,使用了n种方法也不行. 下面分享下,此问题的解决心得:
2017-06-24 11:22:14
6458
2
原创 软件工程中调试宏的使用(C语言)
在嵌入式实际的开发中,我们经常会使用printf打印来调试我们的代码,终端查看结果等信息.但是正真的产品发布的时候,我并不希望调试信息被打印出来,这个时候就需要我们屏蔽掉我们用于调试的代码段.
2017-06-16 23:01:50
729
原创 C语言可变参数函数
查看printf函数的函数原型,发现形如int printf(const char *format,…)这样的函数声明,不错这就是可变参函数.我们在实际的开发过程中能很少会封装这样的函数,但是我们经常会用到这样的库函数,实际开发过程中当函数的参数事先不能确定下来的时候也需要我们动手封装这样类型的函数.
2017-06-16 22:11:33
283
原创 函数调用堆栈的汇编解析
大家可能都会做过这个的gcc编译过程:gcc -S test.c -o test.s ,通过这样的编译得到的是我们的汇编代码,打开test.s文件会发现都是我们看不懂的汇编指令。也许我们都想过去看看这些汇编代码是什么意思,可是这些晦涩难懂的汇编代码,又让我们望洋兴叹。我们都知道函数的形参是放在栈区的,函数调用必须需要栈,可是编译器究竟是怎样为我们分配栈区的呢?
2017-02-15 10:15:37
1219
原创 驱动中使用内核链表
前面我们详细介绍了如何实现内核链表,实际上内核中已经为我们实现了内核链表,给我提供了一些操作内核链表的API,接下来我们将在驱动模块中使用内核链表。
2016-12-31 17:02:37
516
原创 通用(内核)链表详解
Linux内核中充斥着大量的数据结构,这些数据结构很多都是使用结构体来表示:如cdev结构体用于描述一个字符设备,再如task_struct结构体,是我们所说的进程控制块PCB,用于描述一个进程的所有信息。追寻内核源码我们会发现很多都是表示设备的结构体中都有list_head这样的字段,没错这就是内核链表的节点类型。描述设备的结构体中只要包含这个字段,内核就能通过链表来管理我们的设备,试想浩瀚的内核
2016-12-31 16:21:52
9186
2
原创 Linux下的UDP编程
对比与TCP来说,我们知道UDP是面向无连接的而且不可靠的通信,它适合传输数据量不大的数据且对数据的可靠性要求不高,由于它是无连接的所以它的数据传输效率比较高,也适合也对实时性要求较高的场合如:音视频的聊天等. 本文将介绍在Linux下如何对UDP进行编程,全文通过代码加注释的形式进行讲解.
2016-10-24 22:36:47
426
原创 Linux下的基本命令详解
Linux系统不像windows系统那样图形界面做的那么美观漂亮,点击图标即可,Linux下都是使用命令行的形式来和系统进行交互(当然也有图形界面,只是做的不是那么完善),使用Linux命令相比而言还是比较方便的。我们知道windows使用的命令行的方式是DOS命令,Linux下是使用的命令则是shell命令,每一条命令都会被shell命令行解释器解析执行的。 以下将带领大家学习
2016-10-21 13:23:30
4067
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人