![](https://img-blog.csdnimg.cn/20201014180756923.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
linux内核
天麓
很懒的码农
展开
-
慢慢欣赏arm64内核启动18 primary_entry之__create_page_tables代码第五部分
【代码】慢慢欣赏arm64内核启动18 primary_entry之__create_page_tables代码第五部分。原创 2024-08-24 15:43:32 · 879 阅读 · 0 评论 -
慢慢欣赏arm64内核启动17 primary_entry之__create_page_tables代码第四部分map_memory剩下的流程
其中,表项的属性由 PMD_TYPE_TABLE 定义,rtbl 只定义了下一级页表的第一个页表起始地址,那么下一级页表的后续页表的起始地址需要根据 rtbl + n * PAGE_SIZE 而定。接着第7行,根据第6行,将 对应的下一级页表的物理地址 rtbl 填写到 本级页表也就是全局页表的表项,区间为 [start, iend],count 为0,表示全局页表的表项只在一个页表里面,不可能跨页表,当然 count 也当出参,统计全局页表的表项数目。n 代表第n个页表,n的范围为 [0, count)原创 2024-08-20 08:44:34 · 550 阅读 · 0 评论 -
慢慢欣赏arm64内核启动16 primary_entry之__create_page_tables代码第四部分populate_entries
我们没有使能 CONFIG_ARM64_PA_BITS_52,而是使能了 CONFIG_ARM64_PA_BITS_48,所以该宏就是把 rtbl,也就把是下一级的页表物理地址存放在 tmp1 里面。第19行将 tmp1 与 flags 进行或操作,也就是说,将页表基地址与页表属性组合在一起,由于页表基地值的有效位和页表属性的有效位在不同的位域里面,所以可以认为是缝合在一起。第1行到第16行时注释,大概意思是填充页表项,当前页表的每个页表项的内容是下一级页表的物理地址,所以牵扯到本级页表和下级页表。原创 2024-08-19 07:57:04 · 466 阅读 · 0 评论 -
慢慢欣赏arm64内核启动15 primary_entry之__create_page_tables代码第四部分compute_indices
第三个参数 shift 入参, 将虚拟地址转换为索引需要偏移的位数,调用者传过来的参数是 PGDIR_SHIFT,该参数我们在以前的章节中分析过,为39。第二个参数 vend 入参,虚拟地址的结束地址,在上一章节中我们是将 vend 自减1的,恰好符合注释描述的区间概念,否则就多分配了一个页表项。对于全局页表来说,最多就一个页,不会超过512,但是后面级别的页表就不好说了,只要全局页表的有效索引超过1,下一级的页表肯定是跨多个页表。根据注释,出参统计有效页表项的数目,包括了跨多个页表的场景。原创 2024-08-18 08:50:40 · 340 阅读 · 0 评论 -
慢慢欣赏arm64内核启动14 primary_entry之__create_page_tables代码第四部分map_memory
第二个参数 rtbl 是下一级页表的起始地址,根据刚才的描述,下一级页表的起始地址其实是不用传达的,注释也做了说明,由于全局目录只占有1个页面,所以在函数的内部是通过 tbl + PAGE_SIZE 传递的。第九个参数 iend,注释里没有说明,根据意思以及上下文代码的实现,应该是 index of end 的缩写,就是下一级页表的终止地址在该级页表的索引值,由于可能存在多个页表的可能性,第十二个参数 sv,也是出参,对应 x14,也是 临时变量,用于存储计算出来的下一级页表的起始物理地址。原创 2024-08-17 16:42:31 · 891 阅读 · 0 评论 -
慢慢欣赏arm64内核启动13 primary_entry之__create_page_tables代码第三部分
所以最终 PGDIR_SHIFT 的值为 ((PAGE_SHIFT - 3) * 4 + 3) == 39这就是 L0 索引的偏移PTRS_PER_PGD 的值为 1原创 2024-08-17 15:18:41 · 639 阅读 · 0 评论 -
慢慢欣赏arm64内核启动12 primary_entry之__create_page_tables代码第二部分
【代码】慢慢欣赏arm64内核启动12 primary_entry之__create_page_tables代码第二部分。原创 2024-08-11 15:35:36 · 277 阅读 · 0 评论 -
慢慢欣赏arm64内核启动11 primary_entry之__create_page_tables代码第一部分
【代码】慢慢欣赏arm64内核启动11 primary_entry之__create_page_tables代码第一部分.txt。原创 2024-08-10 10:14:28 · 308 阅读 · 0 评论 -
慢慢欣赏arm64内核启动10 primary_entry之set_cpu_boot_mode_flag
上面的文章我们分析完毕el2_setup函数,该函数虽长但不啰嗦。主要作用就是如果bootloader把控制权交给内核时,如果内核是EL1异常模式,则按照EL1模式初始化一些系统寄存器,然后返回w0为EL1;如果内核当前为EL2模式,则判断硬件是否支VHE,如果不支持,则切换到EL1;如果支持,则继续以EL2模式启动,这两种情况返回w0均为EL2。原创 2024-08-10 08:49:34 · 335 阅读 · 0 评论 -
慢慢欣赏arm64内核启动9 primary_entry之el2_setup代码第七部分
【代码】慢慢欣赏arm64内核启动9 primary_entry之el2_setup代码第七部分。原创 2024-08-07 13:53:50 · 63 阅读 · 0 评论 -
慢慢欣赏arm64内核启动8 primary_entry之el2_setup代码第六部分
【代码】慢慢欣赏arm64内核启动8 primary_entry之el2_setup代码第六部分。原创 2024-08-06 13:43:59 · 668 阅读 · 0 评论 -
慢慢欣赏arm64内核启动7 primary_entry之el2_setup代码第五部分
【代码】慢慢欣赏arm64内核启动7 primary_entry之el2_setup代码第五部分。原创 2024-08-06 08:51:25 · 561 阅读 · 0 评论 -
慢慢欣赏arm64内核启动6 primary_entry之el2_setup代码第四部分
【代码】慢慢欣赏arm64内核启动6 primary_entry之el2_setup代码第四部分。原创 2024-08-02 18:48:19 · 156 阅读 · 0 评论 -
慢慢欣赏arm64内核启动5 primary_entry之el2_setup代码第三部分
解析完虚拟化部分,我们继续分析启动过程中,对中断控制器的处理。原创 2024-08-02 05:15:52 · 445 阅读 · 0 评论 -
慢慢欣赏arm64内核启动4 primary_entry之el2_setup代码第二部分
el2_setup继续执行就到了EL2异常等级的虚拟化部分的解析和处理部分。原创 2024-07-30 13:46:43 · 308 阅读 · 0 评论 -
慢慢欣赏arm64内核启动3 primary_entry之el2_setup代码第一部分
分析完el2_setup的注释和代码段的位置之后,我们正式开始学习el2_setup的实现。原创 2024-07-30 08:39:44 · 166 阅读 · 0 评论 -
慢慢欣赏arm64内核启动2 primary_entry之el2_setup注释部分
primary_entry执行完保存参数的函数后,进入el2_setup函数查看调用函数的注释,含义是切换到EL1模式,出参为w0,保存进入内核时的异常等级。看到这个注释,我联想起异常返回章节的通过sppr_elX和elr_elX切换异常等级的方法,我们分析代码看看是否这样实现的。该函数较长,我们分段进行欣赏。原创 2024-07-29 07:47:56 · 164 阅读 · 0 评论 -
慢慢欣赏arm64内核启动1 primary_entry之保存启动参数
根据上一章节,bootloader将控制权交给内核,内核从__HEAD段的开头执行。该段的起始位置是_head。原创 2024-07-28 17:46:09 · 244 阅读 · 0 评论 -
慢慢欣赏arm64内核启动0 链接脚本.head.text部分的解析
HEAD_TEXT是指什么呢?我们搜索一下内核源码。原创 2024-07-24 08:41:46 · 136 阅读 · 0 评论 -
慢慢欣赏 ftrace (二)进程和中断状态填充方法
【代码】慢慢欣赏 ftrace (二)进程和中断状态填充方法。原创 2024-01-09 18:57:54 · 412 阅读 · 0 评论 -
慢慢欣赏 ftrace (一)找到解析function对应字段的函数
对于5.10内核,我们找到其对应函数 trace_print_context,该函数可以仔细研读。分析ftrace的时候,有时会对其字段部分不了解,有些字段解析的不清晰,例如D和~原创 2024-01-03 10:22:42 · 428 阅读 · 0 评论 -
慢慢欣赏linux 内核启动时将core0设置为自适应滴答模式失效
linux 4.19内核使能CONFIG_NO_HZ_FULL编译选项,生成内核之后,在bootloader启动参数指定core 0,4,5,6,7为自适应滴答模式,内核启动之后,发现core0并没有生效。查看内核日志,确认内核将core设置为自适应滴答模式之前,会将启动核core0剔除掉。有利于提高xenomai/PREEMPT-RT 实时性的一些配置建议。NO_HZ: 减少调度时钟的滴答。原创 2023-10-31 17:09:54 · 223 阅读 · 0 评论 -
慢慢欣赏linux 内核安装ko到指定的目录
linux内核安装ko到指定的目录原创 2022-10-08 17:31:10 · 1393 阅读 · 0 评论 -
查看软中断变化情况 linux性能优化学习之二
watch -d "/bin/cat /proc/softirqs | /usr/bin/awk 'NR == 1{printf \"%-15s %-15s %-15s %-15s %-15s\n\",\" \",\$1,\$2,\$3,\$4}; NR > 1{printf \"%-15s %-15s %-15s %-15s %-15s\n\",\$1,\$2,\$3,\$4,\$5}'"结果Every 2.0s: /bin/cat /proc/softirqs | /usr/bin/a.原创 2022-05-29 06:54:25 · 417 阅读 · 0 评论 -
慢慢欣赏linux 查看系统时钟信息
rlk@rlk:~$ sudo cat /proc/timer_list [sudo] password for rlk: Timer List Version: v0.8HRTIMER_MAX_CLOCK_BASES: 8now at 53391840158 nsecscpu: 0 clock 0: .base: ffff8a4639c1dfc0 .index: 0 .resolution: 1 nsecs .get_time: ktime_get.原创 2022-05-22 12:03:33 · 507 阅读 · 0 评论 -
慢慢欣赏linux pud_index和pud_page解析
#define pud_index(addr) (((addr) >> PUD_SHIFT) & (PTRS_PER_PUD - 1)) =>#define PUD_SHIFT ARM64_HW_PGTABLE_LEVEL_SHIFT(1) =>#define ARM64_HW_PGTABLE_LEVEL_SHIFT(n) ((PAGE_SHIFT - 3) * (4 - (n)) + 3) => 29 =>#define PTRS_PER_P.原创 2022-04-15 08:05:14 · 394 阅读 · 0 评论 -
慢慢欣赏linux pud_offset解析
typedef struct { pudval_t pud; } pud_t; =>typedef u64 pudval_t;#define pud_offset(dir, addr) ((pud_t *)__va(pud_offset_phys((dir), (addr)))) { =>#define pud_offset_phys(dir, addr) (pgd_page_paddr(READ_ONCE(*(dir))) + pud_index(addr) * sizeof(pu.原创 2022-04-13 06:48:06 · 623 阅读 · 0 评论 -
慢慢欣赏linux pgd_page解析
typedef struct { pgdval_t pgd; } pgd_t;#define pgd_page(pgd) pfn_to_page(__phys_to_pfn(__pgd_to_phys(pgd))){ =>#define __pgd_to_phys(pgd) __pte_to_phys(pgd_pte(pgd)) { =>static inline pte_t pgd_pte(pgd_t pgd) { return __pte(pgd_val.原创 2022-04-12 08:03:47 · 430 阅读 · 0 评论 -
慢慢欣赏linux 内核镜像剖析
linux kernel 5.0内核elf信息rlk@rlk:runninglinuxkernel_5.0$ readelf -h vmlinuxELF Header: Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 Class: ELF64 Data: 2's complement, little endi原创 2022-02-19 07:16:32 · 393 阅读 · 0 评论 -
慢慢欣赏linux 网络协议栈二 net_device以及初始化注册 (4.19版本)
XXX$ ls /proc/net/anycast6 dev fib_trie icmp6 igmp6 ip6_mr_vif ip_tables_matches ipv6_route netfilter packet ptype route rt_cache sockstat stat udp udplite6 xfrm_statarp dev_mcast fib_trie...原创 2022-01-25 15:15:07 · 2480 阅读 · 0 评论 -
慢慢欣赏linux 网络协议栈四 sk_buff以及数据收发
以3c359x.c的网卡为例,因为这是《深入理解Linux网络技术内幕》里面的例子irqreturn_t vortex_interrupt(int irq, void *dev_id) vortex_rx(dev); =>int vortex_rx(struct net_device *dev) struct vortex_private *vp = netdev_priv(d...原创 2019-03-31 08:06:05 · 1009 阅读 · 1 评论 -
慢慢欣赏linux之串口驱动代码分析 - 基于arm64 4.19.x版本
root@linux:~# uname -aLinux bogon 4.19.115 #25 SMP PREEMPT Fri Oct 15 10:46:25 CST 2021 aarch64 aarch64 aarch64 GNU/Linuxtty驱动框架分析https://blog.csdn.net/qq_37600027/article/details/84504042Linux设备模型之tty驱动架构分析https://blog.csdn.net/pan0755/article/de原创 2021-10-15 13:53:02 · 981 阅读 · 0 评论 -
编译内核报错 bison not found
$ make defconfig YACC scripts/kconfig/zconf.tab.c/bin/sh: 1: bison: not foundmake[1]: *** [scripts/Makefile.lib:196:scripts/kconfig/zconf.tab.c] 错误 127make: *** [Makefile:534:defconfig] 错误 2$ sudo apt install bison flex正在读取软件包列表... 完成正在分析软件包的依赖关...原创 2021-09-08 13:36:03 · 5886 阅读 · 0 评论 -
慢慢欣赏linux 中断学习之外部中断 arm glcv3虚实中断映射
对于linux开发者来说,单板上设备如果有中断,主要的工作有3步.第一步: 添加设备树的描述, 定义实中断号;第二步: 进行虚实中断映射;第三步: 申请中断通过下面的例子进行说明原创 2021-05-30 10:08:45 · 490 阅读 · 1 评论 -
慢慢欣赏linux 中断学习之外部中断 arm glcv3控制器初始化
int __init gic_of_init(struct device_node *node, struct device_node *parent){ gic_init_bases(dist_base, rdist_regs, nr_redist_regions, redist_stride, &node->fwnode); =>int __init gic_init_bases(void __iomem *dist_base, struct redist_regi.原创 2021-05-30 08:49:06 · 155 阅读 · 1 评论 -
慢慢欣赏linux 中断学习之外部中断 arm实现
void __init init_IRQ(void){ if (IS_ENABLED(CONFIG_OF) && !machine_desc->init_irq) irqchip_init(); else machine_desc->init_irq(); ==>{ DT_MACHINE_START(CNS3XXX_DT, "Cavium Networks CNS3xxx") .dt_compat = cns3xxx_dt_compat,.原创 2021-05-02 23:19:16 · 203 阅读 · 0 评论 -
中断学习之基本数据结构
CONFIG_IRQTACKS决定中断栈是独立的还是依附于内核栈。irq_desc {irq_flow_handler_t handle_irq;;中断处理函数,会调用ISR irq_chip;//中断控制器对象,抽象不同种类的PIC,例如8259控制器 irqaction *action;//共享中断链表,中断例程ISR}关系可以通过中断处理程序...原创 2018-06-12 15:27:01 · 192 阅读 · 0 评论 -
慢慢欣赏linux 继续深入学习x86中断3 pch中断
int pch_gpio_probe(struct pci_dev *pdev, const struct pci_device_id *id){ struct pch_gpio *chip = kzalloc(sizeof(*chip), GFP_KERNEL); int irq_base; chip->dev = &pdev->dev; ret = pci_enable_device(pdev); ret = pci_request_regions.原创 2021-05-01 12:24:36 · 257 阅读 · 0 评论 -
慢慢欣赏linux 中断描述符
unsigned int __irq_entry do_IRQ(struct pt_regs *regs){ desc = __this_cpu_read(vector_irq[vector]); 根据硬中断号找到中断描述符}以RTC时钟中断注册为例static int mtk_rtc_probe(struct platform_device *pdev){ struct resource *res; struct mt6397_chip *mt6397_chip = dev_get.原创 2021-04-24 17:19:31 · 263 阅读 · 0 评论 -
慢慢欣赏linux 继续深入学习x86中断
linux驱动中断不能睡眠的原因http://blog.chinaunix.net/uid-24866549-id-4611653.html内核IRQ中断向量https://blog.csdn.net/sinat_20184565/article/details/98095894x86架构下Linux中断IDT建立及中断处理过程之1 博客不错https://blog.csdn.net/baidu_31504167/article/details/100556391x86架构下L...原创 2021-04-18 18:53:20 · 557 阅读 · 0 评论