linux_kernel
groundhappy
这个作者很懒,什么都没留下…
展开
-
linux从上电到到启动流程简要过程以及关键函数
linux 4.1.xARM上电。执行BOOTLOADERbootloader加载kernel 。传递参数给kernel 然后执行kernel设置一些寄存器,初始化一些状态等等。然后跳到head.s执行head.s已经属于kernel的部分了head.s主要是硬件相关的部分,解压kernel等等。最终跳转到start_kernel里面执行start_kernel原创 2016-04-04 12:33:56 · 1782 阅读 · 0 评论 -
qemu启动Busybox和内核
尝试用qemu启动busybox以及内核。方便学习内核的代码和内部的流程。主机x86_64linux-3.13.1.tar.gzqemu-2.8.0.tar.xzbusybox-1.25.0.tar.bz21编译qemucd qemu-2.8.0./configuremake -j4sudo make install原创 2017-02-23 13:30:08 · 2691 阅读 · 0 评论 -
linux的rootfs解析和挂载
这里开始看rootfs的挂载流程,也就是root="/dev/xxxxxx"这样的指示,如何让内核启动rootfs。常常看到 root=/dev/sd1 root=/dev/mmcblk01这样的在内核中有很多 __setup定义的宏。主要用来处理commdline启动项参数在init/do_mount.s中static int __init root_dev_setup(原创 2017-02-23 17:18:06 · 1809 阅读 · 0 评论 -
搜索linux的sys_call调用
linux系统中用SYSCALL_DEFINEx来定义系统调用#define SYSCALL_DEFINE1(name, ...) SYSCALL_DEFINEx(1, _##name, __VA_ARGS__)#define SYSCALL_DEFINE2(name, ...) SYSCALL_DEFINEx(2, _##name, __VA_ARGS__)#define SYS原创 2017-02-27 13:45:21 · 562 阅读 · 0 评论 -
关于根文件系统挂载好的文章链接
http://www.cnblogs.com/shangye/p/6260471.htmlhttp://blog.csdn.net/luomoweilan/article/details/17894473原创 2017-02-27 14:09:27 · 319 阅读 · 0 评论 -
内核运行编译问题集中注意
问题1 readl和writel的定义之前由于自己定义了一个readl出现的错误#define readl(addr) *(unsigned int*)(addr)while(readl(xxxx));也就是不停读取xxx地址的值。如果不是0.那么跳出循环,一般用于读取物理硬件寄存器由于编译器认为读取的xxx的地址没有变化以及优化的问题。可能最终会优化成原创 2017-03-07 08:41:27 · 535 阅读 · 0 评论 -
mdesc的匹配过程
在setup_arch中调用setup_machine_fdt来匹配最合适的mdescmdesc = setup_machine_fdt(__atags_pointer);__atags_pointer为dtb的地址其中调用of_flat_dt_match_machine--->of_flat_dt_match_machine 来匹配所有的mdesc都是用DT_MACHIE原创 2017-03-10 11:44:38 · 692 阅读 · 0 评论 -
linux kernel自己使用串口格式化输出
使用early_printk 有一部分可能是需要汇编编写的。使用printk打印,需要等待串口初始化完毕了才可以,否则数据是写在缓冲区当中的。所以决定结合之前的 串口,自己分析编写一个内核即时通过串口输出的函数,后续如果初始化了串口,能够正常打印了,我们就不再使用自己的这个。因为start_kernel的时候栈已经设置好了。所以根本没有必要使用汇编实现。要求是A 方原创 2017-02-07 16:29:27 · 2146 阅读 · 0 评论 -
ARM Linux启动流程分析——start_kernel前启动阶段(汇编部分)
本文转载自http://blog.csdn.net/luckyapple1028/article/details/45287617本文整理了ARM Linxu启动流程的第二阶段——start_kernel前启动阶段(汇编部分),内核版本为3.12.35。我以手上的树莓派b(ARM11)为平台示例来分析Linux内核在自解压后到跳转运行start_kernel之前所做的主转载 2017-03-07 09:00:10 · 1224 阅读 · 0 评论 -
linux 设备树和atags
linux接受参数有两种方式。一种是ATAGS一种是DTBATAGS是传统的方式,传递命令行等等信息。DTB是传递了更多的硬件信息。ATAG通过启动将各种参数打包成ATAG_TAG标记传递信息。而DTB则是通过可描述的DTSI编译成DTB块。将DTB和ATAG放到内存当中。通过寄存器R2参数传递地址给linuxkernel进行解析。如果配原创 2017-02-27 10:18:48 · 3804 阅读 · 0 评论 -
JLINK+ECLIPSE 调试树莓派
树莓派的JTAG口 没有直接调出来。需要用代码控制芯片开启。http://sysprogs.com/VisualKernel/tutorials/raspberry/jtagsetup/可以在uboot中cmd执行的里面写入下面的代码void SetGPIOFunction(int GPIO, int functionCode){int regist原创 2016-11-20 17:31:17 · 4995 阅读 · 0 评论 -
kernel的console_init和printk
linux kernel在start_kernel里面调用console_init执行控制台的初始化。使用printk执行打印。但是在console_init之前有一部分printk。需要在console_init之后才能打印出来,也就是说之前prinkt的数据都保存在了一个缓冲区内,等到console_init以后才打印出来。console_init的执行流程在/drivers/原创 2017-01-22 10:37:35 · 3179 阅读 · 0 评论 -
linux内核的make modules 有什么用
硬件有许许多多的驱动。如果把所有的驱动都在编译内核的时候就指定编译到内核里面那么内核会非常大。所有编译内核的时候只编译一部分通用常用的驱动。这些驱动在linux内核配置的时候指定为*还有一些驱动被指定为M 编译。但是没有安装。这些模块可以放到rootfs里面去。等真正需要的时候再加载。这些就是通过make modules和modules_install完成的。原创 2016-04-18 21:21:04 · 9562 阅读 · 0 评论 -
检查lfs从内核到到第一个进程init是否成功
当系统从bootloader传递参数到linux的start_kernel一般内核里面不会出什么BUG。主要是上层构建的rootfs有没有问题。即使内核里面出了问题,也会在串口提示。也可以通过打log来跟踪 一步步到哪里出问题了。使用printk 打印内核日志。可以很快定位到哪里出了问题。一般最后内核会运行到kernel_init尝试运行init进程原创 2016-04-21 21:47:34 · 1094 阅读 · 0 评论 -
Linux内核源码分析--zImage出生实录(Linux-3.0 ARMv7)
转载自http://blog.chinaunix.net/uid-20543672-id-3018947.htmltekkamanninja.blog.chinaunix.net 此文为两年前为好友刘庆敏的书《嵌入式Linux开发详解--基于AT91RM9200和Linux 2.6》中帮忙写的章节的重新整理。如有雷同,纯属必然。经作者同意,将我写的部分重新整转载 2016-11-11 15:56:55 · 392 阅读 · 0 评论 -
本文整理了ARM Linxu启动流程的第一阶段——内核自解压
本文转载自http://blog.csdn.net/luckyapple1028/article/details/44726131本文整理了ARM Linxu启动流程的第一阶段——内核自解压,内核版本为3.12.35。我以手上的树莓派b(ARM11)为平台示例来分析uboot跳转到Linux内核运行后做了哪些初始化动作,以及如何转入真正的内核开始运行。转载 2016-11-25 10:34:46 · 1645 阅读 · 0 评论 -
mmu以及页表 UBOOT(1)
mmu的主要作用就是实现进程隔离主要功能是1 虚拟地址到物理地址的转换访问某个进程1的虚拟地址A。mmu转换为物理地址B访问。访问某个进程2的虚拟地址A。mmu转换为物理地址C的访问。保证不同空间上的同一个虚拟地址访问映射到不同的物理内存。2 内存权限控制的实现在页表项中将某些不需要的bit项变成访问控制位,控制内存的访问。在ARM中使用CP15协处原创 2017-02-06 15:21:08 · 2410 阅读 · 0 评论 -
mmu以及页表 linuxkernel(2)
对于mmu的作用,参看第一篇的介绍这里讲linux kenel的mmu和页表linux有两次页表处理第一次是在arch/arm/kernel/head.s里面第二次是是在start_kernel以后还有其他的一些io地址映射第一次在arch/arm/kernel/head.s/* * Setup the initial page tables.原创 2017-02-06 18:34:10 · 2073 阅读 · 0 评论 -
linux kernel 自解压部分的一点解释
关于自解压部分的逻辑和代码详解参看http://blog.csdn.net/luckyapple1028/article/details/44726131写得非常好,但是貌似还有一点点小错误。本文部分文字引用自这篇文章。还有几点可能需要后续解释的先记录一下 ldr r4, =zreladdr /* * Set up a page table only if原创 2017-02-09 15:19:15 · 1501 阅读 · 0 评论 -
uboot到kernel启动需要注意的内存
kernel的加载地址通常在0x8000,一般利用0x4000-0x8000作为页表。主要就是(atag或者dtb)的内存不要和uboot和kernel的空间重叠。所以要注意几个内存搬移1uboot将自己拷贝到ram中的内存搬移2kernel uncompress阶段判断解压后的地址空间和当前img是否重叠,如果重叠会进行一次搬移。3uncomp原创 2017-02-09 15:34:28 · 2930 阅读 · 0 评论 -
linux 中断(一)
对于arm的设备,有七个异常中断向量+一个保留向量一共8个。是按照顺序排列的。每个向量地址对应一个字大小的空间用于跳转到特定的处理函数。1 复位向量 0X00000000/0XFFFF00002 未定义指令终止向量 0X00000004/0XFFFF00043SWI向量 0X000000原创 2017-01-19 16:57:18 · 737 阅读 · 1 评论