内核记录

1、  内核空间与用户空间是程序执行的两种不同状态,通过系统调用和硬件中断可以完成从用户空间到内核空间的转移。

2、  Linux内核七层架构:系统调用接口、进程管理、内存管理、虚拟文件系统、网络协议栈、体系结构相关代码、硬件驱动

3、  内核源代码:init目录---内核初始化代码,ipc目录---进程间通信的实现代码,kernel目录---大多核心功能的实现功能(进程调度、进程控制、模块化),mm目录---内存管理中与体系结构不相关的代码,net目录---实现网络协议(并不是网卡驱动),scripts目录---配置内核的脚本。

4、  内核模块只会编译成.o文件,而不会连接进zImage。

5、  配置:首先保证对于处理器的配置(processor type and features)正确,然后再对于关心的地方修改一下即可

6、  .config是隐藏文件。Ls –a可以看到

7、  编译应用程序很简单,gcc hello.c –o hello 或者arm-linux-gcc hello.c –o hello即可(sudo –i)

编译内核模块实例(参考国嵌视频内核开发4-1-4):

ifneq ($(KERNELRELEASE),)   如果变量不为空

obj-m := hello.o

else   

KDIR := /lib/modules/2.6.18-53.el5/build(内核源代码路径)

all:

  make -C $(KDIR) M=$(PWD) modules

clean:

        rm -f *.ko *.o *.mod.o *.mod.c *.symvers

endif

此处没指名什么硬件平台,使用什么编译器,对于应用在ARM上的内核模块makefile是否也是这个格式呢?------

编译时如果是X86平台,使用命令make modules

如果是ARM平台,使用命令make modules ARCH=ARM CROSS_COMPILE=arm-linux-

安装insmod hello.ko,卸载rmmod hello(卸载不再加.ko)

8、  模块参数,insmod的时候可以向其传递参数,用法见国嵌视频内核开发4-1-4.2)

9、  内核模块与应用程序的区别:应用程序执行完后退出内存,内核模块在module_exit之前常驻内存

10   输出内核符号,a模块要调用b模块的函数c,需要在b模块中说明EXPORT_SYMBOL(c)

11   内核模块的版本由其所依赖的内核代码版本决定(编译内核时需要在makefile文件中指定所依赖的内核源代码路径),insmod时程序会比较模块版本与正在运行的内核版本,如果不一致会提示出错。查看正在运行的内核版本,使用uname –r命令。

12   内存管理(国嵌4-2-1):CPU将一个逻辑地址转换成物理地址需要经历两步,首先利用段式内存管理单元,将逻辑地址转换成线性地址(即虚拟地址),然后利用页式内存管理单元,将线性地址转换成物理地址。在Linux中,第一步没有变化,只有第二步发生变化。页式管理单元将32位线性地址分成3部分,分别用来查找页目录,页表,页内偏移。每个进程都对应着一个页目录,调用一个进程时,将其基地址送入CR3寄存器,它是分时使用的。

13   Linux进程地址空间(国嵌4-2-2):用户空间对应进程,进程切换,用户空间跟着变化。Linux将4G的虚拟地址划分为俩个部分:用户空间和内核空间。用户空间对应0到3G。用户进程通常只能访问用户空间的虚拟地址,不能访问内核空间。例外情况是用户进程通过系统调用或中断访问内核空间。内核空间由内核负责映射,不随进程切换而发生改变,是固定的。用户空间使用malloc或__get_free_page等函数分配虚拟地址,当真正要去访问时,才通过请页异常分配物理页。内核空间使用kmalloc get_free_page等直接得到物理地址。内核空间3到4G可以划分为直接映射区(由kmalloc分配,与实际物理地址只差3G),动态映射区(由vmalloc分配,映射后的物理地址可能不连续),KMAP区,固定映射区。

14    内核链表(国嵌4-2-3):内核链表与传统链表的区别,双向循环链表,并且指针的指向与传统链表不同。List_head结构体就是向前和向后的指针,每个链表的成员结构体都包含一个list_head结构。初始化链表头:INIT_LIST_HEAD(list_head *head);插入节点:

List_add(list_head *new, list_head *head);删除节点:list_del(list_head *entry);提取数据结构:list_entry(ptr, type, member);遍历list_for_each(list_head *pos, list_head *head),这个宏展开是一个for语句,其中pos是用来接收遍历到的list_head结构的指针。Memset函数用来初始化内存的值。

15、内核定时器(国嵌4-4):时钟中断的频率由常数HZ决定,如1000表示每秒一千次中断。全局变量jiffies(unsigned long)表示系统启动以来时钟中断发生的次数。内核定时器用于控制定时器处理函数在未来某个特定时刻执行一次。内核定时器被组织成双向列表,用struct timer_list描述,其成员和对这个结构体的操作函数参考视频。

16 内核进程(国嵌4-3-1):进程和线程的区别---是否有独立的用户空间;内核中只有线程;进程7种状态;当一个进程运行在用户空间和内核空间是所用的堆栈是不一样的。内核的堆栈7KB左右。线程和进程在内核中都用stast_truct(2.4),thread_info()(2.6)描述;

17 内核调度(国嵌4-3-2):调度策略和调度类(csf公平调度类和实时类,实时类优先级更高);应用程序默认调度策略是SCHED_NORMAL,但是也可以通过系统调用修改;调度方式:主动调度,进程需要等待资源时会修改进程状态,主动让出CPU,调用schedule()函数进行新的的调度;用户抢占和内核抢占(2.6中引入内核抢占),进程处于中断上下文或持有自旋锁,不允许内核强占。内核抢占和用户抢占发生的时间:中断返回或解锁时。调度标志need_resched表明是否需要重新执行一次调度,在进程耗尽其时间片或更高优先级的进程进入可执行状态时,会设置这个标志。

18  系统调用和普通函数调用的区别(国嵌4-3-3),系统调用是一种软中断SWI

19  交叉工具:安装和三个主要工具的使用

20  内核制作与根文件系统制作(国嵌4-4-2,此章节比较重要):嵌入式系统有linux内核和根文件系统俩部分组成,缺一不可。编译基于ARM与X86的内核的区别,以前编译内核时没有注意过;配置内核,make menuconfig(X86),make menuconfig ARCH=arm(ARM);编译内核,make bzImage(X86),make uImage ARCH=arm CROSS_COMPILE=arm-linux-(ARM)

串口下载的命令tft?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值