little kernel 源码分析
文章平均质量分 80
tiantao2012
这个作者很懒,什么都没留下…
展开
-
lk boot bootimg
在aboot.c 中APP_START(aboot).init = aboot_init,APP_END会为aboot_init new 一个thread(前面已经讲过了)void aboot_init(const struct app_descriptor *app){if (keys_get_state(KEY_BACK) != 0)goto fastboot;原创 2016-08-29 11:15:59 · 1170 阅读 · 0 评论 -
lk中的cbuf
lk中默认提供cbuf给大家使用。只要使用下面这三个函数就可create/read/write bufvoid cbuf_initialize(cbuf_t *cbuf, size_t len);size_t cbuf_read(cbuf_t *cbuf, void *_buf, size_t buflen, bool block);size_t cbuf_write(cbuf_t原创 2016-09-16 09:30:33 · 1362 阅读 · 0 评论 -
lk中的ptable
lk中用ptentry来管理flashlayout信息。相关的只有5个函数,我们分别看一下第一个:void ptable_init(struct ptable *ptable){ASSERT(ptable);memset(ptable, 0, sizeof(struct ptable));}仅仅是将ptable中的成员变量清0.实际使用的case如下:p原创 2016-09-16 09:54:02 · 1715 阅读 · 0 评论 -
lk中的partition.c
lk中的partition.c中是讲的是将flashlayout保持在flash中的case,之前我们将的ptable的case是将flashlayout信息buildin到lk中。例如:static struct ptentry board_part_list_sku3[] = {{.start = 0,.length = 10 /* In MB */ ,.name =原创 2016-09-16 10:09:02 · 826 阅读 · 0 评论 -
fastboot 源码分析2
在fastboot中我们一般通过fastboot_register 来注册命令fastboot_register("erase:", cmd_erase);我们来看看fastboot_register的实现static struct fastboot_cmd *cmdlist;void fastboot_register(const char *prefix,原创 2016-08-25 09:42:09 · 2334 阅读 · 0 评论 -
little kernel init
\lk-refs-heads-master\arch\arm\crt0.s_start:b resetb arm_undefinedb arm_syscallb arm_prefetch_abortb arm_data_abortb arm_reservedb arm_irqb arm_fiqcmp r0, r1strlt r2, [r0], #4b原创 2016-08-25 10:41:39 · 883 阅读 · 0 评论 -
thread_create 和 thread_resume
在lk中我们一般通过thread_create 来新建一个thread,但这个thread 是THREAD_SUSPENDED,必须要调用thread_resume才能开始运行enum thread_state {THREAD_SUSPENDED = 0,THREAD_READY,THREAD_RUNNING,THREAD_BLOCKED,THREAD_SLEEPING原创 2016-08-25 11:31:56 · 4435 阅读 · 1 评论 -
thread 切换的判断
lk是按照时间片来运行thread,每个thread 默认运行5个时钟中断,如果时间到了就在timer的中断中做thread 切换。下来我们看看具体的code当我们通过thread_resume来让thread 运行时.会调用thread_yiledvoid thread_yield(void){enter_critical_section();/* we are原创 2016-08-25 15:05:35 · 785 阅读 · 0 评论 -
thread_preempt
可以看到当前remaining_quantum 不等于0,就说明当前有更高优先级的thread抢占了当前的thread所以讲当前thread 插在run queue的前面等下一次运行。否则的话,就是当前thread时间片运行完,加到run queue的后面void thread_preempt(void){#if THREAD_CHECKSASSERT(curren原创 2016-08-25 16:23:51 · 581 阅读 · 0 评论 -
little kernel中如果决定app目录下应该包含哪个app
lk中是会为每个app建立一个thread,所以的app都是放在app这个路径下,那是在哪里决定的呢?一般是通过在project下面的MODULE决定的,例如下面这个例子就只用app下面的aboot这个app\lk-refs-heads-master\projectMODULES += app/aboot原创 2016-08-25 20:01:41 · 765 阅读 · 0 评论 -
little kernel中的memory管理
在lk中通过我们一般通过malloc来申请内存void *malloc(size_t size){return heap_alloc(size, 0);}malloc 直接调用heap_alloc 来申请。lk_main函数中通过调用heap_init来初始由于malloc申请的heapvoid heap_init(void){LTRACE_ENTRY;原创 2016-08-26 09:59:27 · 1834 阅读 · 0 评论 -
lk中默认只能支持32个优先级,为什么呢?
明白原理有就可以support 无线对优先级了。因为在lk中 用于表示有点的bitmap ,static uint32_t run_queue_bitmap;是uint32_t也就是只有32个bit 可以使用我们一般在新建thread 后,将thread 插入到run_queue中时,会设置这个run_queue_bitmap/* run queue manipulation原创 2016-08-26 11:37:22 · 723 阅读 · 0 评论 -
lk中如何决定下一个要运行的thread的?
lk中是根据优先级来选择下一个要运行的thread,如果是同一个优先级就按注册时候的顺序执行。下来我们看看code中的实现.lk中thread 切换时在thread_resched 中进行的,这个可以会在timer函数的interrupt callback函数中调用,或者某个thread 主动调用这个函数放弃cpu。void thread_resched(void)原创 2016-08-26 14:11:34 · 1071 阅读 · 0 评论 -
lk中的bio机制 2
bio中除了可以使用真实的block dev,还可以使用memory中的block dev,这样每次可以读写block count 的数据,加快读写的速度。int create_membdev(const char *name, void *ptr, size_t len){mem_bdev_t *mem = malloc(sizeof(mem_bdev_t));/* se原创 2016-09-16 09:12:29 · 865 阅读 · 0 评论 -
lk中的bio机制 1
bio提供了对block dev的read/read_block/write/write_block/erase/close等操作的封装,采用bio对block dev读写操作的时候不用考虑对齐的问题,bio默认已经处理了这部分。bio的使用比较简单,如下所示void platform_init_blkdev(void){bio_initialize_bdev(&dev, "b原创 2016-09-16 09:02:07 · 921 阅读 · 0 评论 -
fastboot 源码分析1
lk-refs-heads-master\app\aboot下的rules.mk可知OBJS += \$(LOCAL_DIR)/aboot.o \$(LOCAL_DIR)/fastboot.o主要包含aboot.c 和 fastboot.c在aboot.c 中APP_START(aboot).init = aboot_init,APP_ENDaboot_init原创 2016-08-24 20:21:57 · 4757 阅读 · 0 评论 -
lk中的flashlayout
在lk中通过如下方式得到flashlayout的信息ptable = flash_get_ptable();我们看看flash_get_ptable的实现struct ptable *flash_get_ptable(void){return flash_ptable;}仅仅是返回flash_ptable这个全局变量。那这个变量是在哪里赋值的呢?void fla原创 2016-08-29 11:37:45 · 1056 阅读 · 0 评论 -
lk中中断的处理flow
在li的crt0.s 中会定义中断的入口。例如如果是irq中断会调用arm_irq_start:b resetb arm_undefinedb arm_syscallb arm_prefetch_abortb arm_data_abortb arm_reservedb arm_irqb arm_fiq在exception.s 中可见会调用platform原创 2016-08-29 15:53:53 · 1133 阅读 · 0 评论 -
lk中的idle thread
和kernel中的start_kernel一样最后会编程idle,lk中kmain最后也是调用thread_become_idle将自己编程idle threadvoid thread_become_idle(void){thread_set_name("idle");thread_set_priority(IDLE_PRIORITY);idle_thread = curr原创 2016-08-29 16:20:26 · 1369 阅读 · 0 评论 -
lk 之dpc
lk 中实现了让一组函数串行执行,但不需要新建thread的方式,如果用thread的方式就要用mutex 来同步这种机制就是dpc,dpc的code都在dpc.c中我们先看看dpc的initvoid dpc_init(void){event_init(&dpc_event, false, 0);thread_resume(thread_create("dpc",原创 2016-08-29 19:15:42 · 1224 阅读 · 0 评论 -
lk中的timer
kmain中会调用timer_init来初始timer_queue,并通过void timer_init(void){list_initialize(&timer_queue);/* register for a periodic timer tick */platform_set_periodic_timer(timer_tick, NULL, 10); /* 10m原创 2016-08-29 20:08:22 · 1321 阅读 · 0 评论 -
lk对临界区的操作
在lk中当要进入临界区的时候一般会用enter_critical_section 和 exit_critical_section来保护static inline __ALWAYS_INLINE void enter_critical_section(void){critical_section_count++;if (critical_section_count == 1)ar原创 2016-08-30 09:45:56 · 924 阅读 · 0 评论 -
lk中的threadlocal 变量
lk中提供了threadlocal 变量来保存和thread相关联的变量,在new thread的时候可以从父进程继承threadlocal变量在thread结构体变量中是通过tls这个uint32的数组来保存threadlocal 变量的typedef struct thread {/* thread local storage */uint32_t tls[MAX_TLS_原创 2016-08-31 23:16:34 · 617 阅读 · 0 评论 -
lk中的event wait
lk中提供event来协调thread之间的工作,如fastboot中的thread会一直等待usb 给发送event事件后才继续往下走。例如fastboot_init 中会调用event_init来初始化两个event。int fastboot_init(void *base, unsigned size){thread_t *thr;dprintf(INFO, "fastb原创 2016-09-02 09:41:22 · 1492 阅读 · 0 评论 -
lk中的event siganl
在fastboot_init 函数中会注册一个usb的gadgetint fastboot_init(void *base, unsigned size){if (udc_register_gadget(&fastboot_gadget))goto fail_udc_register;}我们来看看fastboot_gadget的实现static void fas原创 2016-09-02 10:04:39 · 1177 阅读 · 0 评论 -
lk中的mutex_t机制
lk中还实现thread对全局资源保护的机制:mutex_t。主要用于对全局变量资源保护.而event 主要用于多thread之间实现这套机制总共就5个函数,我们一个一个看一下mutex_x的初始化函数和event一样,也是每个mutex_t 需要时wait queuevoid mutex_init(mutex_t *m){#if MUTEX_CHECK//原创 2016-09-02 10:37:19 · 1071 阅读 · 0 评论 -
lk中的dprintf实现
在lk中我们一般通过dprintf来打印log,如下所示dprintf(INFO, " 0x%x", t->tls[i]);其中INFO表示log的级别,lk中总共有三种级别/* debug levels */#define CRITICAL 0#define ALWAYS 0#define INFO 1#define SPEW 2继续看dprintf的实现原创 2016-09-15 08:49:30 · 4810 阅读 · 0 评论 -
lk中的bcache机制
bcache 是lk中为block提供的一种使用dram来临时缓存dev中的内容,提高对block的读写速度。使用bcache 来代表一个block的缓存struct bcache {bdev_t *dev;size_t block_size;int count;struct bcache_stats stats;struct list_node free_li原创 2016-09-15 09:59:13 · 922 阅读 · 0 评论 -
lk中的smp
在lk阶段可以实现smp。即将其他cpu都wakeup起来,每个cpu上都可运行,也可是实现调动,这是真正的并行编程.从start.s开始cpu0 和 其他cpu走的不同的flow。smp相关的code都用WITH_SMP 抱起来了 /* stay in supervisor and call into arm arch code to continue setup */原创 2016-10-04 16:13:02 · 1636 阅读 · 0 评论